15,471
社区成员
发帖
与我相关
我的任务
分享
// InterceptDll.cpp : 定义 DLL 应用程序的入口点。
//
#include "Hook.h"
#include "detours.h"
#pragma warning(disable: 4099)
#pragma comment(lib,"detours.lib")
HHOOK g_hHook = NULL;
HANDLE g_hInst = NULL;
DETOUR_TRAMPOLINE( HHOOK WINAPI Real_SetWindowsHookEx( int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWORD dwThreadId),SetWindowsHookEx);
HHOOK WINAPI Replace_SetWindowsHookEx( int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWORD dwThreadId)
{
if(g_hHook != NULL)
{
return 0;
}
return Real_SetWindowsHookEx(idHook,lpfn,hMod,dwThreadId);
}
void Intercept()
{
DetourFunctionWithTrampoline((PBYTE)Real_SetWindowsHookEx, (PBYTE)Replace_SetWindowsHookEx);
}
void UnIntercept()
{
DetourRemove((PBYTE)Real_SetWindowsHookEx, (PBYTE)Replace_SetWindowsHookEx);
}
BOOL APIENTRY DllMain( HANDLE hinstDLL, DWORD fdwReason, LPVOID lpvReserved )
{
g_hInst = hinstDLL;
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
Intercept();
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
UnIntercept();
break;
}
return TRUE;
}
LRESULT CALLBACK MyShellProc (int nCode, WPARAM wParam, LPARAM lParam)
{
return ::CallNextHookEx( g_hHook, nCode, wParam, lParam );
}
void InstallHook()
{
if(g_hHook == NULL)
{
g_hHook = ::SetWindowsHookEx( WH_GETMESSAGE , MyShellProc ,(HINSTANCE)g_hInst, 0);
}
}
void UninstallHook()
{
if(::UnhookWindowsHookEx( g_hHook ))
g_hHook = NULL;
}