关于API HOOK(OpenProcess ) ,根据网上文章改写
 以下是部分程序,在VC
++ 6.0    Plat  SDK  2003  SP1下编译通过

#include  <windows.h>
#include  "APIHook.h"

extern  CAPIHook g_OpenProcess ;

// 自定义OpenProcess函数
#pragma  data_seg ( "YCIShared" )
HHOOK g_hHook  NULL ;
DWORD  dwCurrentProcessId = 0 ;
#pragma  data_seg ()

HANDLE  WINAPI Hook_OpenProcess ( DWORD dwDesiredAccess BOOL bInheritHandle ,   DWORD dwProcessId )
{
    
typedef  HANDLE   ( WINAPI  * PFNTERMINATEPROCESS )( DWORD BOOL , DWORD );
 
 
if ( dwProcessId  !=  dwCurrentProcessId )
 {
   
return  (( PFNTERMINATEPROCESS )( PROC ) g_OpenProcess )( dwDesiredAccess , bInheritHandle , dwProcessId );
 }
 
return  0 ;
}

 

// 挂钩OpenProcess函数
CAPIHook g_OpenProcess ( "kernel32.dll" "OpenProcess" ,
      (
PROC ) Hook_OpenProcess );


///////////////////////////////////////////////////////////////////////////

 

static  HMODULE ModuleFromAddress ( PVOID pv )
{
 
MEMORY_BASIC_INFORMATION mbi ;
 
if (:: VirtualQuery ( pv , & mbi sizeof ( mbi )) !=  0 )
 {
  
return  ( HMODULE ) mbi . AllocationBase ;
 }
 
else
 
{
  
return  NULL ;
 }
}

static  LRESULT WINAPI GetMsgProc ( int  code WPARAM wParam LPARAM lParam )
{
 
return  :: CallNextHookEx ( g_hHook code wParam lParam );
}

BOOL WINAPI SetSysHook ( BOOL bInstall DWORD dwThreadId )
{
 
BOOL bOk ;
    
dwCurrentProcessId = dwThreadId ;
 
if ( bInstall )
 {
  
g_hHook  = :: SetWindowsHookEx ( WH_GETMESSAGE GetMsgProc ,
      
ModuleFromAddress ( GetMsgProc ),  0 );
  
bOk  = ( g_hHook  !=  NULL );
 }
 
else
 
{
  
bOk  = :: UnhookWindowsHookEx ( g_hHook );
  
g_hHook  NULL ;
 }
 
return  bOk ;
}