Flush and invalidate cache on closing handle

This commit is contained in:
Jason Hood 2018-02-12 21:49:43 +10:00
parent af2c31c466
commit 0366daad05

24
ANSI.c
View File

@ -2549,6 +2549,7 @@ const char APIProcessThreads[] = "API-MS-Win-Core-ProcessThreads-";
const char APIProcessEnvironment[] = "API-MS-Win-Core-ProcessEnvironment-"; const char APIProcessEnvironment[] = "API-MS-Win-Core-ProcessEnvironment-";
const char APILibraryLoader[] = "API-MS-Win-Core-LibraryLoader-"; const char APILibraryLoader[] = "API-MS-Win-Core-LibraryLoader-";
const char APIFile[] = "API-MS-Win-Core-File-"; const char APIFile[] = "API-MS-Win-Core-File-";
const char APIHandle[] = "API-MS-Win-Core-Handle-";
typedef struct typedef struct
{ {
@ -2564,6 +2565,7 @@ API_DATA APIs[] =
{ APIProcessEnvironment, sizeof(APIProcessEnvironment) - 1, NULL }, { APIProcessEnvironment, sizeof(APIProcessEnvironment) - 1, NULL },
{ APILibraryLoader, sizeof(APILibraryLoader) - 1, NULL }, { APILibraryLoader, sizeof(APILibraryLoader) - 1, NULL },
{ APIFile, sizeof(APIFile) - 1, NULL }, { APIFile, sizeof(APIFile) - 1, NULL },
{ APIHandle, sizeof(APIHandle) - 1, NULL },
{ NULL, 0, NULL } { NULL, 0, NULL }
}; };
@ -3569,6 +3571,27 @@ WINAPI MyCreateConsoleScreenBuffer( DWORD dwDesiredAccess, DWORD dwShareMode,
lpScreenBufferData ); lpScreenBufferData );
} }
BOOL
WINAPI MyCloseHandle( HANDLE hObject )
{
int c;
EnterCriticalSection( &CritSect );
FlushBuffer();
for (c = 0; c < CACHE; ++c)
if (cache[c].h == hObject)
{
cache[c].h = INVALID_HANDLE_VALUE;
break;
}
LeaveCriticalSection( &CritSect );
return CloseHandle( hObject );
}
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// My... // My...
@ -3731,6 +3754,7 @@ HookFn Hooks[] = {
HOOK( APIFile, CreateFileA ), HOOK( APIFile, CreateFileA ),
HOOK( APIFile, CreateFileW ), HOOK( APIFile, CreateFileW ),
HOOK( APIKernel, CreateConsoleScreenBuffer ), HOOK( APIKernel, CreateConsoleScreenBuffer ),
HOOK( APIHandle, CloseHandle ),
HOOK( APIKernel, FillConsoleOutputAttribute ), HOOK( APIKernel, FillConsoleOutputAttribute ),
HOOK( APIKernel, FillConsoleOutputCharacterA ), HOOK( APIKernel, FillConsoleOutputCharacterA ),
HOOK( APIKernel, FillConsoleOutputCharacterW ), HOOK( APIKernel, FillConsoleOutputCharacterW ),