Leaked source code of windows server 2003
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*++
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
|