远程DLL中怎么设置全局钩子

远程DLL中如何设置全局钩子。
我写了个DLL,然后用另一个程序将它当作远程线程注入到NOTEPAD.exe中,在DLL实现全局HOOK,在HOOKPROC中实现替换MESSAGEBOXA的前5字节为跳转到新API。
DLL代码如下:

//   Test_DLL.cpp   :   Defines   the   entry   point   for   the   DLL   application.
//
#include   <windows.h>
#include   "stdafx.h "

#pragma   comment(lib, "ImageHlp ")   //定义全局共享数据段  
#pragma   data_seg( "Shared ")  

HMODULE   g_hinstDll=NULL;
HHOOK   g_hHook=NULL;

#pragma   data_seg()  
#pragma   comment(linker, "/Section:Shared,rws ")   //设置全局共享数据段的属性  

FARPROC   pfMessageBoxA;
int   WINAPI   MyMessageBoxA(HWND   hWnd,   LPCTSTR   lpText,   LPCTSTR   lpCaption,   UINT   uType);

BYTE   OldMessageBoxACode[5],NewMessageBoxACode[5];//新旧API内存镜像前5字节
HMODULE   hModule;
DWORD   dwIdOld,dwIdNew;
BOOL   bHook=false;

BOOL   InstallHook();
BOOL   UnInstallHook();

BOOL   HookOn();
BOOL   HookOff();

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

/////////////////////////
//   DllMain
/////////////////////////
BOOL   APIENTRY   DllMain(   HANDLE   hModule,   DWORD   ul_reason_for_call,   LPVOID   lpReserved   )  
{
switch   (ul_reason_for_call)  
{
case   DLL_PROCESS_ATTACH:  
if(!InstallHook())  
{
MessageBoxA(NULL, "Error ", "InstallHook ",MB_OK);
return(false);
}
case   DLL_THREAD_ATTACH:  

case   DLL_THREAD_DETACH:  
case   DLL_PROCESS_DETACH:  
if(g_hHook)   UnInstallHook();
break;
}
return   TRUE;
}

/////////////////////////
//   InstallHook   安装一个全局消息钩子
/////////////////////////
BOOL   InstallHook()//输出安装空的钩子函数  
{
g_hinstDll=LoadLibrary( "Test_DLL.dll ");//远程线程中不能再载入DLL,所以此处使用DLL中Hook()
g_hHook=SetWindowsHookEx   (   WH_GETMESSAGE,(HOOKPROC)HookProc,g_hinstDll,0   );//钩子所监视的线程的线程号。0为全局钩子,监视全部线程
if   (!g_hHook)  
{
MessageBoxA(NULL, "SET   ERROR ", "SET   ERROR ",MB_OK);
return(false);
}
return(true);
}

/////////////////////////
//   HookProc   在进程内准备好跳转到新API地址的代码
/////////////////////////
LRESULT   WINAPI   HookProc(int   nCode,WPARAM   wParam,LPARAM   lParam)//空的钩子函数  
{
hModule=LoadLibrary( "user32.dll ");
pfMessageBoxA=GetProcAddress(hModule, "MessageBoxA ");//   获取目标API的地址
NewMessageBoxACode[0]=0xe9;//jmp   MyMessageBoxA的相对地址的指令
_asm
{
lea   eax,MyMessageBoxA
mov   ebx,pfMessageBoxA
sub   eax,ebx
sub   eax,5
mov   dword   ptr   [NewMessageBoxACode+1],eax
}//写入地址到替换代码的缓存
dwIdNew=GetCurrentProcessId();//得到所属进程的ID*/

if   (!HookOn())
MessageBoxA   (   NULL,   "HookOn失败 ",   "HookOn失败 ",   MB_OK   );
return(CallNextHookEx(g_hHook,nCode,wParam,lParam));
}

/////////////////////////
//   HookOn   修改进程中API的前5个字节,写入跳转到新API的代码
/////////////////////////
BOOL   HookOn()
{
MessageBoxA(NULL, "开始修改 ", "HookOn开始修改 ",MB_OK);
HANDLE   hProc;