关于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 ;
}