为什么这个全局钩子只对本窗口有效
k5624 2012-06-15 10:18:07 // TEST_DLL.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include <Winsock2.h>
#include <windows.h>
#include <tchar.h>
#ifndef ULONG_PTR
#define ULONG_PTR unsigned long*
#endif
#pragma comment(lib, "Ws2_32.lib")
//#pragma comment(lib,"NtHookEngine.lib")
//#pragma comment(lib, "User32.lib")
#pragma data_seg(".shared")
HANDLE m_hModule=NULL;
HHOOK g_HHOOK=NULL;
HMODULE hHookEngineDll;
#pragma data_seg()
#pragma comment(linker, "/section:.shared,rws")
BOOL (__cdecl *HookFunction)(ULONG_PTR OriginalFunction, ULONG_PTR NewFunction);
VOID (__cdecl *UnhookFunction)(ULONG_PTR Function);
ULONG_PTR (__cdecl *GetOriginalFunction)(ULONG_PTR Hook);
int WINAPI MyMessageBoxW(SOCKET s,
const struct sockaddr FAR *name,
int namelen);
__declspec(dllexport) LRESULT CALLBACK CBTProc(
int nCode, // hook code
WPARAM wParam, // depends on hook code
LPARAM lParam // depends on hook code
){
//MessageBox(NULL,"CBTProc","CBTProc",MB_OK);
return CallNextHookEx(g_HHOOK,nCode,wParam,lParam);
}
VOID gjl_Hook(){
g_HHOOK=SetWindowsHookEx(WH_CBT,(HOOKPROC)CBTProc,(HINSTANCE)m_hModule,0);
if (!g_HHOOK)
{
MessageBoxA(NULL, "SET ERROR", "ERROR", MB_OK);
}
}
VOID gjl_UnHook(){
UnhookWindowsHookEx(g_HHOOK);
}
//HMODULE dllModule=LoadLibrary(_T("User32.dll"));
//FARPROC messageboxAddr=GetProcAddress(dllModule,"MessageBoxW");
int WINAPI Myrecv2(SOCKET s, char FAR *buf, int len, int flags);
int WINAPI Myrecv2(SOCKET s, char FAR *buf, int len, int flags){
int (WINAPI *precv)(SOCKET s, char FAR *buf, int len, int flags);
precv = (int (WINAPI *)(SOCKET s, char FAR *buf, int len, int flags))
GetOriginalFunction((ULONG_PTR) Myrecv2);
MessageBox(NULL,"success","success",MB_OK);
return precv(s, buf, len, flags);
}
#include <stdio.h>
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
m_hModule=hModule;
hHookEngineDll = LoadLibrary(("NtHookEngine.dll"));
HookFunction = (BOOL (__cdecl *)(ULONG_PTR, ULONG_PTR))
GetProcAddress(hHookEngineDll, "HookFunction");
UnhookFunction = (VOID (__cdecl *)(ULONG_PTR))
GetProcAddress(hHookEngineDll, "UnhookFunction");
GetOriginalFunction = (ULONG_PTR (__cdecl *)(ULONG_PTR))
GetProcAddress(hHookEngineDll, "GetOriginalFunction");
if (HookFunction == NULL || UnhookFunction == NULL ||
GetOriginalFunction == NULL)
return 0;
HookFunction((ULONG_PTR)recv,
(ULONG_PTR) &Myrecv2);
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
int WINAPI MyMessageBoxW(SOCKET s,
const struct sockaddr FAR *name,
int namelen)
{
int (WINAPI *pMessageBoxW)(SOCKET s,
const struct sockaddr FAR *name,
int namelen);
pMessageBoxW = (int (WINAPI *)(SOCKET s,
const struct sockaddr FAR *name,
int namelen))
GetOriginalFunction((ULONG_PTR) MyMessageBoxW);
MessageBox(NULL,"success","success",MB_OK);
return pMessageBoxW(s,
name,
namelen);
}