JwaWowNT16.pas
上传用户:davidchvip
上传日期:2009-07-28
资源大小:1749k
文件大小:9k
源码类别:

Windows编程

开发平台:

Delphi

  1. {******************************************************************************}
  2. {                                                                       }
  3. { 16 bit Generic Thunks API interface Unit for Object Pascal                   }
  4. {                                                                       }
  5. { Portions created by Microsoft are Copyright (C) 1995-2001 Microsoft          }
  6. { Corporation. All Rights Reserved.                                            }
  7. {                 }
  8. { The original file is: wownt16.h, released June 2000. The original Pascal     }
  9. { code is: WowNT16.pas, released December 2000. The initial developer of the   }
  10. { Pascal code is Marcel van Brakel (brakelm@chello.nl).                        }
  11. {                                                                              }
  12. { Portions created by Marcel van Brakel are Copyright (C) 1999-2001            }
  13. { Marcel van Brakel. All Rights Reserved.                                      }
  14. {                 }
  15. { Obtained through: Joint Endeavour of Delphi Innovators (Project JEDI)        }
  16. {                }
  17. { You may retrieve the latest version of this file at the Project JEDI home    }
  18. { page, located at http://delphi-jedi.org or my personal homepage located at   }
  19. { http://members.chello.nl/m.vanbrakel2                                        }
  20. {                }
  21. { The contents of this file are used with permission, subject to the Mozilla   }
  22. { Public License Version 1.1 (the "License"); you may not use this file except }
  23. { in compliance with the License. You may obtain a copy of the License at      }
  24. { http://www.mozilla.org/MPL/MPL-1.1.html                                      }
  25. {                                                                              }
  26. { Software distributed under the License is distributed on an "AS IS" basis,   }
  27. { WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for }
  28. { the specific language governing rights and limitations under the License.    }
  29. {                                                                              }
  30. { Alternatively, the contents of this file may be used under the terms of the  }
  31. { GNU Lesser General Public License (the  "LGPL License"), in which case the   }
  32. { provisions of the LGPL License are applicable instead of those above.        }
  33. { If you wish to allow use of your version of this file only under the terms   }
  34. { of the LGPL License and not to allow others to use your version of this file }
  35. { under the MPL, indicate your decision by deleting  the provisions above and  }
  36. { replace  them with the notice and other provisions required by the LGPL      }
  37. { License.  If you do not delete the provisions above, a recipient may use     }
  38. { your version of this file under either the MPL or the LGPL License.          }
  39. {                 }
  40. { For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html }
  41. {                 }
  42. {******************************************************************************}
  43. unit JwaWowNT16;
  44. {$WEAKPACKAGEUNIT}
  45. {$HPPEMIT ''}
  46. {$HPPEMIT '#include "wownt16.h"'}
  47. {$HPPEMIT ''}
  48. {$I WINDEFINES.INC}
  49. interface
  50. uses
  51.   JwaWinType;
  52. //
  53. // 16:16 -> 0:32 Pointer translation.
  54. //
  55. // GetVDMPointer32W will convert the passed in 16-bit address
  56. // to the equivalent 32-bit flat pointer. The upper 16 bits
  57. // of the address are treated according to the value passed in
  58. // fMode: if fMode = 1, then the hiword of vp is used as a
  59. // protected mode selector. Otherwise it is used as a real mode
  60. // segment value.
  61. // The lower 16 bits are treated as the offset.
  62. //
  63. // The return value is 0 if the selector is invalid.
  64. //
  65. // NOTE:  Limit checking is not performed in the retail build
  66. // of Windows NT.  It is performed in the checked (debug) build
  67. // of WOW32.DLL, which will cause 0 to be returned when the
  68. // limit is exceeded by the supplied offset.
  69. //
  70. function GetVDMPointer32W(vp: LPVOID; fMode: UINT): DWORD; stdcall;
  71. {$EXTERNALSYM GetVDMPointer32W}
  72. //
  73. // Win32 module management.
  74. //
  75. // The following routines accept parameters that correspond directly
  76. // to the respective Win32 API function calls that they invoke. Refer
  77. // to the Win32 reference documentation for more detail.
  78. function LoadLibraryEx32W(lpszLibFile: LPCSTR; hFile, dwFlags: DWORD): DWORD; stdcall;
  79. {$EXTERNALSYM LoadLibraryEx32W}
  80. function GetProcAddress32W(hModule: DWORD; lpszProc: LPCSTR): DWORD; stdcall;
  81. {$EXTERNALSYM GetProcAddress32W}
  82. function FreeLibrary32W(hLibModule: DWORD): DWORD; stdcall;
  83. {$EXTERNALSYM FreeLibrary32W}
  84. //
  85. // Generic Thunk Routine:
  86. //
  87. //   CallProc32W
  88. //
  89. // Transitions to 32 bits and calls specified routine
  90. //
  91. // This routine can pass a variable number of arguments, up to 32, to the
  92. // target 32-bit routine. These arguments are given to CallProc32W following
  93. // the 3 required parameters.
  94. //
  95. //   DWORD cParams          - Number of optional DWORD parameters (0-32)
  96. //
  97. //   LPVOID fAddressConvert - Bit Field, for 16:16 address Convertion. The
  98. //                            optional parameters can be automatically converted
  99. //                            from a 16:16 address format to flat by specifying
  100. //                            a 1 bit in the corresponding position in this mask.
  101. //                            eg (bit 1 means convert parameter 1 from 16:16
  102. //                              to flat address before calling routine)
  103. //
  104. //   DWORD lpProcAddress   -  32 bit native address to call (use LoadLibraryEx32W
  105. //                            and GetProcAddress32W to get this address).
  106. //
  107. // Returns:
  108. //   What ever the API returned on 32 bit side in AX:DX
  109. //
  110. // Error Returns:
  111. //   AX = 0, more than 32 parameters.
  112. //
  113. //
  114. // The function prototype must be declared by the application source code
  115. // in the following format:
  116. //
  117. // DWORD FAR PASCAL CallProc32W( DWORD p1, ... , DWORD lpProcAddress,
  118. //                                        DWORD fAddressConvert, DWORD cParams);
  119. //
  120. // where the value in cParams must match the actual number of optional
  121. // parameters (p1-pn) given AND the "DWORD p1, ..." must be replaced by
  122. // the correct number of parameters being passed.  For example, passing 3
  123. // parameter would simply require the removal of the ... and it insertion of
  124. // "DWORD p2, DWORD p3" instead.  The fAddressConvert parameter uses bit 1
  125. // for the last parameter (p3 in our example), with bit 2 for the next to last,
  126. // etc.
  127. //
  128. // Generic Thunk Routine:
  129. //
  130. //   CallProcEx32W
  131. //
  132. // Transitions to 32 bits and calls specified routine
  133. //
  134. // Similar to the CallProc32W function, the CallProcEx32W is an equivalent
  135. // function that is C calling convention and allows easier and more flexible
  136. // prototyping.  See the prototype below.  The fAddressConvert parameter uses
  137. // bit 1 for the 1st parameter, bit 2 for the 2nd parameter, etc.
  138. //
  139. // Both CallProc32W and CallProcEx32W accept a flag OR'd with the parameter
  140. // count to indicate the calling convention of the function in 32 bits.
  141. // For example, to call a cdecl function in 32-bits with 1 parameter, it would
  142. // look like this:
  143. //
  144. // dwResult = CallProcEx32W( CPEX_DEST_CDECL | 1, 0, dwfn32, p1 );
  145. //
  146. // TODO Variable argument list wrapper!
  147. (*
  148. function CallProcEx32W(nParams, fAddressConvert, lpProcAddress: DWORD): DWORD; cdecl;
  149. {$EXTERNALSYM CallProcEx32W}
  150. *)
  151. const
  152.   CPEX_DEST_STDCALL  = DWORD($00000000);
  153.   {$EXTERNALSYM CPEX_DEST_STDCALL}
  154.   CPEX_DEST_CDECL    = DWORD($80000000);
  155.   {$EXTERNALSYM CPEX_DEST_CDECL}
  156. implementation
  157. const
  158.   wow16lib = 'kernel32.dll';
  159. {$IFDEF DYNAMIC_LINK}
  160. var
  161.   _GetVDMPointer32W: Pointer;
  162. function GetVDMPointer32W;
  163. begin
  164.   GetProcedureAddress(_GetVDMPointer32W, wow16lib, '516');
  165.   asm
  166.     mov esp, ebp
  167.     pop ebp
  168.     jmp [_GetVDMPointer32W]
  169.   end;
  170. end;
  171. {$ELSE}
  172. function GetVDMPointer32W; external wow16lib index 516;
  173. {$ENDIF DYNAMIC_LINK}
  174. {$IFDEF DYNAMIC_LINK}
  175. var
  176.   _LoadLibraryEx32W: Pointer;
  177. function LoadLibraryEx32W;
  178. begin
  179.   GetProcedureAddress(_LoadLibraryEx32W, wow16lib, '513');
  180.   asm
  181.     mov esp, ebp
  182.     pop ebp
  183.     jmp [_LoadLibraryEx32W]
  184.   end;
  185. end;
  186. {$ELSE}
  187. function LoadLibraryEx32W; external wow16lib index 513;
  188. {$ENDIF DYNAMIC_LINK}
  189. {$IFDEF DYNAMIC_LINK}
  190. var
  191.   _GetProcAddress32W: Pointer;
  192. function GetProcAddress32W;
  193. begin
  194.   GetProcedureAddress(_GetProcAddress32W, wow16lib, '515');
  195.   asm
  196.     mov esp, ebp
  197.     pop ebp
  198.     jmp [_GetProcAddress32W]
  199.   end;
  200. end;
  201. {$ELSE}
  202. function GetProcAddress32W; external wow16lib index 515;
  203. {$ENDIF DYNAMIC_LINK}
  204. {$IFDEF DYNAMIC_LINK}
  205. var
  206.   _FreeLibrary32W: Pointer;
  207. function FreeLibrary32W;
  208. begin
  209.   GetProcedureAddress(_FreeLibrary32W, wow16lib, '514');
  210.   asm
  211.     mov esp, ebp
  212.     pop ebp
  213.     jmp [_FreeLibrary32W]
  214.   end;
  215. end;
  216. {$ELSE}
  217. function FreeLibrary32W; external wow16lib index 514;
  218. {$ENDIF DYNAMIC_LINK}
  219. //function CallProcEx32W; external wow16lib index 517;
  220. end.