From 5c05a29d3d3f7507e86879f887fe7b990f665555 Mon Sep 17 00:00:00 2001 From: Mark Jansen Date: Sun, 6 Jan 2019 17:51:55 +0100 Subject: [PATCH] [APPHELP] Implement ShimDumpCache and ShimFlushCache These functions simply call into the Base* functions, having a prototype that is compatible with rundll32 CORE-11301 --- dll/appcompat/apphelp/apphelp.c | 35 ++++++++++++++++++++++++++++ dll/appcompat/apphelp/apphelp.spec | 4 ++-- dll/win32/kernel32/client/appcache.c | 18 +++++++++----- ntoskrnl/ps/apphelp.c | 1 + 4 files changed, 50 insertions(+), 8 deletions(-) diff --git a/dll/appcompat/apphelp/apphelp.c b/dll/appcompat/apphelp/apphelp.c index 1e1a65b67b6..ceb71a8e166 100644 --- a/dll/appcompat/apphelp/apphelp.c +++ b/dll/appcompat/apphelp/apphelp.c @@ -292,3 +292,38 @@ BOOL WINAPI SdbUnregisterDatabase(_In_ GUID *pguidDB) return FALSE; } + +/* kernel32.dll */ +BOOL WINAPI BaseDumpAppcompatCache(VOID); +BOOL WINAPI BaseFlushAppcompatCache(VOID); + + +/** + * @name ShimDumpCache + * Dump contents of the shim cache. + * + * @param hwnd Unused, pass 0 + * @param hInstance Unused, pass 0 + * @param lpszCmdLine Unused, pass 0 + * @param nCmdShow Unused, pass 0 + * @return + */ +BOOL WINAPI ShimDumpCache(HWND hwnd, HINSTANCE hInstance, LPCSTR lpszCmdLine, int nCmdShow) +{ + return BaseDumpAppcompatCache(); +} + +/** +* @name ShimFlushCache +* Flush the shim cache. Call this after installing a new shim database +* +* @param hwnd Unused, pass 0 +* @param hInstance Unused, pass 0 +* @param lpszCmdLine Unused, pass 0 +* @param nCmdShow Unused, pass 0 +* @return +*/ +BOOL WINAPI ShimFlushCache(HWND hwnd, HINSTANCE hInstance, LPCSTR lpszCmdLine, int nCmdShow) +{ + return BaseFlushAppcompatCache(); +} diff --git a/dll/appcompat/apphelp/apphelp.spec b/dll/appcompat/apphelp/apphelp.spec index 83735803f61..af6582f90c8 100644 --- a/dll/appcompat/apphelp/apphelp.spec +++ b/dll/appcompat/apphelp/apphelp.spec @@ -173,7 +173,7 @@ @ stub SE_LdrEntryRemoved @ stub SetPermLayers @ cdecl ShimDbgPrint(long str str) -@ stub ShimDumpCache -@ stub ShimFlushCache +@ stdcall ShimDumpCache(ptr ptr wstr long) +@ stdcall ShimFlushCache(ptr ptr wstr long) @ stdcall SetPermLayerState(wstr wstr long long long) @ stdcall SdbRegisterDatabaseEx(wstr long ptr) diff --git a/dll/win32/kernel32/client/appcache.c b/dll/win32/kernel32/client/appcache.c index 302984ae99c..81ffaefc3b8 100644 --- a/dll/win32/kernel32/client/appcache.c +++ b/dll/win32/kernel32/client/appcache.c @@ -309,23 +309,29 @@ BasepCheckBadapp(IN HANDLE FileHandle, } /* - * @unimplemented + * @implemented */ -VOID +BOOL WINAPI BaseDumpAppcompatCache(VOID) { - STUB; + NTSTATUS Status; + + Status = NtApphelpCacheControl(ApphelpCacheServiceDump, NULL); + return NT_SUCCESS(Status); } /* - * @unimplemented + * @implemented */ -VOID +BOOL WINAPI BaseFlushAppcompatCache(VOID) { - STUB; + NTSTATUS Status; + + Status = NtApphelpCacheControl(ApphelpCacheServiceFlush, NULL); + return NT_SUCCESS(Status); } /* diff --git a/ntoskrnl/ps/apphelp.c b/ntoskrnl/ps/apphelp.c index 7692c7ab2e0..7d9516e22b0 100644 --- a/ntoskrnl/ps/apphelp.c +++ b/ntoskrnl/ps/apphelp.c @@ -764,6 +764,7 @@ NtApphelpCacheControl( } break; case ApphelpCacheServiceFlush: + /* FIXME: Check for admin or system here. */ Status = ApphelpCacheFlush(); break; case ApphelpCacheServiceDump: