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

Windows编程

开发平台:

Delphi

  1. {******************************************************************************}
  2. {                                                                       }
  3. { Windows Base Types 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: basetsd.h, released August 2001. The original Pascal   }
  9. { code is: WinType.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 JwaWinType;
  44. {$WEAKPACKAGEUNIT}
  45. {$HPPEMIT ''}
  46. {$HPPEMIT '#include "BaseTsd.h"'}
  47. {$HPPEMIT '#include "BaseTyps.h"'}
  48. {$HPPEMIT '#include "NtDef.h"'}
  49. {$HPPEMIT '#include "WinDef.h"'}
  50. {$HPPEMIT ''}
  51. {$HPPEMIT 'typedef LPVOID *LPLPVOID'}
  52. {$HPPEMIT 'typedef GUID TGUID'}
  53. {$HPPEMIT 'typedef GUID *LPGUID'}
  54. {$HPPEMIT 'typedef GUID CLSID'}
  55. {$HPPEMIT 'typedef HMODULE *PHMODULE'}
  56. {$HPPEMIT ''}
  57. {$I WINDEFINES.INC}
  58. interface
  59. uses
  60.   Windows, SysUtils; // TODO
  61. type
  62.   EJwaError = class (Exception)
  63.   end;
  64.   EJwaLoadLibraryError = class (EJwaError)
  65.   end;
  66.   EJwaGetProcAddressError = class (EJwaError)
  67.   end;
  68. procedure GetProcedureAddress(var P: Pointer; const ModuleName, ProcName: string);
  69. type
  70.   LPLPSTR = ^LPSTR;
  71.   {$NODEFINE LPLPSTR}
  72.   LPLPCSTR = ^LPCSTR;
  73.   {$NODEFINE LPLPCSTR}
  74.   LPLPCWSTR = ^LPCWSTR;
  75.   {$NODEFINE LPLPCWSTR}
  76.   LPLPWSTR = ^LPWSTR;
  77.   {$NODEFINE LPLPWSTR}
  78.   PPChar = ^PChar;
  79.   PPWideChar = ^PWideChar;
  80.   PPointer = ^Pointer;
  81.   GUID = TGUID;
  82.   {$NODEFINE GUID}
  83.   LPGUID = ^GUID;
  84.   {$NODEFINE LPGUID}
  85.   CLSID = TGUID;
  86.   {$NODEFINE CLSID}
  87. // ntdef.h
  88. type
  89. //typedef double DOUBLE;
  90.   PQuad = ^TQuad;
  91.   _QUAD = record                // QUAD is for those times we want
  92.     DoNotUseThisField: Double;  // an 8 byte aligned 8 byte long structure
  93.   end;                          // which is NOT really a floating point
  94.   {$EXTERNALSYM _QUAD}          // number.  Use DOUBLE if you want an FP number.
  95.   QUAD = _QUAD;
  96.   {$EXTERNALSYM QUAD}
  97.   TQuad = _QUAD;
  98. //
  99. // Unsigned Basics
  100. //
  101.   UCHAR = {$IFDEF USE_DELPHI_TYPES}Windows.UCHAR{$ELSE}Char{$ENDIF};
  102.   {$EXTERNALSYM UCHAR}
  103.   USHORT = Word;
  104.   {$EXTERNALSYM USHORT}
  105.   ULONG = {$IFDEF USE_DELPHI_TYPES}Windows.ULONG{$ELSE}Longword{$ENDIF};
  106.   {$EXTERNALSYM ULONG}
  107.   UQUAD = QUAD;
  108.   {$EXTERNALSYM UQUAD}
  109. //
  110. // __int64 is only supported by 2.0 and later midl.
  111. // __midl is set by the 2.0 midl and not by 1.0 midl.
  112. //
  113. type
  114.   LONGLONG = {$IFDEF USE_DELPHI_TYPES}Windows.LONGLONG{$ELSE}Int64{$ENDIF};
  115.   {$EXTERNALSYM LONGLONG}
  116.   ULONGLONG = Int64;
  117.   {$EXTERNALSYM ULONGLONG}
  118. const
  119.   MAXLONGLONG = $7fffffffffffffff;
  120.   {$EXTERNALSYM MAXLONGLONG}
  121. type
  122.   PLONGLONG = ^LONGLONG;
  123.   {$EXTERNALSYM PLONGLONG}
  124.   PULONGLONG = ^ULONGLONG;
  125.   {$EXTERNALSYM PULONGLONG}
  126.   BOOL = {$IFDEF USE_DELPHI_TYPES}Windows.BOOL{$ELSE}LongBool{$ENDIF};
  127.   {$EXTERNALSYM BOOL}
  128.   DWORD = {$IFDEF USE_DELPHI_TYPES}Windows.DWORD{$ELSE}Longword{$ENDIF};
  129.   {$EXTERNALSYM DWORD}
  130. const
  131.   ANYSIZE_ARRAY = 1;
  132.   {$EXTERNALSYM ANYSIZE_ARRAY}
  133.   MAX_NATURAL_ALIGNMENT = SizeOf(ULONG);
  134.   {$EXTERNALSYM MAX_NATURAL_ALIGNMENT}
  135. //
  136. // Void
  137. //
  138. type
  139.   PVOID = Pointer;
  140.   {$EXTERNALSYM PVOID}
  141.   PPVOID = ^PVOID;
  142.   {$EXTERNALSYM PPVOID}
  143.   PVOID64 = Pointer;
  144.   {$EXTERNALSYM PVOID64}
  145. //
  146. // Basics
  147. //
  148.   SHORT = {$IFDEF USE_DELPHI_TYPES}Windows.SHORT{$ELSE}Smallint{$ENDIF};
  149.   {$EXTERNALSYM SHORT}
  150.   LONG = Longint;
  151.   {$EXTERNALSYM LONG}
  152. //
  153. // UNICODE (Wide Character) types
  154. //
  155.   WCHAR = {$IFDEF USE_DELPHI_TYPES}Windows.WCHAR{$ELSE}WideChar{$ENDIF};
  156.   {$EXTERNALSYM WCHAR}
  157.   PWCHAR = {$IFDEF USE_DELPHI_TYPES}Windows.PWChar{$ELSE}^WCHAR{$ENDIF};
  158.   {$EXTERNALSYM PWCHAR}
  159.   LPWCH = ^WCHAR;
  160.   {$EXTERNALSYM LPWCH}
  161.   PWCH = ^WCHAR;
  162.   {$EXTERNALSYM PWCH}
  163.   LPCWCH = ^WCHAR;
  164.   {$EXTERNALSYM LPCWCH}
  165.   PCWCH = ^WCHAR;
  166.   {$EXTERNALSYM PCWCH}
  167.   NWPSTR = ^WCHAR;
  168.   {$EXTERNALSYM NWPSTR}
  169.   LPWSTR = {$IFDEF USE_DELPHI_TYPES}Windows.LPWSTR{$ELSE}^WCHAR{$ENDIF};
  170.   {$EXTERNALSYM LPWSTR}
  171.   LPCWSTR = {$IFDEF USE_DELPHI_TYPES}Windows.LPCWSTR{$ELSE}^WCHAR{$ENDIF};
  172.   {$EXTERNALSYM LPCWSTR}
  173.   PWSTR = {$IFDEF USE_DELPHI_TYPES}Windows.LPWSTR{$ELSE}^WCHAR{$ENDIF};
  174.   {$EXTERNALSYM PWSTR}
  175.   LPUWSTR = {$IFDEF USE_DELPHI_TYPES}Windows.LPWSTR{$ELSE}^WCHAR{$ENDIF};
  176.   {$EXTERNALSYM LPUWSTR}
  177.   PUWSTR = {$IFDEF USE_DELPHI_TYPES}Windows.LPWSTR{$ELSE}^WCHAR{$ENDIF};
  178.   {$EXTERNALSYM PUWSTR}
  179.   LCPUWSTR = {$IFDEF USE_DELPHI_TYPES}Windows.LPWSTR{$ELSE}^WCHAR{$ENDIF};
  180.   {$EXTERNALSYM LCPUWSTR}
  181.   PCUWSTR = {$IFDEF USE_DELPHI_TYPES}Windows.LPWSTR{$ELSE}^WCHAR{$ENDIF};
  182.   {$EXTERNALSYM PCUWSTR}
  183. //
  184. // ANSI (Multi-byte Character) types
  185. //
  186.   LPCH = ^CHAR;
  187.   {$EXTERNALSYM LPCH}
  188.   PCH = ^CHAR;
  189.   {$EXTERNALSYM PCH}
  190.   LPCCH = ^CHAR;
  191.   {$EXTERNALSYM LPCCH}
  192.   PCCH = ^CHAR;
  193.   {$EXTERNALSYM PCCH}
  194.   NPSTR = ^CHAR;
  195.   {$EXTERNALSYM NPSTR}
  196.   LPSTR = {$IFDEF USE_DELPHI_TYPES}Windows.LPSTR{$ELSE}^CHAR{$ENDIF};
  197.   {$EXTERNALSYM LPSTR}
  198.   PSTR = {$IFDEF USE_DELPHI_TYPES}PChar{$ELSE}^CHAR{$ENDIF};
  199.   {$EXTERNALSYM PSTR}
  200.   LPCSTR = {$IFDEF USE_DELPHI_TYPES}Windows.LPCSTR{$ELSE}^CHAR{$ENDIF};
  201.   {$EXTERNALSYM LPCSTR}
  202.   PCSTR = {$IFDEF USE_DELPHI_TYPES}PChar{$ELSE}^CHAR{$ENDIF};
  203.   {$EXTERNALSYM PCSTR}
  204. //
  205. // Neutral ANSI/UNICODE types and macros
  206. //
  207. {$IFDEF UNICODE}
  208.   TCHAR = WCHAR;
  209.   {$EXTERNALSYM TCHAR}
  210.   PTCHAR = ^TCHAR;
  211.   {$EXTERNALSYM PTCHAR}
  212.   TUCHAR = WCHAR;
  213.   {$EXTERNALSYM TUCHAR}
  214.   PTUCHAR = ^TUCHAR;
  215.   {$EXTERNALSYM PTUCHAR}
  216.   LPTCH = LPWSTR;
  217.   {$EXTERNALSYM LPTCH}
  218.   PTCH = LPWSTR;
  219.   {$EXTERNALSYM PTCH}
  220.   PTSTR = LPWSTR;
  221.   {$EXTERNALSYM PTSTR}
  222.   LPTSTR = {$IFDEF USE_DELPHI_TYPES}Windows.LPTSTR{$ELSE}LPWSTR{$ENDIF};
  223.   {$EXTERNALSYM LPTSTR}
  224.   PCTSTR = LPCWSTR;
  225.   {$EXTERNALSYM PCTSTR}
  226.   LPCTSTR = {$IFDEF USE_DELPHI_TYPES}Windows.LPCTSTR{$ELSE}LPCWSTR{$ENDIF};
  227.   {$EXTERNALSYM LPCTSTR}
  228.   PCUTSTR = {$IFDEF USE_DELPHI_TYPES}Windows.LPCTSTR{$ELSE}LPCWSTR{$ENDIF};
  229.   {$EXTERNALSYM PCUTSTR}
  230.   LPCUTSTR = {$IFDEF USE_DELPHI_TYPES}Windows.LPCTSTR{$ELSE}LPCWSTR{$ENDIF};
  231.   {$EXTERNALSYM LPCUTSTR}
  232.   PUTSTR = {$IFDEF USE_DELPHI_TYPES}Windows.LPCSTR{$ELSE}LPCWSTR{$ENDIF};
  233.   {$EXTERNALSYM PUTSTR}
  234.   LPUTSTR = {$IFDEF USE_DELPHI_TYPES}Windows.LPCSTR{$ELSE}LPCWSTR{$ENDIF};
  235.   {$EXTERNALSYM LPUTSTR}
  236.   __TEXT = WideString;
  237.   {$EXTERNALSYM __TEXT}
  238. {$ELSE}
  239.   TCHAR = CHAR;
  240.   {$EXTERNALSYM TCHAR}
  241.   PTCHAR = ^TCHAR;
  242.   {$EXTERNALSYM PTCHAR}
  243.   TUCHAR = CHAR;
  244.   {$EXTERNALSYM TUCHAR}
  245.   PTUCHAR = ^TUCHAR;
  246.   {$EXTERNALSYM PTUCHAR}
  247.   LPTCH = LPSTR;
  248.   {$EXTERNALSYM LPTCH}
  249.   PTCH = LPSTR;
  250.   {$EXTERNALSYM PTCH}
  251.   PTSTR = LPSTR;
  252.   {$EXTERNALSYM PTSTR}
  253.   LPTSTR = {$IFDEF USE_DELPHI_TYPES}Windows.LPTSTR{$ELSE}LPSTR{$ENDIF};
  254.   {$EXTERNALSYM LPTSTR}
  255.   PCTSTR = LPCSTR;
  256.   {$EXTERNALSYM PCTSTR}
  257.   LPCTSTR = {$IFDEF USE_DELPHI_TYPES}Windows.LPCTSTR{$ELSE}LPCSTR{$ENDIF};
  258.   {$EXTERNALSYM LPCTSTR}
  259.   PCUTSTR = {$IFDEF USE_DELPHI_TYPES}Windows.LPCSTR{$ELSE}LPCSTR{$ENDIF};
  260.   {$EXTERNALSYM PCUTSTR}
  261.   LPCUTSTR = {$IFDEF USE_DELPHI_TYPES}Windows.LPCSTR{$ELSE}LPCSTR{$ENDIF};
  262.   {$EXTERNALSYM LPCUTSTR}
  263.   PUTSTR = {$IFDEF USE_DELPHI_TYPES}Windows.LPCSTR{$ELSE}LPCSTR{$ENDIF};
  264.   {$EXTERNALSYM PUTSTR}
  265.   LPUTSTR = {$IFDEF USE_DELPHI_TYPES}Windows.LPCSTR{$ELSE}LPCSTR{$ENDIF};
  266.   {$EXTERNALSYM LPUTSTR}
  267.   __TEXT = AnsiString;
  268.   {$EXTERNALSYM __TEXT}
  269. {$ENDIF}
  270.   TEXT = __TEXT;
  271.   {$EXTERNALSYM TEXT}
  272. //
  273. // Pointer to Basics
  274. //
  275.   PSHORT = ^SHORT;
  276.   {$EXTERNALSYM PSHORT}
  277.   PLONG = ^LONG;
  278.   {$EXTERNALSYM PLONG}
  279. //
  280. // Pointer to Unsigned Basics
  281. //
  282.   PUCHAR = {$IFDEF USE_DELPHI_TYPES}Windows.PUCHAR{$ELSE}^UCHAR{$ENDIF};
  283.   {$EXTERNALSYM PUCHAR}
  284.   PUSHORT = ^USHORT;
  285.   {$EXTERNALSYM PUSHORT}
  286.   PULONG = {$IFDEF USE_DELPHI_TYPES}Windows.PULONG{$ELSE}^ULONG{$ENDIF};
  287.   {$EXTERNALSYM PULONG}
  288.   PUQUAD = ^UQUAD;
  289.   {$EXTERNALSYM PUQUAD}
  290. //
  291. // Signed characters
  292. //
  293.   SCHAR = Shortint;
  294.   {$EXTERNALSYM SCHAR}
  295.   PSCHAR = ^SCHAR;
  296.   {$EXTERNALSYM PSCHAR}
  297. //
  298. // Handle to an Object
  299. //
  300.   HANDLE = {$IFDEF USE_DELPHI_TYPES}Windows.THandle{$ELSE}Longword{$ENDIF};
  301.   {$EXTERNALSYM HANDLE}
  302.   PHANDLE = {$IFDEF USE_DELPHI_TYPES}Windows.PHandle{$ELSE}^HANDLE{$ENDIF};
  303.   {$EXTERNALSYM PHANDLE}
  304.   THandle = {$IFDEF USE_DELPHI_TYPES}Windows.THandle{$ELSE}HANDLE{$ENDIF};
  305. //
  306. // Flag (bit) fields
  307. //
  308.   FCHAR = UCHAR;
  309.   {$EXTERNALSYM FCHAR}
  310.   FSHORT = USHORT;
  311.   {$EXTERNALSYM FSHORT}
  312.   FLONG = ULONG;
  313.   {$EXTERNALSYM FLONG}
  314. // Component Object Model defines, and macros
  315.   HRESULT = System.HRESULT; // LONG;
  316.   {$EXTERNALSYM HRESULT}
  317. //
  318. // Low order two bits of a handle are ignored by the system and available
  319. // for use by application code as tag bits.  The remaining bits are opaque
  320. // and used to store a serial number and table index.
  321. //
  322. const
  323.   OBJ_HANDLE_TAGBITS = $00000003;
  324.   {$EXTERNALSYM OBJ_HANDLE_TAGBITS}
  325. //
  326. // Cardinal Data Types [0 - 2**N-2)
  327. //
  328. type
  329.   CCHAR = Char;
  330.   {$EXTERNALSYM CCHAR}
  331.   CSHORT = Shortint;
  332.   {$EXTERNALSYM CSHORT}
  333.   CLONG = ULONG;
  334.   {$EXTERNALSYM CLONG}
  335.   PCCHAR = ^CCHAR;
  336.   {$EXTERNALSYM PCCHAR}
  337.   PCSHORT = ^CSHORT;
  338.   {$EXTERNALSYM PCSHORT}
  339.   PCLONG = ^CLONG;
  340.   {$EXTERNALSYM PCLONG}
  341. //
  342. // NLS basics (Locale and Language Ids)
  343. //
  344.   LCID = {$IFDEF USE_DELPHI_TYPES}Windows.LCID{$ELSE}ULONG{$ENDIF};
  345.   {$EXTERNALSYM LCID}
  346.   PLCID = {$IFDEF USE_DELPHI_TYPES}^LCID{$ELSE}PULONG{$ENDIF};
  347.   {$EXTERNALSYM PLCID}
  348.   LANGID = {$IFDEF USE_DELPHI_TYPES}Windows.LANGID{$ELSE}USHORT{$ENDIF};
  349.   {$EXTERNALSYM LANGID}
  350.   PLANGID = ^LANGID; // TODO Not in original header (used in MSI)
  351. //
  352. // Logical Data Type - These are 32-bit logical values.
  353. //
  354.   LOGICAL = ULONG;
  355.   {$EXTERNALSYM LOGICAL}
  356.   PLOGICAL = ^ULONG;
  357.   {$EXTERNALSYM PLOGICAL}
  358. //
  359. // NTSTATUS
  360. //
  361.   NTSTATUS = LONG;
  362.   {$EXTERNALSYM NTSTATUS}
  363.   PNTSTATUS = ^NTSTATUS;
  364.   {$EXTERNALSYM PNTSTATUS}
  365.   TNTStatus = NTSTATUS;
  366. //
  367. //  Status values are 32 bit values layed out as follows:
  368. //
  369. //   3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
  370. //   1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
  371. //  +---+-+-------------------------+-------------------------------+
  372. //  |Sev|C|       Facility          |               Code            |
  373. //  +---+-+-------------------------+-------------------------------+
  374. //
  375. //  where
  376. //
  377. //      Sev - is the severity code
  378. //
  379. //          00 - Success
  380. //          01 - Informational
  381. //          10 - Warning
  382. //          11 - Error
  383. //
  384. //      C - is the Customer code flag
  385. //
  386. //      Facility - is the facility code
  387. //
  388. //      Code - is the facility's status code
  389. //
  390. //
  391. // Generic test for success on any status value (non-negative numbers
  392. // indicate success).
  393. //
  394. function NT_SUCCESS(Status: NTSTATUS): BOOL;
  395. {$EXTERNALSYM NT_SUCCESS}
  396. //
  397. // Generic test for information on any status value.
  398. //
  399. function NT_INFORMATION(Status: NTSTATUS): BOOL;
  400. {$EXTERNALSYM NT_INFORMATION}
  401. //
  402. // Generic test for warning on any status value.
  403. //
  404. function NT_WARNING(Status: NTSTATUS): BOOL;
  405. {$EXTERNALSYM NT_WARNING}
  406. //
  407. // Generic test for error on any status value.
  408. //
  409. function NT_ERROR(Status: NTSTATUS): BOOL;
  410. {$EXTERNALSYM NT_ERROR}
  411. const
  412.   APPLICATION_ERROR_MASK       = $20000000;
  413.   {$EXTERNALSYM APPLICATION_ERROR_MASK}
  414.   ERROR_SEVERITY_SUCCESS       = $00000000;
  415.   {$EXTERNALSYM ERROR_SEVERITY_SUCCESS}
  416.   ERROR_SEVERITY_INFORMATIONAL = $40000000;
  417.   {$EXTERNALSYM ERROR_SEVERITY_INFORMATIONAL}
  418.   ERROR_SEVERITY_WARNING       = DWORD($80000000);
  419.   {$EXTERNALSYM ERROR_SEVERITY_WARNING}
  420.   ERROR_SEVERITY_ERROR         = DWORD($C0000000);
  421.   {$EXTERNALSYM ERROR_SEVERITY_ERROR}
  422. //
  423. // Large (64-bit) integer types and operations
  424. //
  425. type
  426.   LPLARGE_INTEGER = ^LARGE_INTEGER;
  427.   {$EXTERNALSYM LPLARGE_INTEGER}
  428. {$IFDEF USE_DELPHI_TYPES}
  429.   _LARGE_INTEGER = Windows._LARGE_INTEGER;
  430.   LARGE_INTEGER = Windows.LARGE_INTEGER;
  431.   TLargeInteger = Windows.TLargeInteger;
  432. {$ELSE}
  433.   _LARGE_INTEGER = record
  434.     case Integer of
  435.     0: (
  436.       LowPart: DWORD;
  437.       HighPart: LONG);
  438.     1: (
  439.       QuadPart: LONGLONG);
  440.   end;
  441.   {$EXTERNALSYM _LARGE_INTEGER}
  442.   LARGE_INTEGER = _LARGE_INTEGER;
  443.   {$EXTERNALSYM LARGE_INTEGER}
  444.   TLargeInteger = LARGE_INTEGER;
  445. {$ENDIF}
  446.   PLARGE_INTEGER = ^LARGE_INTEGER;
  447.   {$EXTERNALSYM PLARGE_INTEGER}
  448.   PLargeInteger = LPLARGE_INTEGER;
  449.   LPULARGE_INTEGER = ^ULARGE_INTEGER;
  450.   {$EXTERNALSYM LPULARGE_INTEGER}
  451. {$IFDEF USE_DELPHI_TYPES}
  452.   ULARGE_INTEGER = Windows.ULARGE_INTEGER;
  453.   TULargeInteger = Windows.TULargeInteger;
  454.   PULargeInteger = Windows.PULargeInteger;
  455. {$ELSE}
  456.   ULARGE_INTEGER = record
  457.     case Integer of
  458.       0: (
  459.         LowPart: DWORD;
  460.         HighPart: DWORD);
  461.       1: (
  462.         QuadPart: LONGLONG);
  463.   end;
  464.   {$EXTERNALSYM ULARGE_INTEGER}
  465.   TULargeInteger = ULARGE_INTEGER;
  466.   PULargeInteger = LPULARGE_INTEGER;
  467. {$ENDIF}
  468.   PULARGE_INTEGER = ^ULARGE_INTEGER;
  469.   {$EXTERNALSYM PULARGE_INTEGER}
  470.   TIME = LARGE_INTEGER;
  471.   {$EXTERNALSYM TIME}
  472.   _TIME = _LARGE_INTEGER;
  473.   {$EXTERNALSYM _TIME}
  474.   PTIME = PLARGE_INTEGER;
  475.   {$EXTERNALSYM PTIME}
  476. //
  477. // _M_IX86 included so that EM CONTEXT structure compiles with
  478. // x86 programs. *** TBD should this be for all architectures?
  479. //
  480. //
  481. // 16 byte aligned type for 128 bit floats
  482. //
  483. //
  484. // For we define a 128 bit structure and use __declspec(align(16)) pragma to
  485. // align to 128 bits.
  486. //
  487. type
  488.   PFloat128 = ^TFloat128;
  489.   _FLOAT128 = record
  490.     LowPart: Int64;
  491.     HighPart: Int64;
  492.   end;
  493.   {$EXTERNALSYM _FLOAT128}
  494.   FLOAT128 = _FLOAT128;
  495.   {$EXTERNALSYM FLOAT128}
  496.   TFloat128 = FLOAT128;
  497. // Update Sequence Number
  498.   USN = LONGLONG;
  499.   {$EXTERNALSYM USN}
  500. //
  501. // Locally Unique Identifier
  502. //
  503. type
  504.   PLuid = ^LUID;
  505.   _LUID = record
  506.     LowPart: DWORD;
  507.     HighPart: LONG;
  508.   end;
  509.   {$EXTERNALSYM _LUID}
  510.   LUID = _LUID;
  511.   {$EXTERNALSYM LUID}  
  512.   TLuid = LUID;
  513.   DWORDLONG = ULONGLONG;
  514.   {$EXTERNALSYM DWORDLONG}
  515.   PDWORDLONG = ^DWORDLONG;
  516.   {$EXTERNALSYM PDWORDLONG}
  517. //
  518. // Physical address.
  519. //
  520.   PHYSICAL_ADDRESS = LARGE_INTEGER;
  521.   {$EXTERNALSYM PHYSICAL_ADDRESS}
  522.   PPHYSICAL_ADDRESS = ^LARGE_INTEGER;
  523.   {$EXTERNALSYM PPHYSICAL_ADDRESS}
  524. //
  525. // Define operations to logically shift an int64 by 0..31 bits and to multiply
  526. // 32-bits by 32-bits to form a 64-bit product.
  527. //
  528. //
  529. // The x86 C compiler understands inline assembler. Therefore, inline functions
  530. // that employ inline assembler are used for shifts of 0..31.  The multiplies
  531. // rely on the compiler recognizing the cast of the multiplicand to int64 to
  532. // generate the optimal code inline.
  533. //
  534. function Int32x32To64(a, b: LONG): LONGLONG;
  535. {$EXTERNALSYM Int32x32To64}
  536. function UInt32x32To64(a, b: DWORD): ULONGLONG;
  537. {$EXTERNALSYM UInt32x32To64}
  538. function Int64ShllMod32(Value: ULONGLONG; ShiftCount: DWORD): ULONGLONG;
  539. {$EXTERNALSYM Int64ShllMod32}
  540. function Int64ShraMod32(Value: LONGLONG; ShiftCount: DWORD): LONGLONG;
  541. {$EXTERNALSYM Int64ShraMod32}
  542. function Int64ShrlMod32(Value: ULONGLONG; ShiftCount: DWORD): ULONGLONG;
  543. {$EXTERNALSYM Int64ShrlMod32}
  544. //
  545. // Event type
  546. //
  547. type
  548.   _EVENT_TYPE = (NotificationEvent, SynchronizationEvent);
  549.   {$EXTERNALSYM _EVENT_TYPE}
  550.   EVENT_TYPE = _EVENT_TYPE;
  551.   {$EXTERNALSYM EVENT_TYPE}
  552.   TEventType = _EVENT_TYPE;
  553. //
  554. // Timer type
  555. //
  556.   _TIMER_TYPE = (NotificationTimer, SynchronizationTimer);
  557.   {$EXTERNALSYM _TIMER_TYPE}
  558.   TIMER_TYPE = _TIMER_TYPE;
  559.   {$EXTERNALSYM TIMER_TYPE}
  560. //
  561. // Wait type
  562. //
  563.   _WAIT_TYPE = (WaitAll, WaitAny);
  564.   {$EXTERNALSYM _WAIT_TYPE}
  565.   WAIT_TYPE = _WAIT_TYPE;
  566.   {$EXTERNALSYM WAIT_TYPE}
  567. //
  568. // Pointer to an Asciiz string
  569. //
  570.   PSZ = ^CHAR;
  571.   {$EXTERNALSYM PSZ}
  572.   PCSZ = ^CHAR;
  573.   {$EXTERNALSYM PCSZ}
  574. //
  575. // Counted String
  576. //
  577.   PString = ^TString;
  578.   _STRING = record
  579.     Length: USHORT;
  580.     MaximumLength: USHORT;
  581.     Buffer: PCHAR;
  582.   end;
  583.   {$EXTERNALSYM _STRING}
  584.   TString = _STRING;
  585.   ANSI_STRING = _STRING;
  586.   {$EXTERNALSYM ANSI_STRING}
  587.   PANSI_STRING = PSTRING;
  588.   {$EXTERNALSYM PANSI_STRING}
  589.   OEM_STRING = _STRING;
  590.   {$EXTERNALSYM OEM_STRING}
  591.   POEM_STRING = PSTRING;
  592.   {$EXTERNALSYM POEM_STRING}
  593. //
  594. // CONSTCounted String
  595. //
  596.   PCString = ^CSTRING;
  597.   _CSTRING = record
  598.     Length: USHORT;
  599.     MaximumLength: USHORT;
  600.     Buffer: PCHAR;
  601.   end;
  602.   {$EXTERNALSYM _CSTRING}
  603.   CSTRING = _CSTRING;
  604.   {$EXTERNALSYM CSTRING}
  605.   TCString = CSTRING;
  606. const
  607.   ANSI_NULL = CHAR(0);
  608.   {$EXTERNALSYM ANSI_NULL}
  609.   UNICODE_NULL = WCHAR(0);
  610.   {$EXTERNALSYM UNICODE_NULL}
  611.   UNICODE_STRING_MAX_BYTES = WORD(65534);
  612.   {$EXTERNALSYM UNICODE_STRING_MAX_BYTES}
  613.   UNICODE_STRING_MAX_CHARS = 32767;
  614.   {$EXTERNALSYM UNICODE_STRING_MAX_CHARS}
  615. type
  616.   CANSI_STRING = _STRING;
  617.   {$EXTERNALSYM CANSI_STRING}
  618.   PCANSI_STRING = PSTRING;
  619.   {$EXTERNALSYM PCANSI_STRING}
  620. //
  621. // Unicode strings are counted 16-bit character strings. If they are
  622. // NULL terminated, Length does not include trailing NULL.
  623. //
  624. type
  625.   PUNICODE_STRING = ^UNICODE_STRING;
  626.   {$EXTERNALSYM PUNICODE_STRING}
  627.   _UNICODE_STRING = record
  628.     Length: USHORT;
  629.     MaximumLength: USHORT;
  630.     Buffer: PWSTR;
  631.   end;
  632.   {$EXTERNALSYM _UNICODE_STRING}
  633.   UNICODE_STRING = _UNICODE_STRING;
  634.   {$EXTERNALSYM UNICODE_STRING}
  635.   PCUNICODE_STRING = ^UNICODE_STRING;
  636.   {$EXTERNALSYM PCUNICODE_STRING}
  637.   TUnicodeString = UNICODE_STRING;
  638.   PUnicodeString = PUNICODE_STRING;
  639. //
  640. // Boolean
  641. //
  642. type
  643. //typedef UCHAR BOOLEAN;
  644.   PBOOLEAN = ^ByteBool;
  645.   {$EXTERNALSYM PBOOLEAN}
  646. //
  647. //  Doubly linked list structure.  Can be used as either a list head, or
  648. //  as link words.
  649. //
  650. type
  651.   PLIST_ENTRY = ^LIST_ENTRY;
  652.   {$EXTERNALSYM PLIST_ENTRY}
  653. {$IFDEF USE_DELPHI_TYPES}
  654.   _LIST_ENTRY = Windows._LIST_ENTRY;
  655.   LIST_ENTRY = Windows.LIST_ENTRY;
  656.   TListEntry = Windows.TListEntry;
  657.   PListEntry = Windows.PListEntry;
  658. {$ELSE}
  659.   _LIST_ENTRY = record
  660.     Flink: PLIST_ENTRY;
  661.     Blink: PLIST_ENTRY;
  662.   end;
  663.   {$EXTERNALSYM _LIST_ENTRY}
  664.   LIST_ENTRY = _LIST_ENTRY;
  665.   {$EXTERNALSYM LIST_ENTRY}
  666.   TListEntry = LIST_ENTRY;
  667.   PListEntry = PLIST_ENTRY;
  668. {$ENDIF}
  669.   PRLIST_ENTRY = ^LIST_ENTRY;
  670.   {$EXTERNALSYM PLIST_ENTRY}
  671. //
  672. //  Singly linked list structure. Can be used as either a list head, or
  673. //  as link words.
  674. //
  675.   PSINGLE_LIST_ENTRY = ^SINGLE_LIST_ENTRY;
  676.   {$EXTERNALSYM PSINGLE_LIST_ENTRY}
  677.   _SINGLE_LIST_ENTRY = record
  678.     Next: PSINGLE_LIST_ENTRY;
  679.   end;
  680.   {$EXTERNALSYM _SINGLE_LIST_ENTRY}
  681.   SINGLE_LIST_ENTRY = _SINGLE_LIST_ENTRY;
  682.   {$EXTERNALSYM SINGLE_LIST_ENTRY}
  683.   TSingleListEntry = SINGLE_LIST_ENTRY;
  684.   PSingleListEntry = PSINGLE_LIST_ENTRY;
  685. //
  686. // These are needed for portable debugger support.
  687. //
  688.   PLIST_ENTRY32 = ^LIST_ENTRY32;
  689.   {$EXTERNALSYM PLIST_ENTRY32}  
  690.   {$EXTERNALSYM PLIST_ENTRY32}
  691.   LIST_ENTRY32 = record
  692.     Flink: DWORD;
  693.     Blink: DWORD;
  694.   end;
  695.   {$EXTERNALSYM LIST_ENTRY32}
  696.   TListEntry32 = LIST_ENTRY32;
  697.   PListEntry32 = PLIST_ENTRY32;
  698.   PLIST_ENTRY64 = ^LIST_ENTRY64;
  699.   {$EXTERNALSYM PLIST_ENTRY64}
  700.   LIST_ENTRY64 = record
  701.     Flink: ULONGLONG;
  702.     Blink: ULONGLONG;
  703.   end;
  704.   {$EXTERNALSYM LIST_ENTRY64}
  705.   TListEntry64 = LIST_ENTRY64;
  706.   PListEntry64 = PLIST_ENTRY64;
  707. procedure ListEntry32To64(l32: PLIST_ENTRY32; l64: PLIST_ENTRY64);
  708. {$EXTERNALSYM ListEntry32To64}
  709. procedure ListEntry64To32(l64: PLIST_ENTRY64; l32: PLIST_ENTRY32);
  710. {$EXTERNALSYM ListEntry64To32}
  711. //
  712. // These macros are used to walk lists on a target system
  713. //
  714. {
  715. #define CONTAINING_RECORD32(address, type, field) ( 
  716.                                                   (ULONG_PTR)(address) - 
  717.                                                   (ULONG_PTR)(&((type *)0)->field))
  718. #define CONTAINING_RECORD64(address, type, field) ( 
  719.                                                   (ULONGLONG)(address) - 
  720.                                                   (ULONGLONG)(&((type *)0)->field))
  721. }
  722. type
  723.   PString32 = ^STRING32;
  724.   _STRING32 = record
  725.     Length: USHORT;
  726.     MaximumLength: USHORT;
  727.     Buffer: ULONG;
  728.   end;
  729.   {$EXTERNALSYM _STRING32}
  730.   STRING32 = _STRING32;
  731.   {$EXTERNALSYM STRING32}
  732.   TString32 = STRING32;
  733.   UNICODE_STRING32 = STRING32;
  734.   {$EXTERNALSYM UNICODE_STRING32}
  735.   PUNICODE_STRING32 = ^UNICODE_STRING32;
  736.   {$EXTERNALSYM PUNICODE_STRING32}
  737.   ANSI_STRING32 = STRING32;
  738.   {$EXTERNALSYM ANSI_STRING32}
  739.   PANSI_STRING32 = ^ANSI_STRING32;
  740.   {$EXTERNALSYM PANSI_STRING32}
  741.   PString64 = ^STRING64;
  742.   _STRING64 = record
  743.     Length: USHORT;
  744.     MaximumLength: USHORT;
  745.     Buffer: ULONGLONG;
  746.   end;
  747.   {$EXTERNALSYM _STRING64}
  748.   STRING64 = _STRING64;
  749.   {$EXTERNALSYM STRING64}
  750.   TString64 = STRING64;
  751.   UNICODE_STRING64 = STRING64;
  752.   {$EXTERNALSYM UNICODE_STRING64}
  753.   PUNICODE_STRING64 = ^UNICODE_STRING64;
  754.   {$EXTERNALSYM PUNICODE_STRING64}
  755.   ANSI_STRING64 = STRING64;
  756.   {$EXTERNALSYM ANSI_STRING64}
  757.   PANSI_STRING64 = ^ANSI_STRING64;
  758.   {$EXTERNALSYM PANSI_STRING64}
  759. //
  760. // Valid values for the Attributes field
  761. //
  762. const
  763.   OBJ_INHERIT          = $00000002;
  764.   {$EXTERNALSYM OBJ_INHERIT}
  765.   OBJ_PERMANENT        = $00000010;
  766.   {$EXTERNALSYM OBJ_PERMANENT}
  767.   OBJ_EXCLUSIVE        = $00000020;
  768.   {$EXTERNALSYM OBJ_EXCLUSIVE}
  769.   OBJ_CASE_INSENSITIVE = $00000040;
  770.   {$EXTERNALSYM OBJ_CASE_INSENSITIVE}
  771.   OBJ_OPENIF           = $00000080;
  772.   {$EXTERNALSYM OBJ_OPENIF}
  773.   OBJ_OPENLINK         = $00000100;
  774.   {$EXTERNALSYM OBJ_OPENLINK}
  775.   OBJ_KERNEL_HANDLE    = $00000200;
  776.   {$EXTERNALSYM OBJ_KERNEL_HANDLE}
  777.   OBJ_VALID_ATTRIBUTES = $000003F2;
  778.   {$EXTERNALSYM OBJ_VALID_ATTRIBUTES}
  779. //
  780. // Object Attributes structure
  781. //
  782. type
  783.   POBJECT_ATTRIBUTES = ^OBJECT_ATTRIBUTES;
  784.   {$EXTERNALSYM POBJECT_ATTRIBUTES}
  785.   _OBJECT_ATTRIBUTES = record
  786.     Length: ULONG;
  787.     RootDirectory: HANDLE;
  788.     ObjectName: PUNICODE_STRING;
  789.     Attributes: ULONG;
  790.     SecurityDescriptor: PVOID;       // Points to type SECURITY_DESCRIPTOR
  791.     SecurityQualityOfService: PVOID; // Points to type SECURITY_QUALITY_OF_SERVICE
  792.   end;
  793.   {$EXTERNALSYM _OBJECT_ATTRIBUTES}
  794.   OBJECT_ATTRIBUTES = _OBJECT_ATTRIBUTES;
  795.   {$EXTERNALSYM OBJECT_ATTRIBUTES}
  796.   TObjectAttributes = OBJECT_ATTRIBUTES;
  797.   PObjectAttributes = POBJECT_ATTRIBUTES;
  798. procedure InitializeObjectAttributes(p: POBJECT_ATTRIBUTES; n: PUNICODE_STRING;
  799.   a: ULONG; r: HANDLE; s: PVOID{PSECURITY_DESCRIPTOR});
  800. {$EXTERNALSYM InitializeObjectAttributes}
  801. //
  802. // Constants
  803. //
  804. const
  805. //#define FALSE   0
  806. //#define TRUE    1
  807.   NULL   = 0;
  808.   {$EXTERNALSYM NULL}
  809.   NULL64 = 0;
  810.   {$EXTERNALSYM NULL64}
  811. //#include <guiddef.h>
  812. type
  813.   PObjectId = ^OBJECTID;
  814.   _OBJECTID = record  // size is 20
  815.     Lineage: GUID;
  816.     Uniquifier: ULONG;
  817.   end;
  818.   {$EXTERNALSYM _OBJECTID}
  819.   OBJECTID = _OBJECTID;
  820.   {$EXTERNALSYM OBJECTID}
  821.   TObjectId = OBJECTID;
  822. const
  823.   MINCHAR   = $80;
  824.   {$EXTERNALSYM MINCHAR}
  825.   MAXCHAR   = $7f;
  826.   {$EXTERNALSYM MAXCHAR}
  827.   MINSHORT  = $8000;
  828.   {$EXTERNALSYM MINSHORT}
  829.   MAXSHORT  = $7fff;
  830.   {$EXTERNALSYM MAXSHORT}
  831.   MINLONG   = DWORD($80000000);
  832.   {$EXTERNALSYM MINLONG}
  833.   MAXLONG   = $7fffffff;
  834.   {$EXTERNALSYM MAXLONG}
  835.   MAXUCHAR  = $ff;
  836.   {$EXTERNALSYM MAXUCHAR}
  837.   MAXUSHORT = $ffff;
  838.   {$EXTERNALSYM MAXUSHORT}
  839.   MAXULONG  = DWORD($ffffffff);
  840.   {$EXTERNALSYM MAXULONG}
  841. //
  842. // Useful Helper Macros
  843. //
  844. //
  845. // Determine if an argument is present by testing the value of the pointer
  846. // to the argument value.
  847. //
  848. function ARGUMENT_PRESENT(ArgumentPointer: Pointer): BOOL;
  849. {$EXTERNALSYM ARGUMENT_PRESENT}
  850. //
  851. // Exception handler routine definition.
  852. //
  853. // struct _CONTEXT;
  854. // struct _EXCEPTION_RECORD;
  855. //type
  856. //  PEXCEPTION_ROUTINE = function (ExceptionRecord: LP_EXCEPTION_RECORD;
  857. //    EstablisherFrame: PVOID; ContextRecord: LPCONTEXT;
  858. //    DispatcherContext: PVOID): EXCEPTION_DISPOSITION; stdcall;
  859. //  {$EXTERNALSYM PEXCEPTION_ROUTINE}
  860. //
  861. // Interrupt Request Level (IRQL)
  862. //
  863. type
  864.   KIRQL = UCHAR;
  865.   {$EXTERNALSYM KIRQL}
  866.   PKIRQL = ^KIRQL;
  867.   {$EXTERNALSYM PKIRQL}
  868. //
  869. // Product types
  870. //
  871.   _NT_PRODUCT_TYPE = (Filler0, NtProductWinNt, NtProductLanManNt, NtProductServer);
  872.   {$EXTERNALSYM _NT_PRODUCT_TYPE}
  873.   NT_PRODUCT_TYPE = _NT_PRODUCT_TYPE;
  874.   {$EXTERNALSYM NT_PRODUCT_TYPE}
  875.   PNT_PRODUCT_TYPE = ^NT_PRODUCT_TYPE;
  876.   TNtProductType = _NT_PRODUCT_TYPE;
  877. //
  878. // the bit mask, SharedUserData->SuiteMask, is a ULONG
  879. // so there can be a maximum of 32 entries
  880. // in this enum.
  881. //
  882. type
  883.   _SUITE_TYPE = (
  884.     SmallBusiness,
  885.     Enterprise,
  886.     BackOffice,
  887.     CommunicationServer,
  888.     TerminalServer,
  889.     SmallBusinessRestricted,
  890.     EmbeddedNT,
  891.     DataCenter,
  892.     SingleUserTS,
  893.     MaxSuiteType);
  894.   {$EXTERNALSYM _SUITE_TYPE}
  895.   SUITE_TYPE = _SUITE_TYPE;
  896.   {$EXTERNALSYM SUITE_TYPE}
  897.   TSuiteType = SUITE_TYPE;
  898. const
  899.   VER_SERVER_NT                      = DWORD($80000000);
  900.   {$EXTERNALSYM VER_SERVER_NT}
  901.   VER_WORKSTATION_NT                 = $40000000;
  902.   {$EXTERNALSYM VER_WORKSTATION_NT}
  903.   VER_SUITE_SMALLBUSINESS            = $00000001;
  904.   {$EXTERNALSYM VER_SUITE_SMALLBUSINESS}
  905.   VER_SUITE_ENTERPRISE               = $00000002;
  906.   {$EXTERNALSYM VER_SUITE_ENTERPRISE}
  907.   VER_SUITE_BACKOFFICE               = $00000004;
  908.   {$EXTERNALSYM VER_SUITE_BACKOFFICE}
  909.   VER_SUITE_COMMUNICATIONS           = $00000008;
  910.   {$EXTERNALSYM VER_SUITE_COMMUNICATIONS}
  911.   VER_SUITE_TERMINAL                 = $00000010;
  912.   {$EXTERNALSYM VER_SUITE_TERMINAL}
  913.   VER_SUITE_SMALLBUSINESS_RESTRICTED = $00000020;
  914.   {$EXTERNALSYM VER_SUITE_SMALLBUSINESS_RESTRICTED}
  915.   VER_SUITE_EMBEDDEDNT               = $00000040;
  916.   {$EXTERNALSYM VER_SUITE_EMBEDDEDNT}
  917.   VER_SUITE_DATACENTER               = $00000080;
  918.   {$EXTERNALSYM VER_SUITE_DATACENTER}
  919.   VER_SUITE_SINGLEUSERTS             = $00000100;
  920.   {$EXTERNALSYM VER_SUITE_SINGLEUSERTS}
  921.   VER_SUITE_PERSONAL                 = $00000200;
  922.   {$EXTERNALSYM VER_SUITE_PERSONAL}
  923.   VER_SUITE_BLADE                    = $00000400;
  924.   {$EXTERNALSYM VER_SUITE_BLADE}
  925. // ntdef.h
  926. type
  927.   error_status_t = Longword;
  928.   {$EXTERNALSYM error_status_t}
  929.   wchar_t = Word;
  930.   {$EXTERNALSYM wchar_t}
  931. //
  932. // The following types are guaranteed to be signed and 32 bits wide.
  933. //
  934. type
  935.   INT_PTR = Integer;
  936.   {$EXTERNALSYM INT_PTR}
  937.   PINT_PTR = ^INT_PTR;
  938.   {$EXTERNALSYM PINT_PTR}
  939.   UINT_PTR = Longword;
  940.   {$EXTERNALSYM UINT_PTR}
  941.   PUINT_PTR = ^UINT_PTR;
  942.   {$EXTERNALSYM PUINT_PTR}
  943.   LONG_PTR = Longint;
  944.   {$EXTERNALSYM LONG_PTR}
  945.   PLONG_PTR = ^LONG_PTR;
  946.   {$EXTERNALSYM PLONG_PTR}
  947.   ULONG_PTR = Longword;
  948.   {$EXTERNALSYM ULONG_PTR}
  949.   PULONG_PTR = ^PULONG_PTR;
  950.   {$EXTERNALSYM PULONG_PTR}
  951.   LONG32 = Integer;
  952.   {$EXTERNALSYM LONG32}
  953.   PLONG32 = ^LONG32;
  954.   {$EXTERNALSYM PLONG32}
  955.   INT32 = Integer;
  956.   {$EXTERNALSYM INT32}
  957.   PINT32 = ^INT32;
  958.   {$EXTERNALSYM PINT32}
  959. //
  960. // The following types are guaranteed to be unsigned and 32 bits wide.
  961. //
  962.   ULONG32 = Longword;
  963.   {$EXTERNALSYM ULONG32}
  964.   PULONG32 = ^ULONG32;
  965.   {$EXTERNALSYM PULONG32}
  966.   DWORD32 = Longword;
  967.   {$EXTERNALSYM DWORD32}
  968.   PDWORD32 = ^DWORD32;
  969.   {$EXTERNALSYM PDWORD32}
  970.   UINT32 = Longword;
  971.   {$EXTERNALSYM UINT32}
  972.   PUINT32 = ^UINT32;
  973.   {$EXTERNALSYM PUINT32}
  974. const
  975.   MAX_PATH = 260;
  976.   {$EXTERNALSYM MAX_PATH}
  977. type
  978. //unsigned char       BYTE;
  979. //unsigned short      WORD;
  980.   FLOAT = Single;
  981.   {$EXTERNALSYM FLOAT}
  982.   PFLOAT = ^FLOAT;
  983.   {$EXTERNALSYM PFLOAT}
  984.   PBOOL = {$IFDEF USE_DELPHI_TYPES}Windows.PBOOL{$ELSE}^BOOL{$ENDIF};
  985.   {$EXTERNALSYM PBOOL}
  986.   LPBOOL = {$IFDEF USE_DELPHI_TYPES}Windows.PBOOL{$ELSE}^BOOL{$ENDIF};
  987.   {$EXTERNALSYM LPBOOL}
  988.   PBYTE = {$IFDEF USE_DELPHI_TYPES}Windows.PBYTE{$ELSE}^BYTE{$ENDIF};
  989.   {$EXTERNALSYM PBYTE}
  990.   LPBYTE = {$IFDEF USE_DELPHI_TYPES}Windows.PBYTE{$ELSE}^BYTE{$ENDIF};
  991.   {$EXTERNALSYM LPBYTE}
  992.   PINT = {$IFDEF USE_DELPHI_TYPES}Windows.PINT{$ELSE}^INT{$ENDIF};
  993.   {$EXTERNALSYM PINT}
  994.   PUINT = {$IFDEF USE_DELPHI_TYPES}Windows.PUINT{$ELSE}^UINT{$ENDIF};
  995.   {$EXTERNALSYM PUINT}
  996.   LPUINT = {$IFDEF USE_DELPHI_TYPES}Windows.PUINT{$ELSE}^UINT{$ENDIF};
  997.   {$EXTERNALSYM LPUINT}
  998.   LPINT = {$IFDEF USE_DELPHI_TYPES}Windows.PINT{$ELSE}^INT{$ENDIF};
  999.   {$EXTERNALSYM LPINT}
  1000.   PWORD = {$IFDEF USE_DELPHI_TYPES}Windows.PWORD{$ELSE}^WORD{$ENDIF};
  1001.   {$EXTERNALSYM PWORD}
  1002.   LPWORD = {$IFDEF USE_DELPHI_TYPES}Windows.PWORD{$ELSE}^WORD{$ENDIF};
  1003.   {$EXTERNALSYM LPWORD}
  1004.   LPLONG = ^LONG;
  1005.   {$EXTERNALSYM LPLONG}
  1006.   PDWORD = {$IFDEF USE_DELPHI_TYPES}Windows.PDWORD{$ELSE}^DWORD{$ENDIF};
  1007.   {$EXTERNALSYM PDWORD}
  1008.   LPDWORD = {$IFDEF USE_DELPHI_TYPES}Windows.LPDWORD{$ELSE}^DWORD{$ENDIF};
  1009.   {$EXTERNALSYM LPDWORD}
  1010.   LPVOID = Pointer;
  1011.   {$EXTERNALSYM LPVOID}
  1012.   LPCVOID = Pointer;
  1013.   {$EXTERNALSYM LPCVOID}
  1014.   LPLPVOID = ^LPVOID;
  1015.   {$NODEFINE LPVOID}
  1016.   INT = Integer;
  1017.   {$EXTERNALSYM INT}
  1018.   UINT = {$IFDEF USE_DELPHI_TYPES}Windows.UINT{$ELSE}Longword{$ENDIF};
  1019.   {$EXTERNALSYM UINT}
  1020. // Types use for passing & returning polymorphic values
  1021.   WPARAM = {$IFDEF USE_DELPHI_TYPES}Windows.WPARAM{$ELSE}UINT_PTR{$ENDIF};
  1022.   {$EXTERNALSYM WPARAM}
  1023.   LPARAM = {$IFDEF USE_DELPHI_TYPES}Windows.LPARAM{$ELSE}LONG_PTR{$ENDIF};
  1024.   {$EXTERNALSYM LPARAM}
  1025.   LRESULT = {$IFDEF USE_DELPHI_TYPES}Windows.LRESULT{$ELSE}LONG_PTR{$ENDIF};
  1026.   {$EXTERNALSYM LRESULT}
  1027. function MAKEWORD(a, b: BYTE): WORD;
  1028. {$EXTERNALSYM MAKEWORD}
  1029. function MAKELONG(a, b: WORD): DWORD;
  1030. {$EXTERNALSYM MAKELONG}
  1031. function LOWORD(L: DWORD): WORD;
  1032. {$EXTERNALSYM LOWORD}
  1033. function HIWORD(L: DWORD): WORD;
  1034. {$EXTERNALSYM HIWORD}
  1035. function LOBYTE(W: WORD): BYTE;
  1036. {$EXTERNALSYM LOBYTE}
  1037. function HIBYTE(W: WORD): BYTE;
  1038. {$EXTERNALSYM HIBYTE}
  1039. type
  1040.   HWND = {$IFDEF USE_DELPHI_TYPES}Windows.HWND{$ELSE}HANDLE{$ENDIF};
  1041.   {$EXTERNALSYM HWND}
  1042.   LPHWND = ^HWND;
  1043.   {$EXTERNALSYM LPHWND}
  1044.   HHOOK = {$IFDEF USE_DELPHI_TYPES}Windows.HHOOK{$ELSE}HANDLE{$ENDIF};
  1045.   {$EXTERNALSYM HHOOK}
  1046.   LPHHOOK = ^HHOOK;
  1047.   {$EXTERNALSYM LPHHOOK}
  1048.   HEVENT = HANDLE;
  1049.   {$EXTERNALSYM HEVENT}
  1050.   ATOM = {$IFDEF USE_DELPHI_TYPES}Windows.ATOM{$ELSE}WORD{$ENDIF};
  1051.   {$EXTERNALSYM ATOM}
  1052.   SPHANDLE = ^HANDLE;
  1053.   {$EXTERNALSYM SPHANDLE}
  1054.   LPHANDLE = ^HANDLE;
  1055.   {$EXTERNALSYM LPHANDLE}
  1056.   HGLOBAL = {$IFDEF USE_DELPHI_TYPES}Windows.HGLOBAL{$ELSE}HANDLE{$ENDIF};
  1057.   {$EXTERNALSYM HGLOBAL}
  1058.   HLOCAL = {$IFDEF USE_DELPHI_TYPES}Windows.HLOCAL{$ELSE}HANDLE{$ENDIF};
  1059.   {$EXTERNALSYM HLOCAL}
  1060.   GLOBALHANDLE = HANDLE;
  1061.   {$EXTERNALSYM GLOBALHANDLE}
  1062.   //LOCALHANDLE = HANDLE; // todo clashes with WinBase.LocalHandle function
  1063.   //{$EXTERNALSYM LOCALHANDLE}
  1064.   FARPROC = {$IFDEF USE_DELPHI_TYPES}Windows.FARPROC{$ELSE}function: Integer{$ENDIF};
  1065.   {$EXTERNALSYM FARPROC}
  1066.   NEARPROC = function: Integer; stdcall;
  1067.   {$EXTERNALSYM NEARPROC}
  1068.   PROC = function: Integer; stdcall;
  1069.   {$EXTERNALSYM PROC}
  1070.   HGDIOBJ = {$IFDEF USE_DELPHI_TYPES}Windows.HGDIOBJ{$ELSE}HANDLE{$ENDIF};
  1071.   {$EXTERNALSYM HGDIOBJ}
  1072.   HKEY = {$IFDEF USE_DELPHI_TYPES}Windows.HKEY{$ELSE}HANDLE{$ENDIF};
  1073.   {$EXTERNALSYM HKEY}
  1074.   PHKEY = {$IFDEF USE_DELPHI_TYPES}Windows.PHKEY{$ELSE}^HKEY{$ENDIF};
  1075.   {$EXTERNALSYM PHKEY}
  1076.   HACCEL = {$IFDEF USE_DELPHI_TYPES}Windows.HACCEL{$ELSE}HANDLE{$ENDIF};
  1077.   {$EXTERNALSYM HACCEL}
  1078.   HBITMAP = {$IFDEF USE_DELPHI_TYPES}Windows.HBITMAP{$ELSE}HANDLE{$ENDIF};
  1079.   {$EXTERNALSYM HBITMAP}
  1080.   HBRUSH = {$IFDEF USE_DELPHI_TYPES}Windows.HBRUSH{$ELSE}HANDLE{$ENDIF};
  1081.   {$EXTERNALSYM HBRUSH}
  1082.   HCOLORSPACE = {$IFDEF USE_DELPHI_TYPES}Windows.HCOLORSPACE{$ELSE}HANDLE{$ENDIF};
  1083.   {$EXTERNALSYM HCOLORSPACE}
  1084.   HDC = {$IFDEF USE_DELPHI_TYPES}Windows.HDC{$ELSE}HANDLE{$ENDIF};
  1085.   {$EXTERNALSYM HDC}
  1086.   HGLRC = {$IFDEF USE_DELPHI_TYPES}Windows.HGLRC{$ELSE}HANDLE{$ENDIF};
  1087.   {$EXTERNALSYM HGLRC}
  1088.   HDESK = {$IFDEF USE_DELPHI_TYPES}Windows.HDESK{$ELSE}HANDLE{$ENDIF};
  1089.   {$EXTERNALSYM HDESK}
  1090.   HENHMETAFILE = {$IFDEF USE_DELPHI_TYPES}Windows.HENHMETAFILE{$ELSE}HANDLE{$ENDIF};
  1091.   {$EXTERNALSYM HENHMETAFILE}
  1092.   HFONT = {$IFDEF USE_DELPHI_TYPES}Windows.HFONT{$ELSE}HANDLE{$ENDIF};
  1093.   {$EXTERNALSYM HFONT}
  1094.   HICON = {$IFDEF USE_DELPHI_TYPES}Windows.HICON{$ELSE}HANDLE{$ENDIF};
  1095.   {$EXTERNALSYM HICON}
  1096.   HMENU = {$IFDEF USE_DELPHI_TYPES}Windows.HMENU{$ELSE}HANDLE{$ENDIF};
  1097.   {$EXTERNALSYM HMENU}
  1098.   HMETAFILE = {$IFDEF USE_DELPHI_TYPES}Windows.HMETAFILE{$ELSE}HANDLE{$ENDIF};
  1099.   {$EXTERNALSYM HMETAFILE}
  1100.   HINSTANCE = {$IFDEF USE_DELPHI_TYPES}Windows.HINST{$ELSE}HANDLE{$ENDIF};
  1101.   {$EXTERNALSYM HINSTANCE}
  1102.   HMODULE = {$IFDEF USE_DELPHI_TYPES}Windows.HMODULE{$ELSE}HINSTANCE{$ENDIF};
  1103.   {$EXTERNALSYM HMODULE}
  1104.   HPALETTE = {$IFDEF USE_DELPHI_TYPES}Windows.HPALETTE{$ELSE}HANDLE{$ENDIF};
  1105.   {$EXTERNALSYM HPALETTE}
  1106.   HPEN = {$IFDEF USE_DELPHI_TYPES}Windows.HPEN{$ELSE}HANDLE{$ENDIF};
  1107.   {$EXTERNALSYM HPEN}
  1108.   HRGN = {$IFDEF USE_DELPHI_TYPES}Windows.HRGN{$ELSE}HANDLE{$ENDIF};
  1109.   {$EXTERNALSYM HRGN}
  1110.   HRSRC = {$IFDEF USE_DELPHI_TYPES}Windows.HRSRC{$ELSE}HANDLE{$ENDIF};
  1111.   {$EXTERNALSYM HRSRC}
  1112.   HSTR = {$IFDEF USE_DELPHI_TYPES}Windows.HSTR{$ELSE}HANDLE{$ENDIF};
  1113.   {$EXTERNALSYM HSTR}
  1114.   HTASK = {$IFDEF USE_DELPHI_TYPES}Windows.HTASK{$ELSE}HANDLE{$ENDIF};
  1115.   {$EXTERNALSYM HTASK}
  1116.   HWINSTA = {$IFDEF USE_DELPHI_TYPES}Windows.HWINSTA{$ELSE}HANDLE{$ENDIF};
  1117.   {$EXTERNALSYM HWINSTA}
  1118.   HKL = {$IFDEF USE_DELPHI_TYPES}Windows.HKL{$ELSE}HANDLE{$ENDIF};
  1119.   {$EXTERNALSYM HKL}
  1120.   PHKL = {$IFDEF USE_DELPHI_TYPES}^HKL{$ELSE}^HANDLE{$ENDIF};
  1121.   {$EXTERNALSYM PHKL}
  1122.   HMONITOR = HANDLE;
  1123.   {$EXTERNALSYM HMONITOR}
  1124.   HWINEVENTHOOK = HANDLE;
  1125.   {$EXTERNALSYM HWINEVENTHOOK}
  1126.   HUMPD = HANDLE;
  1127.   {$EXTERNALSYM HUMPD}  
  1128.   HFILE = {$IFDEF USE_DELPHI_TYPES}Windows.HFILE{$ELSE}Integer{$ENDIF};
  1129.   {$EXTERNALSYM HFILE}
  1130.   HCURSOR = {$IFDEF USE_DELPHI_TYPES}Windows.HCURSOR{$ELSE}HICON{$ENDIF};
  1131.   {$EXTERNALSYM HCURSOR}
  1132.   COLORREF = {$IFDEF USE_DELPHI_TYPES}Windows.COLORREF{$ELSE}DWORD{$ENDIF};
  1133.   {$EXTERNALSYM COLORREF}
  1134.   LPCOLORREF = ^COLORREF;
  1135.   {$EXTERNALSYM LPCOLORREF}
  1136.   PHMODULE = ^HMODULE;
  1137.   {$NODEFINE PHMODULE}
  1138. const
  1139.   HFILE_ERROR = HFILE(-1);
  1140.   {$EXTERNALSYM HFILE_ERROR}
  1141. type
  1142.   LPRECT = ^RECT;
  1143.   {$EXTERNALSYM LPRECT}
  1144.   tagRECT = record
  1145.     left: LONG;
  1146.     top: LONG;
  1147.     right: LONG;
  1148.     bottom: LONG;
  1149.   end;
  1150.   {$EXTERNALSYM tagRECT}
  1151.   RECT = {$IFDEF USE_DELPHI_TYPES}Windows.TRect{$ELSE}tagRECT{$ENDIF};
  1152.   {$EXTERNALSYM RECT}
  1153.   NPRECT = ^RECT;
  1154.   {$EXTERNALSYM NPRECT}
  1155.   LPCRECT = ^RECT;
  1156.   {$EXTERNALSYM LPCRECT}
  1157.   TRect = {$IFDEF USE_DELPHI_TYPES}Windows.TRect{$ELSE}RECT{$ENDIF};
  1158.   PRect = {$IFDEF USE_DELPHI_TYPES}Windows.PRect{$ELSE}LPRECT{$ENDIF};
  1159.   LPRECTL = ^RECTL;
  1160.   {$EXTERNALSYM LPRECTL}
  1161.   _RECTL = record
  1162.     left: LONG;
  1163.     top: LONG;
  1164.     right: LONG;
  1165.     bottom: LONG;
  1166.   end;
  1167.   {$EXTERNALSYM _RECTL}
  1168.   RECTL = _RECTL;
  1169.   {$EXTERNALSYM RECTL}
  1170.   LPCRECTL = ^_RECTL;
  1171.   {$EXTERNALSYM LPCRECTL}
  1172.   TRectl = RECTL;
  1173.   PRectl = LPRECTL;
  1174.   LPPOINT = ^POINT;
  1175.   {$EXTERNALSYM LPPOINT}
  1176.   tagPOINT = record
  1177.     x: LONG;
  1178.     y: LONG;
  1179.   end;
  1180.   {$EXTERNALSYM tagPOINT}
  1181.   NPPOINT = ^tagPoint;
  1182.   {$EXTERNALSYM NPPOINT}
  1183.   POINT = tagPOINT;
  1184.   {$EXTERNALSYM tagPOINT}
  1185.   TPoint = {$IFDEF USE_DELPHI_TYPES}Windows.TPoint{$ELSE}POINT{$ENDIF};
  1186.   PPoint = {$IFDEF USE_DELPHI_TYPES}Windows.PPoint{$ELSE}LPPOINT{$ENDIF};
  1187.   PPointl = ^POINTL;
  1188.   _POINTL = record
  1189.     x: LONG;
  1190.     y: LONG;
  1191.   end;
  1192.   {$EXTERNALSYM _POINTL}
  1193.   POINTL = _POINTL;
  1194.   {$EXTERNALSYM POINTL}
  1195.   TPointl = POINTL;
  1196.   LPSIZE = ^TSize;
  1197.   {$EXTERNALSYM LPSIZE}
  1198. {$IFDEF USE_DELPHI_TYPES}
  1199.   TSize = Windows.TSize;
  1200.   PSize = Windows.PSize;
  1201. {$ELSE}
  1202.   tagSIZE = record
  1203.     cx: LONG;
  1204.     cy: LONG;
  1205.   end;
  1206.   {$EXTERNALSYM tagSIZE}
  1207.   TSize = tagSIZE;
  1208.   PSize = LPSIZE;
  1209. {$ENDIF}
  1210.   SIZE = TSize;
  1211.   {$EXTERNALSYM SIZE}
  1212.   SIZEL = TSize;
  1213.   {$EXTERNALSYM SIZEL}
  1214.   PSIZEL = PSize;
  1215.   {$EXTERNALSYM PSIZEL}
  1216.   LPSIZEL = PSize;
  1217.   {$EXTERNALSYM LPSIZEL}
  1218.   LPPOINTS = ^POINTS;
  1219.   {$EXTERNALSYM LPPOINTS}
  1220.   tagPOINTS = record
  1221.     x: SHORT;
  1222.     y: SHORT;
  1223.   end;
  1224.   {$EXTERNALSYM tagPOINTS}
  1225.   POINTS = tagPOINTS;
  1226.   {$EXTERNALSYM POINTS}
  1227.   TPoints = POINTS;
  1228.   PPoints = LPPOINTS;
  1229. //
  1230. //  File System time stamps are represented with the following structure:
  1231. //
  1232.   {$IFNDEF _FILETIME_}
  1233.   {$DEFINE _FILETIME_}
  1234.   _FILETIME = record
  1235.     dwLowDateTime: DWORD;
  1236.     dwHighDateTime: DWORD;
  1237.   end;
  1238.   {$EXTERNALSYM _FILETIME}
  1239.   FILETIME = _FILETIME;
  1240.   {$EXTERNALSYM FILETIME}
  1241.   PFILETIME = ^FILETIME;
  1242.   {$EXTERNALSYM PFILETIME}
  1243.   LPFILETIME = PFILETIME;
  1244.   {$EXTERNALSYM LPFILETIME}
  1245.   TFileTime = FILETIME;
  1246.   {$ENDIF}
  1247. // mode selections for the device mode function
  1248. const
  1249.   DM_UPDATE = 1;
  1250.   {$EXTERNALSYM DM_UPDATE}
  1251.   DM_COPY   = 2;
  1252.   {$EXTERNALSYM DM_COPY}
  1253.   DM_PROMPT = 4;
  1254.   {$EXTERNALSYM DM_PROMPT}
  1255.   DM_MODIFY = 8;
  1256.   {$EXTERNALSYM DM_MODIFY}
  1257.   DM_IN_BUFFER   = DM_MODIFY;
  1258.   {$EXTERNALSYM DM_IN_BUFFER}
  1259.   DM_IN_PROMPT   = DM_PROMPT;
  1260.   {$EXTERNALSYM DM_IN_PROMPT}
  1261.   DM_OUT_BUFFER  = DM_COPY;
  1262.   {$EXTERNALSYM DM_OUT_BUFFER}
  1263.   DM_OUT_DEFAULT = DM_UPDATE;
  1264.   {$EXTERNALSYM DM_OUT_DEFAULT}
  1265. // device capabilities indices
  1266.   DC_FIELDS           = 1;
  1267.   {$EXTERNALSYM DC_FIELDS}
  1268.   DC_PAPERS           = 2;
  1269.   {$EXTERNALSYM DC_PAPERS}
  1270.   DC_PAPERSIZE        = 3;
  1271.   {$EXTERNALSYM DC_PAPERSIZE}
  1272.   DC_MINEXTENT        = 4;
  1273.   {$EXTERNALSYM DC_MINEXTENT}
  1274.   DC_MAXEXTENT        = 5;
  1275.   {$EXTERNALSYM DC_MAXEXTENT}
  1276.   DC_BINS             = 6;
  1277.   {$EXTERNALSYM DC_BINS}
  1278.   DC_DUPLEX           = 7;
  1279.   {$EXTERNALSYM DC_DUPLEX}
  1280.   DC_SIZE             = 8;
  1281.   {$EXTERNALSYM DC_SIZE}
  1282.   DC_EXTRA            = 9;
  1283.   {$EXTERNALSYM DC_EXTRA}
  1284.   DC_VERSION          = 10;
  1285.   {$EXTERNALSYM DC_VERSION}
  1286.   DC_DRIVER           = 11;
  1287.   {$EXTERNALSYM DC_DRIVER}
  1288.   DC_BINNAMES         = 12;
  1289.   {$EXTERNALSYM DC_BINNAMES}
  1290.   DC_ENUMRESOLUTIONS  = 13;
  1291.   {$EXTERNALSYM DC_ENUMRESOLUTIONS}
  1292.   DC_FILEDEPENDENCIES = 14;
  1293.   {$EXTERNALSYM DC_FILEDEPENDENCIES}
  1294.   DC_TRUETYPE         = 15;
  1295.   {$EXTERNALSYM DC_TRUETYPE}
  1296.   DC_PAPERNAMES       = 16;
  1297.   {$EXTERNALSYM DC_PAPERNAMES}
  1298.   DC_ORIENTATION      = 17;
  1299.   {$EXTERNALSYM DC_ORIENTATION}
  1300.   DC_COPIES           = 18;
  1301.   {$EXTERNALSYM DC_COPIES}
  1302. //
  1303. // HALF_PTR is half the size of a pointer it intended for use with
  1304. // within strcuture which contain a pointer and two small fields.
  1305. // UHALF_PTR is the unsigned variation.
  1306. //
  1307. const
  1308.   ADDRESS_TAG_BIT = DWORD($80000000);
  1309.   {$EXTERNALSYM ADDRESS_TAG_BIT}
  1310. type
  1311.   UHALF_PTR = Byte;
  1312.   {$EXTERNALSYM UHALF_PTR}
  1313.   PUHALF_PTR = ^UHALF_PTR;
  1314.   {$EXTERNALSYM PUHALF_PTR}
  1315.   HALF_PTR = Shortint;
  1316.   {$EXTERNALSYM HALF_PTR}
  1317.   PHALF_PTR = ^HALF_PTR;
  1318.   {$EXTERNALSYM PHALF_PTR}
  1319.   SHANDLE_PTR = Longint;
  1320.   {$EXTERNALSYM SHANDLE_PTR}
  1321.   HANDLE_PTR = Longint;
  1322.   {$EXTERNALSYM HANDLE_PTR}
  1323. //
  1324. // SIZE_T used for counts or ranges which need to span the range of
  1325. // of a pointer.  SSIZE_T is the signed variation.
  1326. //
  1327.   SIZE_T = ULONG_PTR;
  1328.   {$EXTERNALSYM SIZE_T}
  1329.   PSIZE_T = ^SIZE_T;
  1330.   {$EXTERNALSYM PSIZE_T}
  1331.   SSIZE_T = LONG_PTR;
  1332.   {$EXTERNALSYM SSIZE_T}
  1333.   PSSIZE_T = ^SSIZE_T;
  1334.   {$EXTERNALSYM PSSIZE_T}
  1335. //
  1336. // Add Windows flavor DWORD_PTR types
  1337. //
  1338.   DWORD_PTR = ULONG_PTR;
  1339.   {$EXTERNALSYM DWORD_PTR}
  1340.   PDWORD_PTR = ^DWORD_PTR;
  1341.   {$EXTERNALSYM PDWORD_PTR}
  1342. //
  1343. // The following types are guaranteed to be signed and 64 bits wide.
  1344. //
  1345.   LONG64 = Int64;
  1346.   {$EXTERNALSYM LONG64}
  1347.   PLONG64 = ^LONG64;
  1348.   {$EXTERNALSYM PLONG64}
  1349.   PINT64 = ^Int64;
  1350.   {$EXTERNALSYM PINT64}
  1351. //
  1352. // The following types are guaranteed to be unsigned and 64 bits wide.
  1353. //
  1354.   ULONG64 = Int64;
  1355.   {$EXTERNALSYM ULONG64}
  1356.   PULONG64 = ^ULONG64;
  1357.   {$EXTERNALSYM PULONG64}
  1358.   DWORD64 = Int64;
  1359.   {$EXTERNALSYM DWORD64}
  1360.   PDWORD64 = ^DWORD64;
  1361.   {$EXTERNALSYM PDWORD64}
  1362.   UINT64 = Int64;
  1363.   {$EXTERNALSYM UINT64}
  1364.   PUINT64 = ^UINT64;
  1365.   {$EXTERNALSYM PUINT64}
  1366. const
  1367.   MAXUINT_PTR   = not UINT_PTR(0);
  1368.   {$EXTERNALSYM MAXUINT_PTR}
  1369.   MAXINT_PTR    = INT_PTR((MAXUINT_PTR shr 1));
  1370.   {$EXTERNALSYM MAXINT_PTR}
  1371.   MININT_PTR    = not MAXINT_PTR;
  1372.   {$EXTERNALSYM MININT_PTR}
  1373.   MAXULONG_PTR  = not ULONG_PTR(0);
  1374.   {$EXTERNALSYM MAXULONG_PTR}
  1375.   MAXLONG_PTR   = LONG_PTR(MAXULONG_PTR shr 1);
  1376.   {$EXTERNALSYM MAXLONG_PTR}
  1377.   MINLONG_PTR   = not MAXLONG_PTR;
  1378.   {$EXTERNALSYM MINLONG_PTR}
  1379.   MAXUHALF_PTR  = UHALF_PTR( not 0);
  1380.   {$EXTERNALSYM MAXUHALF_PTR}
  1381.   MAXHALF_PTR   = HALF_PTR(MAXUHALF_PTR shr 1);
  1382.   {$EXTERNALSYM MAXHALF_PTR}
  1383.   MINHALF_PTR   = not MAXHALF_PTR;
  1384.   {$EXTERNALSYM MINHALF_PTR}
  1385. // basetsd
  1386. type
  1387.   INT8 = Shortint;
  1388.   {$EXTERNALSYM INT8}
  1389.   PINT8 = ^INT8;
  1390.   {$EXTERNALSYM PINT8}
  1391.   INT16 = Smallint;
  1392.   {$EXTERNALSYM INT16}
  1393.   PINT16 = ^INT16;
  1394.   {$EXTERNALSYM PINT16}
  1395.   UINT8 = Byte;
  1396.   {$EXTERNALSYM UINT8}
  1397.   PUINT8 = ^UINT8;
  1398.   {$EXTERNALSYM PUINT8}
  1399.   UINT16 = Word;
  1400.   {$EXTERNALSYM UINT16}
  1401.   PUINT16 = ^UINT16;
  1402.   {$EXTERNALSYM PUINT16}
  1403. //
  1404. // Thread affinity.
  1405. //
  1406.   KAFFINITY = ULONG_PTR;
  1407.   {$EXTERNALSYM KAFFINITY}
  1408.   PKAFFINITY = ^KAFFINITY;
  1409.   {$EXTERNALSYM PKAFFINITY}
  1410. implementation
  1411. uses
  1412.   JwaWinNT;
  1413. function Int32x32To64(a, b: LONG): LONGLONG;
  1414. begin
  1415.   Result := a * b;
  1416. end;
  1417. function UInt32x32To64(a, b: DWORD): ULONGLONG;
  1418. begin
  1419.   Result := a * b;
  1420. end;
  1421. function Int64ShllMod32(Value: ULONGLONG; ShiftCount: DWORD): ULONGLONG;
  1422. asm
  1423.         MOV     ECX, ShiftCount
  1424.         MOV     EAX, DWORD PTR [Value]
  1425.         MOV     EDX, DWORD PTR [Value + 4]
  1426.         SHLD    EDX, EAX, CL
  1427.         SHL     EAX, CL
  1428. end;
  1429. function Int64ShraMod32(Value: LONGLONG; ShiftCount: DWORD): LONGLONG;
  1430. asm
  1431.         MOV     ECX, ShiftCount
  1432.         MOV     EAX, DWORD PTR [Value]
  1433.         MOV     EDX, DWORD PTR [Value + 4]
  1434.         SHRD    EAX, EDX, CL
  1435.         SAR     EDX, CL
  1436. end;
  1437. function Int64ShrlMod32(Value: ULONGLONG; ShiftCount: DWORD): ULONGLONG;
  1438. asm
  1439.         MOV     ECX, ShiftCount
  1440.         MOV     EAX, DWORD PTR [Value]
  1441.         MOV     EDX, DWORD PTR [Value + 4]
  1442.         SHRD    EAX, EDX, CL
  1443.         SHR     EDX, CL
  1444. end;
  1445. procedure ListEntry32To64(l32: PLIST_ENTRY32; l64: PLIST_ENTRY64);
  1446. begin
  1447.   l64^.Flink := l32^.Flink;
  1448.   l64^.Blink := l32^.Blink;
  1449. end;
  1450. procedure ListEntry64To32(l64: PLIST_ENTRY64; l32: PLIST_ENTRY32);
  1451. begin
  1452.   l32^.Flink := ULONG(l64^.Flink);
  1453.   l32^.Blink := ULONG(l64^.Blink);
  1454. end;
  1455. function NT_SUCCESS(Status: NTSTATUS): BOOL;
  1456. begin
  1457.   Result := Status >= 0;
  1458. end;
  1459. function NT_INFORMATION(Status: NTSTATUS): BOOL;
  1460. begin
  1461.   Result := (ULONG(Status) shr 30) = 1;
  1462. end;
  1463. function NT_WARNING(Status: NTSTATUS): BOOL;
  1464. begin
  1465.   Result := (ULONG(Status) shr 30) = 2;
  1466. end;
  1467. function NT_ERROR(Status: NTSTATUS): BOOL;
  1468. begin
  1469.   Result := (ULONG(Status) shr 30) = 3;
  1470. end;
  1471. procedure InitializeObjectAttributes(p: POBJECT_ATTRIBUTES; n: PUNICODE_STRING;
  1472.   a: ULONG; r: HANDLE; s: PVOID{PSECURITY_DESCRIPTOR});
  1473. begin
  1474.   p^.Length := sizeof(OBJECT_ATTRIBUTES);
  1475.   p^.RootDirectory := r;
  1476.   p^.Attributes := a;
  1477.   p^.ObjectName := n;
  1478.   p^.SecurityDescriptor := s;
  1479.   p^.SecurityQualityOfService := nil;
  1480. end;
  1481. function ARGUMENT_PRESENT(ArgumentPointer: Pointer): BOOL;
  1482. begin
  1483.   Result := ArgumentPointer <> nil;
  1484. end;
  1485. function MAKEWORD(a, b: BYTE): WORD;
  1486. begin
  1487.   Result := (b shl 8) or a;
  1488. end;
  1489. function MAKELONG(a, b: WORD): DWORD;
  1490. begin
  1491.   Result := (b shl 16) or a;
  1492. end;
  1493. function LOWORD(L: DWORD): WORD;
  1494. begin
  1495.   Result := L and $0000FFFF;
  1496. end;
  1497. function HIWORD(L: DWORD): WORD;
  1498. begin
  1499.   Result := L shr 16;
  1500. end;
  1501. function LOBYTE(W: WORD): BYTE;
  1502. begin
  1503.   Result := W and $FF;
  1504. end;
  1505. function HIBYTE(W: WORD): BYTE;
  1506. begin
  1507.   Result := W shr 8;
  1508. end;
  1509. function GetModuleHandle(lpModuleName: LPCSTR): HMODULE; stdcall; external kernel32 name 'GetModuleHandleA';
  1510. function LoadLibrary(lpLibFileName: LPCSTR): HMODULE; stdcall; external kernel32 name 'LoadLibraryA';
  1511. function GetProcAddress(hModule: HMODULE; lpProcName: LPCSTR): FARPROC; stdcall; external kernel32 name 'GetProcAddress';
  1512. procedure GetProcedureAddress(var P: Pointer; const ModuleName, ProcName: string);
  1513. var
  1514.   ModuleHandle: HMODULE;
  1515. begin
  1516.   if not Assigned(P) then
  1517.   begin
  1518.     ModuleHandle := GetModuleHandle(PChar(ModuleName));
  1519.     if ModuleHandle = 0 then
  1520.     begin
  1521.       ModuleHandle := LoadLibrary(PChar(ModuleName));
  1522.       if ModuleHandle = 0 then raise EJwaLoadLibraryError.Create('Library not found: ' + ModuleName);
  1523.     end;
  1524.     P := GetProcAddress(ModuleHandle, PChar(ProcName));
  1525.     if not Assigned(P) then raise EJwaGetProcAddressError.Create('Function not found: ' + ModuleName + '.' + ProcName);
  1526.   end;
  1527. end;
  1528. end.