Mmthunk.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:10k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. {========================================================================}
  2. {=                (c) 1995-98 SwiftSoft Ronald Dittrich                 =}
  3. {========================================================================}
  4. {=                          All Rights Reserved                         =}
  5. {========================================================================}
  6. {=  D 01099 Dresden             = Tel.: +0351-8012255                   =}
  7. {=  Loewenstr.7a                = info@swiftsoft.de                     =}
  8. {========================================================================}
  9. {=  Actual versions on http://www.swiftsoft.de/mmtools.html             =}
  10. {========================================================================}
  11. {=  This code is for reference purposes only and may not be copied or   =}
  12. {=  distributed in any format electronic or otherwise except one copy   =}
  13. {=  for backup purposes.                                                =}
  14. {=                                                                      =}
  15. {=  No Delphi Component Kit or Component individually or in a collection=}
  16. {=  subclassed or otherwise from the code in this unit, or associated   =}
  17. {=  .pas, .dfm, .dcu, .asm or .obj files may be sold or distributed     =}
  18. {=  without express permission from SwiftSoft.                          =}
  19. {=                                                                      =}
  20. {=  For more licence informations please refer to the associated        =}
  21. {=  HelpFile.                                                           =}
  22. {========================================================================}
  23. {=  $Date: 20.01.1998 - 18:00:00 $                                      =}
  24. {========================================================================}
  25. unit MMThunk;
  26. {$R-,S-,Q-,D+,L-}
  27. interface
  28. uses
  29.     Windows;
  30. const
  31.     ShowNTWarning: Boolean = True;
  32. type
  33.   THandle16 = Word;
  34. { Windows 95 undocumented routines. These won't be found in Windows NT }
  35. var
  36.    QT_Thunk: procedure; 
  37. //procedure QT_Thunk;
  38. function  LoadLibrary16(LibFileName: PChar): THandle; stdcall;
  39. procedure FreeLibrary16(LibModule: THandle); stdcall;
  40. function  GetProcAddress16(Module: THandle; ProcName: PChar): Pointer; stdcall;
  41. function  GlobalAlloc16(Flags: Integer; Bytes: Longint): THandle16; stdcall;
  42. function  GlobalFree16(Mem: THandle16): THandle16; stdcall;
  43. function  GlobalLock16(Mem: THandle16): Pointer; stdcall;
  44. function  GlobalUnLock16(Mem: THandle16): WordBool; stdcall;
  45. { Windows NT/95 documented but undeclared routines                       }
  46. { 16:16 -> 0:32 Pointer translation.                                     }
  47. {                                                                        }
  48. { WOWGetVDMPointer will convert the passed in 16-bit address             }
  49. { to the equivalent 32-bit flat pointer.  If fProtectedMode              }
  50. { is TRUE, the function treats the upper 16 bits as a selector           }
  51. { in the local descriptor table.  If fProtectedMode is FALSE,            }
  52. { the upper 16 bits are treated as a real-mode segment value.            }
  53. { In either case the lower 16 bits are treated as the offset.            }
  54. {                                                                        }
  55. { The return value is NULL if the selector is invalid.                   }
  56. {                                                                        }
  57. { NOTE:  Limit checking is not performed in the retail build             }
  58. { of Windows NT.  It is performed in the checked (debug) build           }
  59. { of WOW32.DLL, which will cause NULL to be returned when the            }
  60. { limit is exceeded by the supplied offset.                              }
  61. function WOWGetVDMPointer(vp, dwBytes: DWord;
  62.                           fProtectedMode: Bool): Pointer; stdcall;
  63. { The following two functions are here for compatibility with            }
  64. { Windows 95.  On Win95, the global heap can be rearranged,              }
  65. { invalidating flat pointers returned by WOWGetVDMPointer, while         }
  66. { a thunk is executing.  On Windows NT, the 16-bit VDM is completely     }
  67. { halted while a thunk executes, so the only way the heap will           }
  68. { be rearranged is if a callback is made to Win16 code.                  }
  69. {                                                                        }
  70. { The Win95 versions of these functions call GlobalFix to                }
  71. { lock down a segment's flat address, and GlobalUnfix to                 }
  72. { release the segment.                                                   }
  73. {                                                                        }
  74. { The Windows NT implementations of these functions do *not*             }
  75. { call GlobalFix/GlobalUnfix on the segment, because there               }
  76. { will not be any heap motion unless a callback occurs.                  }
  77. { If your thunk does callback to the 16-bit side, be sure                }
  78. { to discard flat pointers and call WOWGetVDMPointer again               }
  79. { to be sure the flat address is correct.                                }
  80. function WOWGetVDMPointerFix(vp, dwBytes: DWord;
  81.                              fProtectedMode: Bool): Pointer; stdcall;
  82. procedure WOWGetVDMPointerUnfix(vp: DWord); stdcall;
  83. { compound memory routines                                               }
  84. function GlobalAllocPtr16(Flags: Word; Bytes: Longint): Pointer;
  85. function GlobalAllocPointer16(Flags: Word; Bytes: Longint;
  86.          var FlatPointer: Pointer; var Source; DataSize: Longint): Pointer;
  87. function GlobalFreePtr16(P: Pointer): THandle16;
  88. { utility routines                                                       }
  89. function Ptr16To32(P: Pointer): Pointer;
  90. function Ptr16To32Fix(P: Pointer): Pointer;
  91. procedure Ptr16To32Unfix(P: Pointer);
  92. function GetAddress16(Module: HModule; ProcName: String): TFarProc;
  93. function LoadLib16(LibFileName: String): THandle;
  94. function GDI16Handle: THandle;
  95. function Kernel16Handle: THandle;
  96. function User16Handle: THandle;
  97. implementation
  98. uses
  99.     SysUtils, Classes, Dialogs;
  100. type
  101.     EInvalidArgument = class(EMathError);
  102.     EInvalidProc = class(Exception);
  103.     EThunkError = class(Exception);
  104. const
  105.     kernel32 = 'kernel32.dll';
  106.     wow32 = 'wow32.dll';
  107. { These routines are exported with no names, hence the use of index }
  108. { Microsoft has changed the index for QT_THUNK !!! }
  109. //procedure QT_Thunk;              external kernel32 index 561; //559;
  110. //procedure QT_Thunk; external kernel32 name 'QT_Thunk';
  111. function  LoadLibrary16;         external kernel32 index 35;
  112. procedure FreeLibrary16;         external kernel32 index 36;
  113. function  GetProcAddress16;      external kernel32 index 37;
  114. function  GlobalAlloc16;         external kernel32 index 24;
  115. function  GlobalFree16;          external kernel32 index 31;
  116. function  GlobalLock16;          external kernel32 index 25;
  117. function  GlobalUnLock16;        external kernel32 index 26;
  118. { These routines are exported with names, hence the normal use of name   }
  119. function  WOWGetVDMPointer;      external wow32 name 'WOWGetVDMPointer';
  120. function  WOWGetVDMPointerFix;   external wow32 name 'WOWGetVDMPointerFix';
  121. procedure WOWGetVDMPointerUnfix; external wow32 name 'WOWGetVDMPointerUnfix';
  122. {------------------------------------------------------------------------}
  123. function GlobalAllocPtr16(Flags: Word; Bytes: Longint): Pointer;
  124. begin
  125.   Result := nil;
  126.   //Ensure memory is fixed, meaning there is no need to lock it
  127.   Flags := Flags or gmem_Fixed;
  128.   LongRec(Result).Hi := GlobalAlloc16(Flags, Bytes);
  129. end;
  130. //16-bit pointer returned. FlatPointer is 32-bit pointer
  131. //Buffer is allocated and then DataSize bytes from Source
  132. //are copied in
  133. function GlobalAllocPointer16(Flags: Word; Bytes: Longint;
  134.          var FlatPointer: Pointer; var Source; DataSize: Longint): Pointer;
  135. begin
  136.   //Allocate memory in an address range
  137.   //that _can_ be accessed by 16-bit apps
  138.   Result := GlobalAllocPtr16(Flags, Bytes);
  139.   //Get 32-bit pointer to this memory
  140.   FlatPointer := Ptr16To32(Result);
  141.   //Copy source data into the new bimodal buffer
  142.   Move(Source, FlatPointer^, DataSize);
  143. end;
  144. function GlobalFreePtr16(P: Pointer): THandle16;
  145. begin
  146.   Result := GlobalFree16(LongRec(P).Hi);
  147. end;
  148. //Turn 16-bit pointer (selector and offset)
  149. //into 32-bit pointer (offset)
  150. function Ptr16To32(P: Pointer): Pointer;
  151. begin
  152.   Result := WOWGetVDMPointer(DWord(P), 0, True);
  153. end;
  154. function Ptr16To32Fix(P: Pointer): Pointer;
  155. begin
  156.   Result := WOWGetVDMPointerFix(DWord(P), 0, True);
  157. end;
  158. procedure Ptr16To32Unfix(P: Pointer);
  159. begin
  160.   WOWGetVDMPointerUnfix(DWord(P));
  161. end;
  162. function GetAddress16(Module: HModule; ProcName: String): TFarProc;
  163. begin
  164.   Result := GetProcAddress16(Module, PChar(ProcName));
  165.   if not Assigned(Result) then
  166.     raise EInvalidProc.Create('GetProcAddress16 failed');
  167. end;
  168. function LoadLib16(LibFileName: String): THandle;
  169. begin
  170.   Result := LoadLibrary16(PChar(LibFileName));
  171.   if Result < HInstance_Error then
  172.     raise EFOpenError.Create('LoadLibrary16 failed!');
  173. end;
  174. function GDI16Handle: THandle;
  175. begin
  176.   //Get GDI handle by loading it.
  177.   Result := LoadLib16('GDI.EXE');
  178.   //Free this particular load - GDI will stay in memory
  179.   FreeLibrary16(Result);
  180. end;
  181. function Kernel16Handle: THandle;
  182. begin
  183.   //Get Kernel handle by loading it.
  184.   Result := LoadLib16('KRNL386.EXE');
  185.   //Free this particular load - Kernel will stay in memory
  186.   FreeLibrary16(Result);
  187. end;
  188. function User16Handle: THandle;
  189. begin
  190.   //Get User handle by loading it.
  191.   Result := LoadLib16('USER.EXE');
  192.   //Free this particular load - User will stay in memory
  193.   FreeLibrary16(Result);
  194. end;
  195. var
  196.    hKernel: THANDLE;
  197. initialization
  198. //  if Win32Platform <> Ver_Platform_Win32_Windows then
  199. //    raise EThunkError.Create('Flat thunks only supported under Windows 95');
  200.   QT_THUNK := nil;
  201.   if Win32Platform = Ver_Platform_Win32_Windows then
  202.   begin
  203.      hKernel := GetModuleHandle('KERNEL32.DLL');
  204.      if (hKernel <> 0) then
  205.      begin
  206.         QT_THUNK := GetProcAddress(hKernel,'QT_Thunk');
  207.      end;
  208.   end;
  209. end.