From 0366daad05a157b73ce3641ed3041e4a5c3e22e6 Mon Sep 17 00:00:00 2001 From: Jason Hood Date: Mon, 12 Feb 2018 21:49:43 +1000 Subject: [PATCH] Flush and invalidate cache on closing handle --- ANSI.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/ANSI.c b/ANSI.c index f5c2172..75e3ca7 100644 --- a/ANSI.c +++ b/ANSI.c @@ -2549,6 +2549,7 @@ const char APIProcessThreads[] = "API-MS-Win-Core-ProcessThreads-"; const char APIProcessEnvironment[] = "API-MS-Win-Core-ProcessEnvironment-"; const char APILibraryLoader[] = "API-MS-Win-Core-LibraryLoader-"; const char APIFile[] = "API-MS-Win-Core-File-"; +const char APIHandle[] = "API-MS-Win-Core-Handle-"; typedef struct { @@ -2564,6 +2565,7 @@ API_DATA APIs[] = { APIProcessEnvironment, sizeof(APIProcessEnvironment) - 1, NULL }, { APILibraryLoader, sizeof(APILibraryLoader) - 1, NULL }, { APIFile, sizeof(APIFile) - 1, NULL }, + { APIHandle, sizeof(APIHandle) - 1, NULL }, { NULL, 0, NULL } }; @@ -3569,6 +3571,27 @@ WINAPI MyCreateConsoleScreenBuffer( DWORD dwDesiredAccess, DWORD dwShareMode, 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... @@ -3731,6 +3754,7 @@ HookFn Hooks[] = { HOOK( APIFile, CreateFileA ), HOOK( APIFile, CreateFileW ), HOOK( APIKernel, CreateConsoleScreenBuffer ), + HOOK( APIHandle, CloseHandle ), HOOK( APIKernel, FillConsoleOutputAttribute ), HOOK( APIKernel, FillConsoleOutputCharacterA ), HOOK( APIKernel, FillConsoleOutputCharacterW ),