/*++ Copyright (c) 2000 Microsoft Corporation Module Name: Canvas6.cpp Abstract: This app. deletes HKEY\CLASSES_ROOT \ .HTC key during uninstall. This breaks the ControlPanel -> Add/Remove programs Notes: This is specific to this app. History: 11/17/2000 prashkud Created --*/ #include "precomp.h" IMPLEMENT_SHIM_BEGIN(Canvas6) #include "ShimHookMacro.h" APIHOOK_ENUM_BEGIN APIHOOK_ENUM_ENTRY(RegOpenKeyA) APIHOOK_ENUM_ENTRY(RegCloseKey) APIHOOK_ENUM_ENTRY(RegDeleteKeyA) APIHOOK_ENUM_END HKEY g_hOpenKey = 0; /*++ Store the key for .htc --*/ LONG APIHOOK(RegOpenKeyA)( HKEY hkey, LPCSTR lpSubKey, PHKEY phkResult) { LONG lRet = 0; lRet = ORIGINAL_API(RegOpenKeyA)(hkey,lpSubKey,phkResult); DWORD lcid = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT); if ((hkey == HKEY_CLASSES_ROOT) && lpSubKey && (CompareStringA(lcid, NORM_IGNORECASE, lpSubKey, -1, ".htc", -1) == CSTR_EQUAL)) { if (phkResult) { g_hOpenKey = *(phkResult); } } return lRet; } /*++ Ignore the close if required. --*/ LONG APIHOOK(RegCloseKey)( HKEY hkey) { if (g_hOpenKey && (g_hOpenKey == hkey)) { return ERROR_SUCCESS; } else { return (ORIGINAL_API(RegCloseKey)(hkey)); } } /*++ Ignore the delete. --*/ LONG APIHOOK(RegDeleteKeyA)( HKEY hkey, LPCSTR lpSubKey) { LONG lRet = 0; DWORD lcid = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT); if ((hkey == HKEY_CLASSES_ROOT) && lpSubKey && (CompareStringA(lcid, NORM_IGNORECASE, lpSubKey, -1, ".htc", -1) == CSTR_EQUAL)) { if (g_hOpenKey) { if(RegDeleteValueA(g_hOpenKey,NULL)) { // Add DPF to indicate an error during deletion of the value installed by the app. DPFN( eDbgLevelError, "Could not delete the value in the key= \"%s\".", lpSubKey); } RegCloseKey(g_hOpenKey); g_hOpenKey = 0; } lRet = ERROR_SUCCESS; } else { lRet = ORIGINAL_API(RegDeleteKeyA)(hkey,lpSubKey); } return lRet; } /*++ Register hooked functions --*/ HOOK_BEGIN APIHOOK_ENTRY(ADVAPI32.DLL, RegOpenKeyA) APIHOOK_ENTRY(ADVAPI32.DLL, RegCloseKey) APIHOOK_ENTRY(ADVAPI32.DLL, RegDeleteKeyA) HOOK_END IMPLEMENT_SHIM_END