2009年12月23日 星期三

HookDll - installs an application-defined hook procedure into a hook chain.

// installs an application-defined hook procedure into a hook chain.

LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam);

typedef void (* LPFN_INITHOOK)(HOOKPROC lpfnCallBackHookProc, int idHook);
LPFN_INITHOOK lpfnInitHook;

typedef void (* LPFN_UNHOOK)(void);
LPFN_UNHOOK lpfnUnHook;

CuDllManager DllManager;
BOOL bLoadDll = DllManager.LoadLibrary(L"HookDll.dll");
lpfnInitHook = (LPFN_INITHOOK)DllManager.GetProcAddress("InitHook");
lpfnUnHook = (LPFN_UNHOOK)DllManager.GetProcAddress("UnHook");
lpfnInitHook(HookProc, WH_MOUSE_LL);

lpfnUnHook();
// HookDll.h

#ifdef HOOKDLL_EXPORTS
#define HOOKDLL_API __declspec(dllexport)
#else
#define HOOKDLL_API __declspec(dllimport)
#endif

#ifdef __cplusplus
extern "C" {
#endif //__cplusplus

    HOOKDLL_API void InitHook(HOOKPROC lpfnCallBackHookProc, int idHook );
    HOOKDLL_API void UnHook(void);

#ifdef __cplusplus
} // extern "C"
#endif //__cplusplus


// HookDll.cpp

#pragma comment(linker,"/SECTION:.MYSEC,RWS")   

#pragma data_seg(".MYSEC") 
HOOKPROC g_lpfnCallBackHookProc = NULL;
HHOOK ghHook = NULL;
#pragma data_seg()  

HMODULE ghModule;

#ifdef _MANAGED
#pragma managed(push, off)
#endif

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
        ghModule = hModule;
        break;
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        UnHook();
        ghHook = NULL;
        break;
    }
    return TRUE;
}

#ifdef _MANAGED
#pragma managed(pop)
#endif

LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{

    if ( nCode < 0 )
        return ::CallNextHookEx(ghHook, nCode, wParam, lParam);

    if( nCode == HC_ACTION )
    {
        if( g_lpfnCallBackHookProc )
            g_lpfnCallBackHookProc(nCode, wParam, lParam);
    }

    return ::CallNextHookEx(ghHook, nCode, wParam, lParam);

}


HOOKDLL_API void InitHook(HOOKPROC lpfnCallBackHookProc, int idHook )
{
    g_lpfnCallBackHookProc = lpfnCallBackHookProc;
    ghHook = (HHOOK)::SetWindowsHookEx(idHook, HookProc, ghModule ,0);
}


HOOKDLL_API void UnHook(void)
{
    ::UnhookWindowsHookEx(ghHook);
}

2 則留言:

  1. 先包一層DLL, Hook群組無法傳任何資料進去, 看樣子每一個執行緒, 對同一個Hook 只能掛一次, 後面在自己做函式指標輪詢吧!

    回覆刪除
  2. data_seg 比較特別資料要共用時得放到這裡來! Ex: ghHook

    回覆刪除