jwatlhelp32.pas 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585
  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 att chello dott 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 }
  18. { APILIB home page, located at http://jedi-apilib.sourceforge.net }
  19. { }
  20. { The contents of this file are used with permission, subject to the Mozilla }
  21. { Public License Version 1.1 (the "License"); you may not use this file except }
  22. { in compliance with the License. You may obtain a copy of the License at }
  23. { http://www.mozilla.org/MPL/MPL-1.1.html }
  24. { }
  25. { Software distributed under the License is distributed on an "AS IS" basis, }
  26. { WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for }
  27. { the specific language governing rights and limitations under the License. }
  28. { }
  29. { Alternatively, the contents of this file may be used under the terms of the }
  30. { GNU Lesser General Public License (the "LGPL License"), in which case the }
  31. { provisions of the LGPL License are applicable instead of those above. }
  32. { If you wish to allow use of your version of this file only under the terms }
  33. { of the LGPL License and not to allow others to use your version of this file }
  34. { under the MPL, indicate your decision by deleting the provisions above and }
  35. { replace them with the notice and other provisions required by the LGPL }
  36. { License. If you do not delete the provisions above, a recipient may use }
  37. { your version of this file under either the MPL or the LGPL License. }
  38. { }
  39. { For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html }
  40. { }
  41. {******************************************************************************}
  42. // $Id: JwaTlHelp32.pas,v 1.9 2005/09/06 16:36:50 marquardt Exp $
  43. unit JwaTlHelp32;
  44. {$WEAKPACKAGEUNIT}
  45. {$HPPEMIT ''}
  46. {$HPPEMIT '#include "tlhelp32.h"'}
  47. {$HPPEMIT ''}
  48. {$I jediapilib.inc}
  49. interface
  50. uses
  51. JwaWindows;
  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. {$IFDEF UNICODE}
  180. PROCESSENTRY32 = PROCESSENTRY32W;
  181. {$EXTERNALSYM PROCESSENTRY32}
  182. PPROCESSENTRY32 = PPROCESSENTRY32W;
  183. {$EXTERNALSYM PPROCESSENTRY32}
  184. LPPROCESSENTRY32 = LPPROCESSENTRY32W;
  185. {$EXTERNALSYM LPPROCESSENTRY32}
  186. TProcessEntry32 = TProcessEntry32W;
  187. {$ELSE}
  188. PPROCESSENTRY32 = ^PROCESSENTRY32;
  189. {$EXTERNALSYM PPROCESSENTRY32}
  190. tagPROCESSENTRY32 = record
  191. dwSize: DWORD;
  192. cntUsage: DWORD;
  193. th32ProcessID: DWORD; // this process
  194. th32DefaultHeapID: ULONG_PTR;
  195. th32ModuleID: DWORD; // associated exe
  196. cntThreads: DWORD;
  197. th32ParentProcessID: DWORD; // this process's parent process
  198. pcPriClassBase: LONG; // Base priority of process's threads
  199. dwFlags: DWORD;
  200. szExeFile: array [0..MAX_PATH - 1] of Char; // Path
  201. end;
  202. {$EXTERNALSYM tagPROCESSENTRY32}
  203. PROCESSENTRY32 = tagPROCESSENTRY32;
  204. {$EXTERNALSYM PROCESSENTRY32}
  205. LPPROCESSENTRY32 = ^PROCESSENTRY32;
  206. {$EXTERNALSYM LPPROCESSENTRY32}
  207. TProcessEntry32 = PROCESSENTRY32;
  208. {$ENDIF UNICODE}
  209. function Process32FirstW(hSnapshot: HANDLE; var lppe: PROCESSENTRY32W): BOOL; stdcall;
  210. {$EXTERNALSYM Process32FirstW}
  211. function Process32NextW(hSnapshot: HANDLE; var lppe: PROCESSENTRY32W): BOOL; stdcall;
  212. {$EXTERNALSYM Process32NextW}
  213. function Process32First(hSnapshot: HANDLE; var lppe: PROCESSENTRY32): BOOL; stdcall;
  214. {$EXTERNALSYM Process32First}
  215. function Process32Next(hSnapshot: HANDLE; var lppe: PROCESSENTRY32): BOOL; stdcall;
  216. {$EXTERNALSYM Process32Next}
  217. // Thread walking
  218. type
  219. PTHREADENTRY32 = ^THREADENTRY32;
  220. {$EXTERNALSYM PTHREADENTRY32}
  221. tagTHREADENTRY32 = record
  222. dwSize: DWORD;
  223. cntUsage: DWORD;
  224. th32ThreadID: DWORD; // this thread
  225. th32OwnerProcessID: DWORD; // Process this thread is associated with
  226. tpBasePri: LONG;
  227. tpDeltaPri: LONG;
  228. dwFlags: DWORD;
  229. end;
  230. {$EXTERNALSYM tagTHREADENTRY32}
  231. THREADENTRY32 = tagTHREADENTRY32;
  232. {$EXTERNALSYM THREADENTRY32}
  233. LPTHREADENTRY32 = ^THREADENTRY32;
  234. {$EXTERNALSYM LPTHREADENTRY32}
  235. TThreadEntry32 = THREADENTRY32;
  236. function Thread32First(hSnapshot: HANDLE; var lpte: THREADENTRY32): BOOL; stdcall;
  237. {$EXTERNALSYM Thread32First}
  238. function Thread32Next(hSnapshot: HANDLE; var lpte: THREADENTRY32): BOOL; stdcall;
  239. {$EXTERNALSYM Thread32Next}
  240. // Module walking
  241. type
  242. PMODULEENTRY32W = ^MODULEENTRY32W;
  243. {$EXTERNALSYM PMODULEENTRY32W}
  244. tagMODULEENTRY32W = record
  245. dwSize: DWORD;
  246. th32ModuleID: DWORD; // This module
  247. th32ProcessID: DWORD; // owning process
  248. GlblcntUsage: DWORD; // Global usage count on the module
  249. ProccntUsage: DWORD; // Module usage count in th32ProcessID's context
  250. modBaseAddr: LPBYTE; // Base address of module in th32ProcessID's context
  251. modBaseSize: DWORD; // Size in bytes of module starting at modBaseAddr
  252. hModule: HMODULE; // The hModule of this module in th32ProcessID's context
  253. szModule: array [0..MAX_MODULE_NAME32] of WCHAR;
  254. szExePath: array [0..MAX_PATH - 1] of WCHAR;
  255. end;
  256. {$EXTERNALSYM tagMODULEENTRY32W}
  257. MODULEENTRY32W = tagMODULEENTRY32W;
  258. {$EXTERNALSYM MODULEENTRY32W}
  259. LPMODULEENTRY32W = ^MODULEENTRY32W;
  260. {$EXTERNALSYM LPMODULEENTRY32W}
  261. TModuleEntry32W = MODULEENTRY32W;
  262. {$IFDEF UNICODE}
  263. MODULEENTRY32 = MODULEENTRY32W;
  264. {$EXTERNALSYM MODULEENTRY32}
  265. PMODULEENTRY32 = PMODULEENTRY32W;
  266. {$EXTERNALSYM PMODULEENTRY32}
  267. LPMODULEENTRY32 = LPMODULEENTRY32W;
  268. {$EXTERNALSYM LPMODULEENTRY32}
  269. TModuleEntry32 = TModuleEntry32W;
  270. {$ELSE}
  271. PMODULEENTRY32 = ^MODULEENTRY32;
  272. {$EXTERNALSYM PMODULEENTRY32}
  273. tagMODULEENTRY32 = record
  274. dwSize: DWORD;
  275. th32ModuleID: DWORD; // This module
  276. th32ProcessID: DWORD; // owning process
  277. GlblcntUsage: DWORD; // Global usage count on the module
  278. ProccntUsage: DWORD; // Module usage count in th32ProcessID's context
  279. modBaseAddr: LPBYTE; // Base address of module in th32ProcessID's context
  280. modBaseSize: DWORD; // Size in bytes of module starting at modBaseAddr
  281. hModule: HMODULE; // The hModule of this module in th32ProcessID's context
  282. szModule: array [0..MAX_MODULE_NAME32] of Char;
  283. szExePath: array [0..MAX_PATH - 1] of Char;
  284. end;
  285. {$EXTERNALSYM tagMODULEENTRY32}
  286. MODULEENTRY32 = tagMODULEENTRY32;
  287. {$EXTERNALSYM MODULEENTRY32}
  288. LPMODULEENTRY32 = ^MODULEENTRY32;
  289. {$EXTERNALSYM LPMODULEENTRY32}
  290. TModuleEntry32 = MODULEENTRY32;
  291. {$ENDIF UNICODE}
  292. function Module32FirstW(hSnapshot: HANDLE; var lpme: MODULEENTRY32W): BOOL; stdcall;
  293. {$EXTERNALSYM Module32FirstW}
  294. function Module32NextW(hSnapshot: HANDLE; var lpme: MODULEENTRY32W): BOOL; stdcall;
  295. {$EXTERNALSYM Module32NextW}
  296. //
  297. // NOTE CAREFULLY that the modBaseAddr and hModule fields are valid ONLY
  298. // in th32ProcessID's process context.
  299. //
  300. function Module32First(hSnapshot: HANDLE; var lpme: MODULEENTRY32): BOOL; stdcall;
  301. {$EXTERNALSYM Module32First}
  302. function Module32Next(hSnapshot: HANDLE; var lpme: MODULEENTRY32): BOOL; stdcall;
  303. {$EXTERNALSYM Module32Next}
  304. implementation
  305. uses
  306. JwaWinDLLNames;
  307. {$IFDEF DYNAMIC_LINK}
  308. var
  309. _CreateToolhelp32Snapshot: Pointer;
  310. function CreateToolhelp32Snapshot;
  311. begin
  312. GetProcedureAddress(_CreateToolhelp32Snapshot, kernel32, 'CreateToolhelp32Snapshot');
  313. asm
  314. MOV ESP, EBP
  315. POP EBP
  316. JMP [_CreateToolhelp32Snapshot]
  317. end;
  318. end;
  319. var
  320. _Heap32ListFirst: Pointer;
  321. function Heap32ListFirst;
  322. begin
  323. GetProcedureAddress(_Heap32ListFirst, kernel32, 'Heap32ListFirst');
  324. asm
  325. MOV ESP, EBP
  326. POP EBP
  327. JMP [_Heap32ListFirst]
  328. end;
  329. end;
  330. var
  331. _Heap32ListNext: Pointer;
  332. function Heap32ListNext;
  333. begin
  334. GetProcedureAddress(_Heap32ListNext, kernel32, 'Heap32ListNext');
  335. asm
  336. MOV ESP, EBP
  337. POP EBP
  338. JMP [_Heap32ListNext]
  339. end;
  340. end;
  341. var
  342. _Heap32First: Pointer;
  343. function Heap32First;
  344. begin
  345. GetProcedureAddress(_Heap32First, kernel32, 'Heap32First');
  346. asm
  347. MOV ESP, EBP
  348. POP EBP
  349. JMP [_Heap32First]
  350. end;
  351. end;
  352. var
  353. _Heap32Next: Pointer;
  354. function Heap32Next;
  355. begin
  356. GetProcedureAddress(_Heap32Next, kernel32, 'Heap32Next');
  357. asm
  358. MOV ESP, EBP
  359. POP EBP
  360. JMP [_Heap32Next]
  361. end;
  362. end;
  363. var
  364. _Toolhelp32ReadProcessMemory: Pointer;
  365. function Toolhelp32ReadProcessMemory;
  366. begin
  367. GetProcedureAddress(_Toolhelp32ReadProcessMemory, kernel32, 'Toolhelp32ReadProcessMemory');
  368. asm
  369. MOV ESP, EBP
  370. POP EBP
  371. JMP [_Toolhelp32ReadProcessMemory]
  372. end;
  373. end;
  374. var
  375. _Process32FirstW: Pointer;
  376. function Process32FirstW;
  377. begin
  378. GetProcedureAddress(_Process32FirstW, kernel32, 'Process32FirstW');
  379. asm
  380. MOV ESP, EBP
  381. POP EBP
  382. JMP [_Process32FirstW]
  383. end;
  384. end;
  385. var
  386. _Process32NextW: Pointer;
  387. function Process32NextW;
  388. begin
  389. GetProcedureAddress(_Process32NextW, kernel32, 'Process32NextW');
  390. asm
  391. MOV ESP, EBP
  392. POP EBP
  393. JMP [_Process32NextW]
  394. end;
  395. end;
  396. var
  397. _Process32First: Pointer;
  398. function Process32First;
  399. begin
  400. GetProcedureAddress(_Process32First, kernel32, 'Process32First' + AWSuffix);
  401. asm
  402. MOV ESP, EBP
  403. POP EBP
  404. JMP [_Process32First]
  405. end;
  406. end;
  407. var
  408. _Process32Next: Pointer;
  409. function Process32Next;
  410. begin
  411. GetProcedureAddress(_Process32Next, kernel32, 'Process32Next' + AWSuffix);
  412. asm
  413. MOV ESP, EBP
  414. POP EBP
  415. JMP [_Process32Next]
  416. end;
  417. end;
  418. var
  419. _Thread32First: Pointer;
  420. function Thread32First;
  421. begin
  422. GetProcedureAddress(_Thread32First, kernel32, 'Thread32First');
  423. asm
  424. MOV ESP, EBP
  425. POP EBP
  426. JMP [_Thread32First]
  427. end;
  428. end;
  429. var
  430. _Thread32Next: Pointer;
  431. function Thread32Next;
  432. begin
  433. GetProcedureAddress(_Thread32Next, kernel32, 'Thread32Next');
  434. asm
  435. MOV ESP, EBP
  436. POP EBP
  437. JMP [_Thread32Next]
  438. end;
  439. end;
  440. var
  441. _Module32FirstW: Pointer;
  442. function Module32FirstW;
  443. begin
  444. GetProcedureAddress(_Module32FirstW, kernel32, 'Module32FirstW');
  445. asm
  446. MOV ESP, EBP
  447. POP EBP
  448. JMP [_Module32FirstW]
  449. end;
  450. end;
  451. var
  452. _Module32NextW: Pointer;
  453. function Module32NextW;
  454. begin
  455. GetProcedureAddress(_Module32NextW, kernel32, 'Module32NextW');
  456. asm
  457. MOV ESP, EBP
  458. POP EBP
  459. JMP [_Module32NextW]
  460. end;
  461. end;
  462. var
  463. _Module32First: Pointer;
  464. function Module32First;
  465. begin
  466. GetProcedureAddress(_Module32First, kernel32, 'Module32First' + AWSuffix);
  467. asm
  468. MOV ESP, EBP
  469. POP EBP
  470. JMP [_Module32First]
  471. end;
  472. end;
  473. var
  474. _Module32Next: Pointer;
  475. function Module32Next;
  476. begin
  477. GetProcedureAddress(_Module32Next, kernel32, 'Module32Next' + AWSuffix);
  478. asm
  479. MOV ESP, EBP
  480. POP EBP
  481. JMP [_Module32Next]
  482. end;
  483. end;
  484. {$ELSE}
  485. function CreateToolhelp32Snapshot; external kernel32 name 'CreateToolhelp32Snapshot';
  486. function Heap32ListFirst; external kernel32 name 'Heap32ListFirst';
  487. function Heap32ListNext; external kernel32 name 'Heap32ListNext';
  488. function Heap32First; external kernel32 name 'Heap32First';
  489. function Heap32Next; external kernel32 name 'Heap32Next';
  490. function Toolhelp32ReadProcessMemory; external kernel32 name 'Toolhelp32ReadProcessMemory';
  491. function Process32FirstW; external kernel32 name 'Process32FirstW';
  492. function Process32NextW; external kernel32 name 'Process32NextW';
  493. function Process32First; external kernel32 name 'Process32First' + AWSuffix;
  494. function Process32Next; external kernel32 name 'Process32Next' + AWSuffix;
  495. function Thread32First; external kernel32 name 'Thread32First';
  496. function Thread32Next; external kernel32 name 'Thread32Next';
  497. function Module32FirstW; external kernel32 name 'Module32FirstW';
  498. function Module32NextW; external kernel32 name 'Module32NextW';
  499. function Module32First; external kernel32 name 'Module32First' + AWSuffix;
  500. function Module32Next; external kernel32 name 'Module32Next' + AWSuffix;
  501. {$ENDIF DYNAMIC_LINK}
  502. end.