HOOKAPI.C
上传用户:chzmdj
上传日期:2007-01-22
资源大小:135k
文件大小:4k
源码类别:

源码/资料

开发平台:

C/C++

  1. /**************************************************************************
  2.     HookApi.C
  3.     Hook and restore window api code in 16 bit system code.
  4.     
  5.     Hook   : Let application call api function after run my code.
  6.     Restore: Let application call api function no run my code.
  7.     (c) 1996.11 Inventec (TianJin) Co., Ltd.
  8.     Author: FengShuen Lu / Gang Fang / Gang Yan
  9.     Comments:  1. 97.5.30 is version 1.0.
  10. ***************************************************************************/
  11. #include <dos.h>
  12. #include <memory.h>
  13. #include <string.h>
  14. #include <windows.h>
  15. #include "hookapi.h"
  16. #ifdef _DEBUG
  17. #include "DbgFunc.h"
  18. #endif //_DEBUG
  19. void myCpy(LPBYTE lpDest, LPBYTE lpSrc, UINT num);
  20. // From a function name ,we get it's function address in special dll libary.
  21. FARPROC WINAPI getFunctionAddress(HINSTANCE hInst, LPCSTR lpMod, LPCSTR lpFun) 
  22. {
  23. HMODULE hMod;
  24. FARPROC procFun;
  25. if (lpMod != NULL)
  26. {
  27. hMod=GetModuleHandle(lpMod);
  28. procFun = GetProcAddress(hMod,lpFun);
  29. }
  30. else
  31. {
  32. procFun = GetProcAddress(hInst,lpFun);
  33. }
  34. return  procFun;
  35. // Copy five byte form lpSrc to lpDest.
  36. void byteFrompointer(BYTE* lpDest,LPVOID lpSrc)
  37. {
  38. UINT seg = _FP_SEG(lpSrc);
  39. UINT off = _FP_OFF(lpSrc);
  40. BYTE seghigh = (BYTE)((seg&0xff00)>>8);
  41. BYTE seglow  = (BYTE)seg&0x00ff;
  42. BYTE offhigh = (BYTE)((off&0xff00)>>8);
  43. BYTE offlow  = (BYTE)off&0x00ff;
  44. lpDest ++;
  45. *lpDest = offlow;
  46. lpDest ++;
  47. *lpDest = offhigh;
  48. lpDest ++;
  49. *lpDest = seglow;
  50. lpDest ++;
  51. *lpDest = seghigh;
  52. return;
  53. }
  54. BYTE   bytWinTextout[5];
  55. void HookWinApi(LPAPIHOOKSTRUCT lpApiHook, UINT nHookFlag)
  56. {
  57. UINT   uSegCopy;
  58. LPVOID lpCopyToMem;
  59. bytWinTextout[0] = 0x00; 
  60. if(lpApiHook->lpWinApiProc == NULL)
  61. {
  62. lpApiHook->lpWinApiProc = (LPVOID)getFunctionAddress(lpApiHook->hInst, lpApiHook->lpszApiModuleName,lpApiHook->lpszApiName);
  63. if (lpApiHook->dwApiOffset != 0)
  64. lpApiHook->lpWinApiProc = (LPVOID)((DWORD)lpApiHook->lpWinApiProc + lpApiHook->dwApiOffset);
  65. }
  66. if(lpApiHook->lpHookApiProc == NULL)
  67. {
  68. lpApiHook->lpHookApiProc = (LPVOID)getFunctionAddress(lpApiHook->hInst, lpApiHook->lpszHookApiModuleName,lpApiHook->lpszHookApiName);
  69. }
  70. if (lpApiHook->HookApiFiveByte[0] == 0x00)
  71. {
  72. lpApiHook->HookApiFiveByte[0]=0xea;    
  73. byteFrompointer(lpApiHook->HookApiFiveByte,lpApiHook->lpHookApiProc);
  74. }
  75. uSegCopy=AllocSelector((UINT)0);
  76. PrestoChangoSelector(_FP_SEG(lpApiHook->lpWinApiProc),uSegCopy);
  77. lpCopyToMem =_MK_FP(uSegCopy,_FP_OFF(lpApiHook->lpWinApiProc));
  78. switch(nHookFlag)
  79. {
  80. case HOOKANDBACK:
  81.  if (lpApiHook->WinApiFiveByte[0] == 0x00)
  82.  {
  83. _fmemcpy(lpApiHook->WinApiFiveByte,(LPVOID)lpCopyToMem,5);
  84. if (strncmp(lpApiHook->WinApiFiveByte, lpApiHook->HookApiFiveByte, 5) == 0)
  85. {
  86. _fmemcpy(lpApiHook->WinApiFiveByte,(LPVOID)lpApiHook->WinApiBakByte,5);
  87. }
  88.  }
  89.  else
  90.  {
  91. _fmemcpy(bytWinTextout,(LPVOID)lpCopyToMem,5);
  92.  }
  93.  if (strncmp(bytWinTextout, lpApiHook->HookApiFiveByte, 5) != 0)
  94.  {
  95. _fmemcpy(lpCopyToMem,(LPVOID)lpApiHook->HookApiFiveByte,5);
  96.  }
  97.  break;
  98. case ONLYHOOK:
  99.  _fmemcpy(lpCopyToMem,(LPVOID)lpApiHook->HookApiFiveByte,5);
  100.  break;
  101. }
  102. FreeSelector(uSegCopy);
  103. }
  104. // copy old  textout code back.
  105. void RestoreWinApi(LPAPIHOOKSTRUCT lpApiHook)
  106. {
  107. UINT uSegCopy;
  108. LPVOID lpCopyToMem;
  109. if (lpApiHook->lpWinApiProc == NULL)
  110. return;
  111. uSegCopy=AllocSelector((UINT)0);
  112. PrestoChangoSelector(_FP_SEG(lpApiHook->lpWinApiProc),uSegCopy);
  113. lpCopyToMem =_MK_FP(uSegCopy,_FP_OFF(lpApiHook->lpWinApiProc));
  114. _fmemcpy(lpCopyToMem,(LPVOID)lpApiHook->WinApiFiveByte,5);
  115. FreeSelector(uSegCopy);
  116.   
  117. return;
  118. }