windows-nt/Source/XPSP1/NT/windows/appcompat/shims/general/ignorecocreateinstance.cpp
2020-09-26 16:20:57 +08:00

129 lines
2.3 KiB
C++

/*++
Copyright (c) 2002 Microsoft Corporation
Module Name:
IgnoreCoCreateInstance.cpp
Abstract:
Ignore specified CoCreateInstance calls.
Notes:
This is a general purpose shim.
History:
01/07/2001 linstev Created
--*/
#include "precomp.h"
IMPLEMENT_SHIM_BEGIN(IgnoreCoCreateInstance)
#include "ShimHookMacro.h"
APIHOOK_ENUM_BEGIN
APIHOOK_ENUM_ENTRY(CoCreateInstance)
APIHOOK_ENUM_END
int g_nCount = 0;
CString *g_rGUIDs = NULL;
/*++
Ignore specified CoCreateInstance calls
--*/
STDAPI
APIHOOK(CoCreateInstance)(
REFCLSID rclsid,
LPUNKNOWN pUnkOuter,
DWORD dwClsContext,
REFIID riid,
LPVOID* ppv
)
{
CSTRING_TRY
{
//
// Convert the CLSID to a string so we can compare it to our guids
//
LPOLESTR wszCLSID;
if (StringFromCLSID(rclsid, &wszCLSID) == S_OK) {
// Run the list and jump out if we match
CString csClass(wszCLSID);
for (int i = 0; i < g_nCount; i++) {
if (csClass.CompareNoCase(g_rGUIDs[i]) == 0) {
LOGN(eDbgLevelWarning, "[CoCreateInstance] Failed %S", wszCLSID);
// Free the memory
CoTaskMemFree(wszCLSID);
return REGDB_E_CLASSNOTREG;
}
}
// Free the memory
CoTaskMemFree(wszCLSID);
}
}
CSTRING_CATCH
{
// Do Nothing
}
return ORIGINAL_API(CoCreateInstance)(rclsid, pUnkOuter, dwClsContext, riid,
ppv);
}
/*++
Register hooked functions
--*/
BOOL ParseCommandLine()
{
CSTRING_TRY
{
CString csCl(COMMAND_LINE);
CStringParser csParser(csCl, L";");
g_nCount = csParser.GetCount();
g_rGUIDs = csParser.ReleaseArgv();
}
CSTRING_CATCH
{
return FALSE;
}
for (int i = 0; i < g_nCount; ++i) {
DPFN(eDbgLevelInfo, "ClassID = %S", g_rGUIDs[i].Get());
}
return TRUE;
}
BOOL
NOTIFY_FUNCTION(
DWORD fdwReason)
{
if (fdwReason == DLL_PROCESS_ATTACH) {
return ParseCommandLine();
}
return TRUE;
}
HOOK_BEGIN
CALL_NOTIFY_FUNCTION
APIHOOK_ENTRY(OLE32.DLL, CoCreateInstance)
HOOK_END
IMPLEMENT_SHIM_END