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.
191 lines
6.4 KiB
191 lines
6.4 KiB
/*++
|
|
|
|
Copyright (c) 2000-2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
ShimHook.h
|
|
|
|
Abstract:
|
|
|
|
Main header for shim DLLs
|
|
|
|
Notes:
|
|
|
|
None
|
|
|
|
History:
|
|
|
|
10/29/1999 markder Created
|
|
07/16/2001 clupu Merged multiple headers into ShimHook.h
|
|
08/13/2001 robkenny Cleaned up, readied for publishing.
|
|
|
|
--*/
|
|
|
|
#pragma once
|
|
|
|
#ifndef _SHIM_HOOK_H_
|
|
#define _SHIM_HOOK_H_
|
|
|
|
|
|
#include <nt.h>
|
|
#include <ntrtl.h>
|
|
#include <nturtl.h>
|
|
#include <ntldr.h>
|
|
#include <ntddscsi.h>
|
|
|
|
#include <windows.h>
|
|
// Disable warning C4201: nonstandard extension used : nameless struct/union
|
|
// Allows shims to be compiled at Warning Level 4
|
|
#pragma warning ( disable : 4201 )
|
|
#include <mmsystem.h>
|
|
#pragma warning ( default : 4201 )
|
|
#include <WinDef.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
#include <shimdb.h>
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
|
|
|
|
namespace ShimLib
|
|
{
|
|
/*++
|
|
|
|
Globals
|
|
|
|
--*/
|
|
|
|
extern HINSTANCE g_hinstDll; // The Shim's dll handle
|
|
extern BOOL g_bMultiShim; // Does this dll handle multiple shims?
|
|
extern DWORD g_dwShimVersion; //
|
|
|
|
|
|
|
|
/*++
|
|
|
|
Typedefs and enums
|
|
|
|
--*/
|
|
|
|
typedef struct tagSHIM_COM_HOOK
|
|
{
|
|
CLSID* pCLSID;
|
|
IID* pIID;
|
|
DWORD dwVtblIndex;
|
|
PVOID pfnNew;
|
|
PVOID pfnOld;
|
|
} SHIM_COM_HOOK, *PSHIM_COM_HOOK;
|
|
|
|
typedef struct tagSHIM_IFACE_FN_MAP
|
|
{
|
|
PVOID pVtbl;
|
|
PVOID pfnNew;
|
|
PVOID pfnOld;
|
|
PVOID pNext;
|
|
} SHIM_IFACE_FN_MAP, *PSHIM_IFACE_FN_MAP;
|
|
|
|
typedef struct tagSHIM_HOOKED_OBJECT
|
|
{
|
|
PVOID pThis;
|
|
CLSID* pCLSID;
|
|
DWORD dwRef;
|
|
BOOL bAddRefTrip;
|
|
BOOL bClassFactory;
|
|
PVOID pNext;
|
|
} SHIM_HOOKED_OBJECT, *PSHIM_HOOKED_OBJECT;
|
|
|
|
|
|
/*++
|
|
|
|
Prototypes
|
|
|
|
--*/
|
|
|
|
|
|
// These declarations are needed to hook all known exported APIs that return a COM object.
|
|
PVOID LookupOriginalCOMFunction( PVOID pVtbl, PVOID pfnNew, BOOL bThrowExceptionIfNull );
|
|
void DumpCOMHooks();
|
|
void InitializeHooks(DWORD fdwReason);
|
|
PHOOKAPI InitializeHooksEx(DWORD, LPWSTR, LPSTR, DWORD*);
|
|
VOID HookObject(IN CLSID *pCLSID, IN REFIID riid, OUT LPVOID *ppv, OUT PSHIM_HOOKED_OBJECT pOb, IN BOOL bClassFactory );
|
|
VOID HookCOMInterface(REFCLSID rclsid, REFIID riid, LPVOID * ppv, BOOL bClassFactory);
|
|
VOID AddComHook(REFCLSID clsid, REFIID iid, PVOID hook, DWORD vtblndx);
|
|
|
|
|
|
}; // end of namespace ShimLib
|
|
|
|
|
|
|
|
/*++
|
|
|
|
Defines
|
|
|
|
--*/
|
|
|
|
#define IMPLEMENT_SHIM_BEGIN(shim) \
|
|
namespace NS_##shim \
|
|
{ \
|
|
extern const CHAR * g_szModuleName; \
|
|
extern CHAR * g_szCommandLine; \
|
|
extern PHOOKAPI g_pAPIHooks;
|
|
|
|
#define IMPLEMENT_SHIM_STANDALONE(shim) \
|
|
namespace NS_##shim \
|
|
{ \
|
|
const CHAR * g_szModuleName; \
|
|
CHAR * g_szCommandLine = ""; \
|
|
PHOOKAPI g_pAPIHooks; \
|
|
\
|
|
extern PHOOKAPI InitializeHooksMulti( \
|
|
DWORD fdwReason, \
|
|
LPSTR pszCmdLine, \
|
|
DWORD* pdwHookCount \
|
|
); \
|
|
} \
|
|
\
|
|
namespace ShimLib { \
|
|
VOID \
|
|
InitializeHooks(DWORD fdwReason) \
|
|
{ \
|
|
g_dwShimVersion = 2; \
|
|
} \
|
|
\
|
|
PHOOKAPI \
|
|
InitializeHooksEx( \
|
|
DWORD fdwReason, \
|
|
LPWSTR pwszShim, \
|
|
LPSTR pszCmdLine, \
|
|
DWORD* pdwHookCount \
|
|
) \
|
|
{ \
|
|
using namespace NS_##shim; \
|
|
return InitializeHooksMulti( \
|
|
fdwReason, \
|
|
pszCmdLine, \
|
|
pdwHookCount ); \
|
|
} \
|
|
} \
|
|
namespace NS_##shim \
|
|
{ \
|
|
|
|
#define IMPLEMENT_SHIM_END \
|
|
};
|
|
|
|
|
|
/*++
|
|
|
|
ShimLib specific include files
|
|
|
|
--*/
|
|
|
|
#include "ShimProto.h"
|
|
#include "ShimLib.h"
|
|
|
|
|
|
#endif // _SHIM_HOOK_H_
|
|
|