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

Windows编程

开发平台:

Delphi

  1. {******************************************************************************}
  2. {                                                                       }
  3. { ToolHelp 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: tlhelp32.h, released June 2000. The original Pascal    }
  9. { code is: TlHelp32.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 JwaTlHelp32;
  44. {$WEAKPACKAGEUNIT}
  45. {$HPPEMIT ''}
  46. {$HPPEMIT '#include "tlhelp32.h"'}
  47. {$HPPEMIT ''}
  48. {$I WINDEFINES.INC}
  49. interface
  50. uses
  51.   JwaWinType;
  52. const
  53.   MAX_MODULE_NAME32 = 255;
  54.   {$EXTERNALSYM MAX_MODULE_NAME32}
  55. // Snapshot function
  56. function CreateToolhelp32Snapshot(dwFlags, th32ProcessID: DWORD): HANDLE; stdcall;
  57. {$EXTERNALSYM CreateToolhelp32Snapshot}
  58. //
  59. // The th32ProcessID argument is only used if TH32CS_SNAPHEAPLIST or
  60. // TH32CS_SNAPMODULE is specified. th32ProcessID == 0 means the current
  61. // process.
  62. //
  63. // NOTE that all of the snapshots are global except for the heap and module
  64. //      lists which are process specific. To enumerate the heap or module
  65. //      state for all WIN32 processes call with TH32CS_SNAPALL and the
  66. //      current process. Then for each process in the TH32CS_SNAPPROCESS
  67. //      list that isn't the current process, do a call with just
  68. //      TH32CS_SNAPHEAPLIST and/or TH32CS_SNAPMODULE.
  69. //
  70. // dwFlags
  71. //
  72. const
  73.   TH32CS_SNAPHEAPLIST = $00000001;
  74.   {$EXTERNALSYM TH32CS_SNAPHEAPLIST}
  75.   TH32CS_SNAPPROCESS  = $00000002;
  76.   {$EXTERNALSYM TH32CS_SNAPPROCESS}
  77.   TH32CS_SNAPTHREAD   = $00000004;
  78.   {$EXTERNALSYM TH32CS_SNAPTHREAD}
  79.   TH32CS_SNAPMODULE   = $00000008;
  80.   {$EXTERNALSYM TH32CS_SNAPMODULE}
  81.   TH32CS_SNAPMODULE32 = $00000010;
  82.   {$EXTERNALSYM TH32CS_SNAPMODULE32}
  83.   TH32CS_SNAPALL      = TH32CS_SNAPHEAPLIST or TH32CS_SNAPPROCESS or
  84.                         TH32CS_SNAPTHREAD or TH32CS_SNAPMODULE;
  85.   {$EXTERNALSYM TH32CS_SNAPALL}
  86.   TH32CS_INHERIT      = $80000000;
  87.   {$EXTERNALSYM TH32CS_INHERIT}
  88. //
  89. // Use CloseHandle to destroy the snapshot
  90. //
  91. // Heap walking
  92. type
  93.   PHEAPLIST32 = ^HEAPLIST32;
  94.   {$EXTERNALSYM PHEAPLIST32}
  95.   tagHEAPLIST32 = record
  96.     dwSize: SIZE_T;
  97.     th32ProcessID: DWORD;   // owning process
  98.     th32HeapID: ULONG_PTR;  // heap (in owning process's context!)
  99.     dwFlags: DWORD;
  100.   end;
  101.   {$EXTERNALSYM tagHEAPLIST32}
  102.   HEAPLIST32 = tagHEAPLIST32;
  103.   {$EXTERNALSYM HEAPLIST32}
  104.   LPHEAPLIST32 = ^HEAPLIST32;
  105.   {$EXTERNALSYM LPHEAPLIST32}
  106.   THeapList32 = HEAPLIST32;
  107. //
  108. // dwFlags
  109. //
  110. const
  111.   HF32_DEFAULT    = 1;  // process's default heap
  112.   {$EXTERNALSYM HF32_DEFAULT}
  113.   HF32_SHARED     = 2;  // is shared heap
  114.   {$EXTERNALSYM HF32_SHARED}
  115. function Heap32ListFirst(hSnapshot: HANDLE; var lphl: HEAPLIST32): BOOL; stdcall;
  116. {$EXTERNALSYM Heap32ListFirst}
  117. function Heap32ListNext(hSnapshot: HANDLE; var lphl: HEAPLIST32): BOOL; stdcall;
  118. {$EXTERNALSYM Heap32ListNext}
  119. type
  120.   PHEAPENTRY32 = ^HEAPENTRY32;
  121.   {$EXTERNALSYM PHEAPENTRY32}
  122.   tagHEAPENTRY32 = record
  123.     dwSize: SIZE_T;
  124.     hHandle: HANDLE;       // Handle of this heap block
  125.     dwAddress: ULONG_PTR;  // Linear address of start of block
  126.     dwBlockSize: SIZE_T;   // Size of block in bytes
  127.     dwFlags: DWORD;
  128.     dwLockCount: DWORD;
  129.     dwResvd: DWORD;
  130.     th32ProcessID: DWORD;  // owning process
  131.     th32HeapID: ULONG_PTR; // heap block is in
  132.   end;
  133.   {$EXTERNALSYM tagHEAPENTRY32}
  134.   HEAPENTRY32 = tagHEAPENTRY32;
  135.   {$EXTERNALSYM HEAPENTRY32}
  136.   LPHEAPENTRY32 = ^HEAPENTRY32;
  137.   {$EXTERNALSYM LPHEAPENTRY32}
  138.   THeapEntry32 = HEAPENTRY32;
  139. //
  140. // dwFlags
  141. //
  142. const
  143.   LF32_FIXED    = $00000001;
  144.   {$EXTERNALSYM LF32_FIXED}
  145.   LF32_FREE     = $00000002;
  146.   {$EXTERNALSYM LF32_FREE}
  147.   LF32_MOVEABLE = $00000004;
  148.   {$EXTERNALSYM LF32_MOVEABLE}
  149. function Heap32First(var lphe: HEAPENTRY32; th32ProcessID: DWORD;
  150.   th32HeapID: ULONG_PTR): BOOL; stdcall;
  151. {$EXTERNALSYM Heap32First}
  152. function Heap32Next(var lphe: HEAPENTRY32): BOOL; stdcall;
  153. {$EXTERNALSYM Heap32Next}
  154. function Toolhelp32ReadProcessMemory(th32ProcessID: DWORD; lpBaseAddress: LPCVOID;
  155.   lpBuffer: LPVOID; cbRead: DWORD; lpNumberOfBytesRead: LPDWORD): BOOL; stdcall;
  156. {$EXTERNALSYM Toolhelp32ReadProcessMemory}
  157. // Process walking
  158. type
  159.   PPROCESSENTRY32W = ^PROCESSENTRY32W;
  160.   {$EXTERNALSYM PPROCESSENTRY32W}
  161.   tagPROCESSENTRY32W = record
  162.     dwSize: DWORD;
  163.     cntUsage: DWORD;
  164.     th32ProcessID: DWORD;          // this process
  165.     th32DefaultHeapID: ULONG_PTR;
  166.     th32ModuleID:DWORD;            // associated exe
  167.     cntThreads: DWORD;
  168.     th32ParentProcessID: DWORD;    // this process's parent process
  169.     pcPriClassBase: LONG;          // Base priority of process's threads
  170.     dwFlags: DWORD;
  171.     szExeFile: array [0..MAX_PATH - 1] of WCHAR;   // Path
  172.   end;
  173.   {$EXTERNALSYM tagPROCESSENTRY32W}
  174.   PROCESSENTRY32W = tagPROCESSENTRY32W;
  175.   {$EXTERNALSYM PROCESSENTRY32W}
  176.   LPPROCESSENTRY32W = ^PROCESSENTRY32W;
  177.   {$EXTERNALSYM LPPROCESSENTRY32W}
  178.   TProcessEntry32W = PROCESSENTRY32W;
  179. function Process32FirstW(hSnapshot: HANDLE; var lppe: PROCESSENTRY32W): BOOL; stdcall;
  180. {$EXTERNALSYM Process32FirstW}
  181. function Process32NextW(hSnapshot: HANDLE; var lppe: PROCESSENTRY32W): BOOL; stdcall;
  182. {$EXTERNALSYM Process32NextW}
  183. {$IFNDEF UNICODE}
  184. type
  185.   PPROCESSENTRY32 = ^PROCESSENTRY32;
  186.   {$EXTERNALSYM PPROCESSENTRY32}
  187.   tagPROCESSENTRY32 = record
  188.     dwSize: DWORD;
  189.     cntUsage: DWORD;
  190.     th32ProcessID: DWORD;          // this process
  191.     th32DefaultHeapID: ULONG_PTR;
  192.     th32ModuleID: DWORD;           // associated exe
  193.     cntThreads: DWORD;
  194.     th32ParentProcessID: DWORD;    // this process's parent process
  195.     pcPriClassBase: LONG;          // Base priority of process's threads
  196.     dwFlags: DWORD;
  197.     szExeFile: array [0..MAX_PATH - 1] of CHAR;    // Path
  198.   end;
  199.   {$EXTERNALSYM tagPROCESSENTRY32}
  200.   PROCESSENTRY32 = tagPROCESSENTRY32;
  201.   {$EXTERNALSYM PROCESSENTRY32}
  202.   LPPROCESSENTRY32 = ^PROCESSENTRY32;
  203.   {$EXTERNALSYM LPPROCESSENTRY32}
  204.   TProcessEntry32 = PROCESSENTRY32;
  205. function Process32First(hSnapshot: HANDLE; var lppe: PROCESSENTRY32): BOOL; stdcall;
  206. {$EXTERNALSYM Process32First}
  207. function Process32Next(hSnapshot: HANDLE; var lppe: PROCESSENTRY32): BOOL; stdcall;
  208. {$EXTERNALSYM Process32Next}
  209. {$ELSE}
  210. type
  211.   PROCESSENTRY32 = PROCESSENTRY32W;
  212.   {$EXTERNALSYM PROCESSENTRY32}
  213.   PPROCESSENTRY32 = PPROCESSENTRY32W;
  214.   {$EXTERNALSYM PPROCESSENTRY32}
  215.   LPPROCESSENTRY32 = LPPROCESSENTRY32W;
  216.   {$EXTERNALSYM LPPROCESSENTRY32}
  217.   TProcessEntry32 = TProcessEntry32W;
  218. function Process32First(hSnapshot: HANDLE; var lppe: PROCESSENTRY32): BOOL; stdcall;
  219. {$EXTERNALSYM Process32First}
  220. function Process32Next(hSnapshot: HANDLE; var lppe: PROCESSENTRY32): BOOL; stdcall;
  221. {$EXTERNALSYM Process32Next}
  222. {$ENDIF}
  223. // Thread walking
  224. type
  225.   PTHREADENTRY32 = ^THREADENTRY32;
  226.   {$EXTERNALSYM PTHREADENTRY32}
  227.   tagTHREADENTRY32 = record
  228.     dwSize: DWORD;
  229.     cntUsage: DWORD;
  230.     th32ThreadID: DWORD;       // this thread
  231.     th32OwnerProcessID: DWORD; // Process this thread is associated with
  232.     tpBasePri: LONG;
  233.     tpDeltaPri: LONG;
  234.     dwFlags: DWORD;
  235.   end;
  236.   {$EXTERNALSYM tagTHREADENTRY32}
  237.   THREADENTRY32 = tagTHREADENTRY32;
  238.   {$EXTERNALSYM THREADENTRY32}
  239.   LPTHREADENTRY32 = ^THREADENTRY32;
  240.   {$EXTERNALSYM LPTHREADENTRY32}
  241.   TThreadEntry32 = THREADENTRY32;
  242. function Thread32First(hSnapshot: HANDLE; var lpte: THREADENTRY32): BOOL; stdcall;
  243. {$EXTERNALSYM Thread32First}
  244. function Thread32Next(hSnapshot: HANDLE; var lpte: THREADENTRY32): BOOL; stdcall;
  245. {$EXTERNALSYM Thread32Next}
  246. // Module walking
  247. type
  248.   PMODULEENTRY32W = ^MODULEENTRY32W;
  249.   {$EXTERNALSYM PMODULEENTRY32W}
  250.   tagMODULEENTRY32W = record
  251.     dwSize: DWORD;
  252.     th32ModuleID: DWORD;       // This module
  253.     th32ProcessID: DWORD;      // owning process
  254.     GlblcntUsage: DWORD;       // Global usage count on the module
  255.     ProccntUsage: DWORD;       // Module usage count in th32ProcessID's context
  256.     modBaseAddr: LPBYTE;       // Base address of module in th32ProcessID's context
  257.     modBaseSize: DWORD;        // Size in bytes of module starting at modBaseAddr
  258.     hModule: HMODULE;          // The hModule of this module in th32ProcessID's context
  259.     szModule: array [0..MAX_MODULE_NAME32] of WCHAR;
  260.     szExePath: array [0..MAX_PATH - 1] of WCHAR;
  261.   end;
  262.   {$EXTERNALSYM tagMODULEENTRY32W}
  263.   MODULEENTRY32W = tagMODULEENTRY32W;
  264.   {$EXTERNALSYM MODULEENTRY32W}
  265.   LPMODULEENTRY32W = ^MODULEENTRY32W;
  266.   {$EXTERNALSYM LPMODULEENTRY32W}
  267.   TModuleEntry32W = MODULEENTRY32W;
  268. function Module32FirstW(hSnapshot: HANDLE; var lpme: MODULEENTRY32W): BOOL; stdcall;
  269. {$EXTERNALSYM Module32FirstW}
  270. function Module32NextW(hSnapshot: HANDLE; var lpme: MODULEENTRY32W): BOOL; stdcall;
  271. {$EXTERNALSYM Module32NextW}
  272. {$IFNDEF UNICODE}
  273. type
  274.   PMODULEENTRY32 = ^MODULEENTRY32;
  275.   {$EXTERNALSYM PMODULEENTRY32}
  276.   tagMODULEENTRY32 = record
  277.     dwSize: DWORD;
  278.     th32ModuleID: DWORD;       // This module
  279.     th32ProcessID: DWORD;      // owning process
  280.     GlblcntUsage: DWORD;       // Global usage count on the module
  281.     ProccntUsage: DWORD;       // Module usage count in th32ProcessID's context
  282.     modBaseAddr: LPBYTE;       // Base address of module in th32ProcessID's context
  283.     modBaseSize: DWORD;        // Size in bytes of module starting at modBaseAddr
  284.     hModule: HMODULE;          // The hModule of this module in th32ProcessID's context
  285.     szModule: array [0..MAX_MODULE_NAME32] of CHAR;
  286.     szExePath: array [0..MAX_PATH - 1] of CHAR;
  287.   end;
  288.   {$EXTERNALSYM tagMODULEENTRY32}
  289.   MODULEENTRY32 = tagMODULEENTRY32;
  290.   {$EXTERNALSYM MODULEENTRY32}
  291.   LPMODULEENTRY32 = ^MODULEENTRY32;
  292.   {$EXTERNALSYM LPMODULEENTRY32}
  293.   TModuleEntry32 = MODULEENTRY32;
  294. //
  295. // NOTE CAREFULLY that the modBaseAddr and hModule fields are valid ONLY
  296. // in th32ProcessID's process context.
  297. //
  298. function Module32First(hSnapshot: HANDLE; var lpme: MODULEENTRY32): BOOL; stdcall;
  299. {$EXTERNALSYM Module32First}
  300. function Module32Next(hSnapshot: HANDLE; var lpme: MODULEENTRY32): BOOL; stdcall;
  301. {$EXTERNALSYM Module32Next}
  302. {$ELSE}
  303. type
  304.   MODULEENTRY32 = MODULEENTRY32W;
  305.   {$EXTERNALSYM MODULEENTRY32}
  306.   PMODULEENTRY32 = PMODULEENTRY32W;
  307.   {$EXTERNALSYM PMODULEENTRY32}
  308.   LPMODULEENTRY32 = LPMODULEENTRY32W;
  309.   {$EXTERNALSYM LPMODULEENTRY32}
  310.   TModuleEntry32 = TModuleEntry32W;
  311. function Module32First(hSnapshot: HANDLE; var lpme: MODULEENTRY32): BOOL; stdcall;
  312. {$EXTERNALSYM Module32First}
  313. function Module32Next(hSnapshot: HANDLE; var lpme: MODULEENTRY32): BOOL; stdcall;
  314. {$EXTERNALSYM Module32Next}
  315. {$ENDIF}
  316. implementation
  317. const
  318.   kernel32 = 'kernel32.dll';
  319. {$IFDEF DYNAMIC_LINK}
  320. var
  321.   _CreateToolhelp32Snapshot: Pointer;
  322. function CreateToolhelp32Snapshot;
  323. begin
  324.   GetProcedureAddress(_CreateToolhelp32Snapshot, kernel32, 'CreateToolhelp32Snapshot');
  325.   asm
  326.     mov esp, ebp
  327.     pop ebp
  328.     jmp [_CreateToolhelp32Snapshot]
  329.   end;
  330. end;
  331. {$ELSE}
  332. function CreateToolhelp32Snapshot; external kernel32 name 'CreateToolhelp32Snapshot';
  333. {$ENDIF DYNAMIC_LINK}
  334. {$IFDEF DYNAMIC_LINK}
  335. var
  336.   _Heap32ListFirst: Pointer;
  337. function Heap32ListFirst;
  338. begin
  339.   GetProcedureAddress(_Heap32ListFirst, kernel32, 'Heap32ListFirst');
  340.   asm
  341.     mov esp, ebp
  342.     pop ebp
  343.     jmp [_Heap32ListFirst]
  344.   end;
  345. end;
  346. {$ELSE}
  347. function Heap32ListFirst; external kernel32 name 'Heap32ListFirst';
  348. {$ENDIF DYNAMIC_LINK}
  349. {$IFDEF DYNAMIC_LINK}
  350. var
  351.   _Heap32ListNext: Pointer;
  352. function Heap32ListNext;
  353. begin
  354.   GetProcedureAddress(_Heap32ListNext, kernel32, 'Heap32ListNext');
  355.   asm
  356.     mov esp, ebp
  357.     pop ebp
  358.     jmp [_Heap32ListNext]
  359.   end;
  360. end;
  361. {$ELSE}
  362. function Heap32ListNext; external kernel32 name 'Heap32ListNext';
  363. {$ENDIF DYNAMIC_LINK}
  364. {$IFDEF DYNAMIC_LINK}
  365. var
  366.   _Heap32First: Pointer;
  367. function Heap32First;
  368. begin
  369.   GetProcedureAddress(_Heap32First, kernel32, 'Heap32First');
  370.   asm
  371.     mov esp, ebp
  372.     pop ebp
  373.     jmp [_Heap32First]
  374.   end;
  375. end;
  376. {$ELSE}
  377. function Heap32First; external kernel32 name 'Heap32First';
  378. {$ENDIF DYNAMIC_LINK}
  379. {$IFDEF DYNAMIC_LINK}
  380. var
  381.   _Heap32Next: Pointer;
  382. function Heap32Next;
  383. begin
  384.   GetProcedureAddress(_Heap32Next, kernel32, 'Heap32Next');
  385.   asm
  386.     mov esp, ebp
  387.     pop ebp
  388.     jmp [_Heap32Next]
  389.   end;
  390. end;
  391. {$ELSE}
  392. function Heap32Next; external kernel32 name 'Heap32Next';
  393. {$ENDIF DYNAMIC_LINK}
  394. {$IFDEF DYNAMIC_LINK}
  395. var
  396.   _Toolhelp32ReadProcessMemory: Pointer;
  397. function Toolhelp32ReadProcessMemory;
  398. begin
  399.   GetProcedureAddress(_Toolhelp32ReadProcessMemory, kernel32, 'Toolhelp32ReadProcessMemory');
  400.   asm
  401.     mov esp, ebp
  402.     pop ebp
  403.     jmp [_Toolhelp32ReadProcessMemory]
  404.   end;
  405. end;
  406. {$ELSE}
  407. function Toolhelp32ReadProcessMemory; external kernel32 name 'Toolhelp32ReadProcessMemory';
  408. {$ENDIF DYNAMIC_LINK}
  409. {$IFDEF DYNAMIC_LINK}
  410. var
  411.   _Process32FirstW: Pointer;
  412. function Process32FirstW;
  413. begin
  414.   GetProcedureAddress(_Process32FirstW, kernel32, 'Process32FirstW');
  415.   asm
  416.     mov esp, ebp
  417.     pop ebp
  418.     jmp [_Process32FirstW]
  419.   end;
  420. end;
  421. {$ELSE}
  422. function Process32FirstW; external kernel32 name 'Process32FirstW';
  423. {$ENDIF DYNAMIC_LINK}
  424. {$IFDEF DYNAMIC_LINK}
  425. var
  426.   _Process32NextW: Pointer;
  427. function Process32NextW;
  428. begin
  429.   GetProcedureAddress(_Process32NextW, kernel32, 'Process32NextW');
  430.   asm
  431.     mov esp, ebp
  432.     pop ebp
  433.     jmp [_Process32NextW]
  434.   end;
  435. end;
  436. {$ELSE}
  437. function Process32NextW; external kernel32 name 'Process32NextW';
  438. {$ENDIF DYNAMIC_LINK}
  439. {$IFDEF UNICODE}
  440. {$IFDEF DYNAMIC_LINK}
  441. var
  442.   _Process32First: Pointer;
  443. function Process32First;
  444. begin
  445.   GetProcedureAddress(_Process32First, kernel32, 'Process32FirstW');
  446.   asm
  447.     mov esp, ebp
  448.     pop ebp
  449.     jmp [_Process32First]
  450.   end;
  451. end;
  452. {$ELSE}
  453. function Process32First; external kernel32 name 'Process32FirstW';
  454. {$ENDIF DYNAMIC_LINK}
  455. {$IFDEF DYNAMIC_LINK}
  456. var
  457.   _Process32Next: Pointer;
  458. function Process32Next;
  459. begin
  460.   GetProcedureAddress(_Process32Next, kernel32, 'Process32NextW');
  461.   asm
  462.     mov esp, ebp
  463.     pop ebp
  464.     jmp [_Process32Next]
  465.   end;
  466. end;
  467. {$ELSE}
  468. function Process32Next; external kernel32 name 'Process32NextW';
  469. {$ENDIF DYNAMIC_LINK}
  470. {$ELSE}
  471. {$IFDEF DYNAMIC_LINK}
  472. var
  473.   _Process32First: Pointer;
  474. function Process32First;
  475. begin
  476.   GetProcedureAddress(_Process32First, kernel32, 'Process32First');
  477.   asm
  478.     mov esp, ebp
  479.     pop ebp
  480.     jmp [_Process32First]
  481.   end;
  482. end;
  483. {$ELSE}
  484. function Process32First; external kernel32 name 'Process32First';
  485. {$ENDIF DYNAMIC_LINK}
  486. {$IFDEF DYNAMIC_LINK}
  487. var
  488.   _Process32Next: Pointer;
  489. function Process32Next;
  490. begin
  491.   GetProcedureAddress(_Process32Next, kernel32, 'Process32Next');
  492.   asm
  493.     mov esp, ebp
  494.     pop ebp
  495.     jmp [_Process32Next]
  496.   end;
  497. end;
  498. {$ELSE}
  499. function Process32Next; external kernel32 name 'Process32Next';
  500. {$ENDIF DYNAMIC_LINK}
  501. {$ENDIF}
  502. {$IFDEF DYNAMIC_LINK}
  503. var
  504.   _Thread32First: Pointer;
  505. function Thread32First;
  506. begin
  507.   GetProcedureAddress(_Thread32First, kernel32, 'Thread32First');
  508.   asm
  509.     mov esp, ebp
  510.     pop ebp
  511.     jmp [_Thread32First]
  512.   end;
  513. end;
  514. {$ELSE}
  515. function Thread32First; external kernel32 name 'Thread32First';
  516. {$ENDIF DYNAMIC_LINK}
  517. {$IFDEF DYNAMIC_LINK}
  518. var
  519.   _Thread32Next: Pointer;
  520. function Thread32Next;
  521. begin
  522.   GetProcedureAddress(_Thread32Next, kernel32, 'Thread32Next');
  523.   asm
  524.     mov esp, ebp
  525.     pop ebp
  526.     jmp [_Thread32Next]
  527.   end;
  528. end;
  529. {$ELSE}
  530. function Thread32Next; external kernel32 name 'Thread32Next';
  531. {$ENDIF DYNAMIC_LINK}
  532. {$IFDEF DYNAMIC_LINK}
  533. var
  534.   _Module32FirstW: Pointer;
  535. function Module32FirstW;
  536. begin
  537.   GetProcedureAddress(_Module32FirstW, kernel32, 'Module32FirstW');
  538.   asm
  539.     mov esp, ebp
  540.     pop ebp
  541.     jmp [_Module32FirstW]
  542.   end;
  543. end;
  544. {$ELSE}
  545. function Module32FirstW; external kernel32 name 'Module32FirstW';
  546. {$ENDIF DYNAMIC_LINK}
  547. {$IFDEF DYNAMIC_LINK}
  548. var
  549.   _Module32NextW: Pointer;
  550. function Module32NextW;
  551. begin
  552.   GetProcedureAddress(_Module32NextW, kernel32, 'Module32NextW');
  553.   asm
  554.     mov esp, ebp
  555.     pop ebp
  556.     jmp [_Module32NextW]
  557.   end;
  558. end;
  559. {$ELSE}
  560. function Module32NextW; external kernel32 name 'Module32NextW';
  561. {$ENDIF DYNAMIC_LINK}
  562. {$IFDEF UNICODE}
  563. {$IFDEF DYNAMIC_LINK}
  564. var
  565.   _Module32First: Pointer;
  566. function Module32First;
  567. begin
  568.   GetProcedureAddress(_Module32First, kernel32, 'Module32FirstW');
  569.   asm
  570.     mov esp, ebp
  571.     pop ebp
  572.     jmp [_Module32First]
  573.   end;
  574. end;
  575. {$ELSE}
  576. function Module32First; external kernel32 name 'Module32FirstW';
  577. {$ENDIF DYNAMIC_LINK}
  578. {$IFDEF DYNAMIC_LINK}
  579. var
  580.   _Module32Next: Pointer;
  581. function Module32Next;
  582. begin
  583.   GetProcedureAddress(_Module32Next, kernel32, 'Module32NextW');
  584.   asm
  585.     mov esp, ebp
  586.     pop ebp
  587.     jmp [_Module32Next]
  588.   end;
  589. end;
  590. {$ELSE}
  591. function Module32Next; external kernel32 name 'Module32NextW';
  592. {$ENDIF DYNAMIC_LINK}
  593. {$ELSE}
  594. {$IFDEF DYNAMIC_LINK}
  595. var
  596.   _Module32First: Pointer;
  597. function Module32First;
  598. begin
  599.   GetProcedureAddress(_Module32First, kernel32, 'Module32First');
  600.   asm
  601.     mov esp, ebp
  602.     pop ebp
  603.     jmp [_Module32First]
  604.   end;
  605. end;
  606. {$ELSE}
  607. function Module32First; external kernel32 name 'Module32First';
  608. {$ENDIF DYNAMIC_LINK}
  609. {$IFDEF DYNAMIC_LINK}
  610. var
  611.   _Module32Next: Pointer;
  612. function Module32Next;
  613. begin
  614.   GetProcedureAddress(_Module32Next, kernel32, 'Module32Next');
  615.   asm
  616.     mov esp, ebp
  617.     pop ebp
  618.     jmp [_Module32Next]
  619.   end;
  620. end;
  621. {$ELSE}
  622. function Module32Next; external kernel32 name 'Module32Next';
  623. {$ENDIF DYNAMIC_LINK}
  624. {$ENDIF}
  625. end.