142 lines
2.6 KiB
C++
142 lines
2.6 KiB
C++
|
/*++
|
||
|
|
||
|
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
|
||
|
|