CreateToolhelp32Snapshot

  CreateToolhelp32Snapshot函数为指定的进程、进程使用的堆[HEAP]、模块[MODULE]、线程[THREAD])建立一个快照[snapshot]。
  HANDLE WINAPI CreateToolhelp32Snapshot(
  DWORD dwFlags,
  DWORD th32ProcessID
  );
  参数:
  dwFlags
  [输入]指定快照中包含的系统内容,这个参数能够使用下列数值(变量)中的一个。
  TH32CS_INHERIT - 声明快照句柄是可继承的。
  TH32CS_SNAPALL - 在快照中包含系统中所有的进程和线程。
  TH32CS_SNAPHEAPLIST - 在快照中包含在th32ProcessID中指定的进程的所有的堆。
  TH32CS_SNAPMODULE - 在快照中包含在th32ProcessID中指定的进程的所有的模块。
  TH32CS_SNAPPROCESS - 在快照中包含系统中所有的进程。
  TH32CS_SNAPTHREAD - 在快照中包含系统中所有的线程。
  Const TH32CS_SNAPHEAPLIST = &H1
  Const TH32CS_SNAPPROCESS = &H2
  Const TH32CS_SNAPTHREAD = &H4
  Const TH32CS_SNAPMODULE = &H8
  Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE)
  Const TH32CS_INHERIT = &H80000000
  th32ProcessID
  [输入]指定将要快照的进程ID。如果该参数为0表示快照当前进程。该参数只有在设置了TH32CS_SNAPHEAPLIST或TH32CS_SNAPMOUDLE后才有效,在其他情况下该参数被忽略,所有的进程都会被快照。
  返回值:
  调用成功,返回快照的句柄,调用失败,返回INVAID_HANDLE_VALUE。
  备注:
  使用GetLastError函数查找该函数产生的错误状态码。
  要删除快照,使用CloseHandle函数
Delphi实现:
  1. unit uAPISpy;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5.   Dialogs, Menus, StdCtrls;
  6. type
  7.   TfrmMain = class(TForm)
  8.     mmoInf: TMemo;
  9.     mmnuMain: TMainMenu;
  10.     mnuSystem: TMenuItem;
  11.     mnuiRefresh: TMenuItem;
  12.     mnuiClose: TMenuItem;
  13.     procedure mnuiRefreshClick(Sender: TObject);
  14.     procedure mnuiCloseClick(Sender: TObject);
  15.   private
  16.     { Private declarations }
  17.   public
  18.     { Public declarations }
  19.   end;
  20. var
  21.   frmMain: TfrmMain;
  22. implementation
  23. uses
  24.   TLHelp32;
  25. {$R *.dfm}
  26. procedure TfrmMain.mnuiRefreshClick(Sender: TObject);
  27. var
  28.   processName: string;
  29.   processID: integer;
  30.   listLoop: boolean;
  31.   fSnapshotHandle: THandle;
  32.   fProcessEntry32: TProcessEntry32;
  33. begin
  34.   //Set the sizeof the struct
  35.   fProcessEntry32.dwsize := SizeOf(fProcessEntry32);
  36.   //take a snapshot for all of the processes on the system
  37.   fSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  38.   if (fSnapshotHandle = INVALID_HANDLE_VALUE) then
  39.   begin
  40.     exit;
  41.   end;
  42.   //Traversing the processes
  43.   listLoop := Process32First(fSnapshotHandle, fProcessEntry32);
  44.   while listLoop do
  45.   begin
  46.     processName := fProcessEntry32.szExeFile;
  47.     processID := fProcessEntry32.th32ProcessID;
  48.     mmoInf.Lines.Add('ProcessName:' + processName);
  49.     mmoInf.Lines.Add('ProcessID:' + IntToStr(processID));
  50.     listLoop := Process32Next(fSnapshotHandle, fProcessEntry32);
  51.   end;
  52.   //Release the handle
  53.   CloseHandle(fSnapshotHandle);
  54. end;
  55. procedure TfrmMain.mnuiCloseClick(Sender: TObject);
  56. begin
  57.   Close;
  58. end;
  59. end.

附上TLHelp32模块源码:

  1. { *********************************************************************** }
  2. {                                                                         }
  3. { Delphi Runtime Library                                                  }
  4. {                                                                         }
  5. { Copyright (c) 1996-2001 Borland Software Corporation                    }
  6. {                                                                         }
  7. { *********************************************************************** }
  8. {*******************************************************}
  9. {       Tool Help Functions, Types, and Definitions     }
  10. {*******************************************************}
  11. unit TlHelp32;
  12. {$WEAKPACKAGEUNIT}
  13. interface
  14. uses Windows;
  15. {$HPPEMIT '#include <tlhelp32.h>'}
  16. const
  17. {$EXTERNALSYM MAX_MODULE_NAME32}
  18.   MAX_MODULE_NAME32 = 255;
  19. (****** Shapshot function **********************************************)
  20. {$EXTERNALSYM CreateToolhelp32Snapshot}
  21. function CreateToolhelp32Snapshot(dwFlags, th32ProcessID: DWORD): THandle;
  22. type
  23.   TCreateToolhelp32Snapshot = function (dwFlags, th32ProcessID: DWORD): THandle stdcall;
  24. //
  25. // The th32ProcessID argument is only used if TH32CS_SNAPHEAPLIST or
  26. // TH32CS_SNAPMODULE is specified. th32ProcessID == 0 means the current
  27. // process.
  28. //
  29. // NOTE that all of the snapshots are global except for the heap and module
  30. //  lists which are process specific. To enumerate the heap or module
  31. //  state for all WIN32 processes call with TH32CS_SNAPALL and the
  32. //  current process. Then for each process in the TH32CS_SNAPPROCESS
  33. //  list that isn't the current process, do a call with just
  34. //  TH32CS_SNAPHEAPLIST and/or TH32CS_SNAPMODULE.
  35. //
  36. // dwFlags
  37. //
  38. const
  39. {$EXTERNALSYM TH32CS_SNAPHEAPLIST}
  40.   TH32CS_SNAPHEAPLIST = $00000001;
  41. {$EXTERNALSYM TH32CS_SNAPPROCESS}
  42.   TH32CS_SNAPPROCESS  = $00000002;
  43. {$EXTERNALSYM TH32CS_SNAPTHREAD}
  44.   TH32CS_SNAPTHREAD   = $00000004;
  45. {$EXTERNALSYM TH32CS_SNAPMODULE}
  46.   TH32CS_SNAPMODULE   = $00000008;
  47. {$EXTERNALSYM TH32CS_SNAPALL}
  48.   TH32CS_SNAPALL      = TH32CS_SNAPHEAPLIST or TH32CS_SNAPPROCESS or
  49.     TH32CS_SNAPTHREAD or TH32CS_SNAPMODULE;
  50. {$EXTERNALSYM TH32CS_INHERIT}
  51.   TH32CS_INHERIT      = $80000000;
  52. //
  53. // Use CloseHandle to destroy the snapshot
  54. //
  55. (****** heap walking ***************************************************)
  56. type
  57. {$EXTERNALSYM tagHEAPLIST32}
  58.   tagHEAPLIST32 = record
  59.     dwSize: DWORD;
  60.     th32ProcessID: DWORD;  // owning process
  61.     th32HeapID: DWORD;     // heap (in owning process's context!)
  62.     dwFlags: DWORD;
  63.   end;
  64. {$EXTERNALSYM HEAPLIST32}
  65.   HEAPLIST32 = tagHEAPLIST32;
  66. {$EXTERNALSYM PHEAPLIST32}
  67.   PHEAPLIST32 = ^tagHEAPLIST32;
  68. {$EXTERNALSYM LPHEAPLIST32}
  69.   LPHEAPLIST32 = ^tagHEAPLIST32;
  70.   THeapList32 = tagHEAPLIST32;
  71. //
  72. // dwFlags
  73. //
  74. const
  75. {$EXTERNALSYM HF32_DEFAULT}
  76.   HF32_DEFAULT = 1;  // process's default heap
  77. {$EXTERNALSYM HF32_SHARED}
  78.   HF32_SHARED  = 2;  // is shared heap
  79. {$EXTERNALSYM Heap32ListFirst}
  80. function Heap32ListFirst(hSnapshot: THandle; var lphl: THeapList32): BOOL;
  81. {$EXTERNALSYM Heap32ListNext}
  82. function Heap32ListNext(hSnapshot: THandle; var lphl: THeapList32): BOOL;
  83. type
  84.   THeap32ListFirst = function (hSnapshot: THandle; var lphl: THeapList32): BOOL stdcall;
  85.   THeap32ListNext = function (hSnapshot: THandle; var lphl: THeapList32): BOOL stdcall;
  86. type
  87. {$EXTERNALSYM tagHEAPENTRY32}
  88.   tagHEAPENTRY32 = record
  89.     dwSize: DWORD;
  90.     hHandle: THandle;     // Handle of this heap block
  91.     dwAddress: DWORD;     // Linear address of start of block
  92.     dwBlockSize: DWORD;   // Size of block in bytes
  93.     dwFlags: DWORD;
  94.     dwLockCount: DWORD;
  95.     dwResvd: DWORD;
  96.     th32ProcessID: DWORD; // owning process
  97.     th32HeapID: DWORD;    // heap block is in
  98.   end;
  99. {$EXTERNALSYM HEAPENTRY32}
  100.   HEAPENTRY32 = tagHEAPENTRY32;
  101. {$EXTERNALSYM PHEAPENTRY32}
  102.   PHEAPENTRY32 = ^tagHEAPENTRY32;
  103. {$EXTERNALSYM LPHEAPENTRY32}
  104.   LPHEAPENTRY32 = ^tagHEAPENTRY32;
  105.   THeapEntry32 = tagHEAPENTRY32;
  106. //
  107. // dwFlags
  108. //
  109. const
  110. {$EXTERNALSYM LF32_FIXED}
  111.   LF32_FIXED    = $00000001;
  112. {$EXTERNALSYM LF32_FREE}
  113.   LF32_FREE     = $00000002;
  114. {$EXTERNALSYM LF32_MOVEABLE}
  115.   LF32_MOVEABLE = $00000004;
  116. {$EXTERNALSYM Heap32First}
  117. function Heap32First(var lphe: THeapEntry32; th32ProcessID, th32HeapID: DWORD): BOOL;
  118. {$EXTERNALSYM Heap32Next}
  119. function Heap32Next(var lphe: THeapEntry32): BOOL;
  120. {$EXTERNALSYM Toolhelp32ReadProcessMemory}
  121. function Toolhelp32ReadProcessMemory(th32ProcessID: DWORD; lpBaseAddress: Pointer;
  122.   var lpBuffer; cbRead: DWORD; var lpNumberOfBytesRead: DWORD): BOOL;
  123. type
  124.   THeap32First = function (var lphe: THeapEntry32; th32ProcessID,
  125.     th32HeapID: DWORD): BOOL stdcall;
  126.   THeap32Next = function (var lphe: THeapEntry32): BOOL stdcall;
  127.   TToolhelp32ReadProcessMemory = function (th32ProcessID: DWORD;
  128.     lpBaseAddress: Pointer; var lpBuffer; cbRead: DWORD;
  129.     var lpNumberOfBytesRead: DWORD): BOOL stdcall;
  130. (***** Process walking *************************************************)
  131. type
  132. {$EXTERNALSYM tagPROCESSENTRY32W}
  133.   tagPROCESSENTRY32W = packed record
  134.     dwSize: DWORD;
  135.     cntUsage: DWORD;
  136.     th32ProcessID: DWORD;       // this process
  137.     th32DefaultHeapID: DWORD;
  138.     th32ModuleID: DWORD;        // associated exe
  139.     cntThreads: DWORD;
  140.     th32ParentProcessID: DWORD; // this process's parent process
  141.     pcPriClassBase: Longint;    // Base priority of process's threads
  142.     dwFlags: DWORD;
  143.     szExeFile: array[0..MAX_PATH - 1of WChar;// Path
  144.   end;
  145. {$EXTERNALSYM PROCESSENTRY32W}
  146.   PROCESSENTRY32W = tagPROCESSENTRY32W;
  147. {$EXTERNALSYM PPROCESSENTRY32W}
  148.   PPROCESSENTRY32W = ^tagPROCESSENTRY32W;
  149. {$EXTERNALSYM LPPROCESSENTRY32W}
  150.   LPPROCESSENTRY32W = ^tagPROCESSENTRY32W;
  151.   TProcessEntry32W = tagPROCESSENTRY32W;
  152. {$EXTERNALSYM Process32FirstW}
  153. function Process32FirstW(hSnapshot: THandle; var lppe: TProcessEntry32W): BOOL;
  154. {$EXTERNALSYM Process32NextW}
  155. function Process32NextW(hSnapshot: THandle; var lppe: TProcessEntry32W): BOOL;
  156. type
  157.   TProcess32FirstW = function (hSnapshot: THandle; var lppe: TProcessEntry32W): BOOL stdcall;
  158.   TProcess32NextW = function (hSnapshot: THandle; var lppe: TProcessEntry32W): BOOL stdcall;
  159. {$EXTERNALSYM tagPROCESSENTRY32}
  160.   tagPROCESSENTRY32 = packed record
  161.     dwSize: DWORD;
  162.     cntUsage: DWORD;
  163.     th32ProcessID: DWORD;       // this process
  164.     th32DefaultHeapID: DWORD;
  165.     th32ModuleID: DWORD;        // associated exe
  166.     cntThreads: DWORD;
  167.     th32ParentProcessID: DWORD; // this process's parent process
  168.     pcPriClassBase: Longint;    // Base priority of process's threads
  169.     dwFlags: DWORD;
  170.     szExeFile: array[0..MAX_PATH - 1of Char;// Path
  171.   end;
  172. {$EXTERNALSYM PROCESSENTRY32}
  173.   PROCESSENTRY32 = tagPROCESSENTRY32;
  174. {$EXTERNALSYM PPROCESSENTRY32}
  175.   PPROCESSENTRY32 = ^tagPROCESSENTRY32;
  176. {$EXTERNALSYM LPPROCESSENTRY32}
  177.   LPPROCESSENTRY32 = ^tagPROCESSENTRY32;
  178.   TProcessEntry32 = tagPROCESSENTRY32;
  179. {$EXTERNALSYM Process32First}
  180. function Process32First(hSnapshot: THandle; var lppe: TProcessEntry32): BOOL;
  181. {$EXTERNALSYM Process32Next}
  182. function Process32Next(hSnapshot: THandle; var lppe: TProcessEntry32): BOOL;
  183. type
  184.   TProcess32First = function (hSnapshot: THandle; var lppe: TProcessEntry32): BOOL stdcall;
  185.   TProcess32Next = function (hSnapshot: THandle; var lppe: TProcessEntry32): BOOL stdcall;
  186. (***** Thread walking **************************************************)
  187. type
  188. {$EXTERNALSYM tagTHREADENTRY32}
  189.   tagTHREADENTRY32 = record
  190.     dwSize: DWORD;
  191.     cntUsage: DWORD;
  192.     th32ThreadID: DWORD;       // this thread
  193.     th32OwnerProcessID: DWORD; // Process this thread is associated with
  194.     tpBasePri: Longint;
  195.     tpDeltaPri: Longint;
  196.     dwFlags: DWORD;
  197.   end;
  198. {$EXTERNALSYM THREADENTRY32}
  199.   THREADENTRY32 = tagTHREADENTRY32;
  200. {$EXTERNALSYM PTHREADENTRY32}
  201.   PTHREADENTRY32 = ^tagTHREADENTRY32;
  202. {$EXTERNALSYM LPTHREADENTRY32}
  203.   LPTHREADENTRY32 = ^tagTHREADENTRY32;
  204.   TThreadEntry32 = tagTHREADENTRY32;
  205. {$EXTERNALSYM Thread32First}
  206. function Thread32First(hSnapshot: THandle; var lpte: TThreadEntry32): BOOL; stdcall;
  207. {$EXTERNALSYM Thread32Next}
  208. function Thread32Next(hSnapshot: THandle; var lpte: TThreadENtry32): BOOL; stdcall;
  209. type
  210.   TThread32First = function (hSnapshot: THandle; var lpte: TThreadEntry32): BOOL stdcall;
  211.   TThread32Next = function (hSnapshot: THandle; var lpte: TThreadENtry32): BOOL stdcall;
  212. (***** Module walking *************************************************)
  213. type
  214. {$EXTERNALSYM tagMODULEENTRY32}
  215.   tagMODULEENTRY32 = record
  216.     dwSize: DWORD;
  217.     th32ModuleID: DWORD;  // This module
  218.     th32ProcessID: DWORD; // owning process
  219.     GlblcntUsage: DWORD;  // Global usage count on the module
  220.     ProccntUsage: DWORD;  // Module usage count in th32ProcessID's context
  221.     modBaseAddr: PBYTE;   // Base address of module in th32ProcessID's context
  222.     modBaseSize: DWORD;   // Size in bytes of module starting at modBaseAddr
  223.     hModule: HMODULE;     // The hModule of this module in th32ProcessID's context
  224.     szModule: array[0..MAX_MODULE_NAME32] of Char;
  225.     szExePath: array[0..MAX_PATH - 1of Char;
  226.   end;
  227. {$EXTERNALSYM MODULEENTRY32}
  228.   MODULEENTRY32 = tagMODULEENTRY32;
  229. {$EXTERNALSYM PMODULEENTRY32}
  230.   PMODULEENTRY32 = ^tagMODULEENTRY32;
  231. {$EXTERNALSYM LPMODULEENTRY32}
  232.   LPMODULEENTRY32 = ^tagMODULEENTRY32;
  233.   TModuleEntry32 = tagMODULEENTRY32;
  234. //
  235. // NOTE CAREFULLY that the modBaseAddr and hModule fields are valid ONLY
  236. // in th32ProcessID's process context.
  237. //
  238. {$EXTERNALSYM Module32First}
  239. function Module32First(hSnapshot: THandle; var lpme: TModuleEntry32): BOOL;
  240. {$EXTERNALSYM Module32Next}
  241. function Module32Next(hSnapshot: THandle; var lpme: TModuleEntry32): BOOL;
  242. type
  243.   TModule32First = function (hSnapshot: THandle; var lpme: TModuleEntry32): BOOL stdcall;
  244.   TModule32Next = function (hSnapshot: THandle; var lpme: TModuleEntry32): BOOL stdcall;
  245. {$EXTERNALSYM tagMODULEENTRY32W}
  246.   tagMODULEENTRY32W = record
  247.     dwSize: DWORD;
  248.     th32ModuleID: DWORD;  // This module
  249.     th32ProcessID: DWORD; // owning process
  250.     GlblcntUsage: DWORD;  // Global usage count on the module
  251.     ProccntUsage: DWORD;  // Module usage count in th32ProcessID's context
  252.     modBaseAddr: PBYTE;   // Base address of module in th32ProcessID's context
  253.     modBaseSize: DWORD;   // Size in bytes of module starting at modBaseAddr
  254.     hModule: HMODULE;     // The hModule of this module in th32ProcessID's context
  255.     szModule: array[0..MAX_MODULE_NAME32] of WChar;
  256.     szExePath: array[0..MAX_PATH - 1of WChar;
  257.   end;
  258. {$EXTERNALSYM MODULEENTRY32}
  259.   MODULEENTRY32W = tagMODULEENTRY32W;
  260. {$EXTERNALSYM PMODULEENTRY32}
  261.   PMODULEENTRY32W = ^tagMODULEENTRY32W;
  262. {$EXTERNALSYM LPMODULEENTRY32}
  263.   LPMODULEENTRY32W = ^tagMODULEENTRY32W;
  264.   TModuleEntry32W = tagMODULEENTRY32W;
  265. //
  266. // NOTE CAREFULLY that the modBaseAddr and hModule fields are valid ONLY
  267. // in th32ProcessID's process context.
  268. //
  269. {$EXTERNALSYM Module32FirstW}
  270. function Module32FirstW(hSnapshot: THandle; var lpme: TModuleEntry32W): BOOL;
  271. {$EXTERNALSYM Module32NextW}
  272. function Module32NextW(hSnapshot: THandle; var lpme: TModuleEntry32W): BOOL;
  273. type
  274.   TModule32FirstW = function (hSnapshot: THandle; var lpme: TModuleEntry32W): BOOL stdcall;
  275.   TModule32NextW = function (hSnapshot: THandle; var lpme: TModuleEntry32W): BOOL stdcall;
  276. implementation
  277. const
  278.   kernel32 = 'kernel32.dll';
  279. var
  280.   KernelHandle: THandle;
  281.   _CreateToolhelp32Snapshot: TCreateToolhelp32Snapshot;
  282.   _Heap32ListFirst: THeap32ListFirst;
  283.   _Heap32ListNext: THeap32ListNext;
  284.   _Heap32First: THeap32First;
  285.   _Heap32Next: THeap32Next;
  286.   _Toolhelp32ReadProcessMemory: TToolhelp32ReadProcessMemory;
  287.   _Process32First: TProcess32First;
  288.   _Process32Next: TProcess32Next;
  289.   _Process32FirstW: TProcess32FirstW;
  290.   _Process32NextW: TProcess32NextW;
  291.   _Thread32First: TThread32First;
  292.   _Thread32Next: TThread32Next;
  293.   _Module32First: TModule32First;
  294.   _Module32Next: TModule32Next;
  295.   _Module32FirstW: TModule32FirstW;
  296.   _Module32NextW: TModule32NextW;
  297. function InitToolHelp: Boolean;
  298. begin
  299.   if KernelHandle = 0 then
  300.   begin
  301.     KernelHandle := GetModuleHandle(kernel32);
  302.     if KernelHandle <> 0 then
  303.     begin
  304.       @_CreateToolhelp32Snapshot := GetProcAddress(KernelHandle, 'CreateToolhelp32Snapshot');
  305.       @_Heap32ListFirst := GetProcAddress(KernelHandle, 'Heap32ListFirst');
  306.       @_Heap32ListNext := GetProcAddress(KernelHandle, 'Heap32ListNext');
  307.       @_Heap32First := GetProcAddress(KernelHandle, 'Heap32First');
  308.       @_Heap32Next := GetProcAddress(KernelHandle, 'Heap32Next');
  309.       @_Toolhelp32ReadProcessMemory := GetProcAddress(KernelHandle, 'Toolhelp32ReadProcessMemory');
  310.       @_Process32First := GetProcAddress(KernelHandle, 'Process32First');
  311.       @_Process32Next := GetProcAddress(KernelHandle, 'Process32Next');
  312.       @_Process32FirstW := GetProcAddress(KernelHandle, 'Process32FirstW');
  313.       @_Process32NextW := GetProcAddress(KernelHandle, 'Process32NextW');
  314.       @_Thread32First := GetProcAddress(KernelHandle, 'Thread32First');
  315.       @_Thread32Next := GetProcAddress(KernelHandle, 'Thread32Next');
  316.       @_Module32First := GetProcAddress(KernelHandle, 'Module32First');
  317.       @_Module32Next := GetProcAddress(KernelHandle, 'Module32Next');
  318.       @_Module32FirstW := GetProcAddress(KernelHandle, 'Module32FirstW');
  319.       @_Module32NextW := GetProcAddress(KernelHandle, 'Module32NextW');
  320.     end;
  321.   end;
  322.   Result := (KernelHandle <> 0and Assigned(_CreateToolhelp32Snapshot);
  323. end;
  324. function CreateToolhelp32Snapshot;
  325. begin
  326.   if InitToolHelp then
  327.     Result := _CreateToolhelp32Snapshot(dwFlags, th32ProcessID)
  328.   else Result := 0;
  329. end;
  330. function Heap32ListFirst;
  331. begin
  332.   if InitToolHelp then
  333.     Result := _Heap32ListFirst(hSnapshot, lphl)
  334.   else Result := False;
  335. end;
  336. function Heap32ListNext;
  337. begin
  338.   if InitToolHelp then
  339.     Result := _Heap32ListNext(hSnapshot, lphl)
  340.   else Result := False;
  341. end;
  342. function Heap32First;
  343. begin
  344.   if InitToolHelp then
  345.     Result := _Heap32First(lphe, th32ProcessID, th32HeapID)
  346.   else Result := False;
  347. end;
  348. function Heap32Next;
  349. begin
  350.   if InitToolHelp then
  351.     Result := _Heap32Next(lphe)
  352.   else Result := False;
  353. end;
  354. function Toolhelp32ReadProcessMemory;
  355. begin
  356.   if InitToolHelp then
  357.     Result := _Toolhelp32ReadProcessMemory(th32ProcessID, lpBaseAddress,
  358.       lpBuffer, cbRead, lpNumberOfBytesRead)
  359.   else Result := False;
  360. end;
  361. function Process32First;
  362. begin
  363.   if InitToolHelp then
  364.     Result := _Process32First(hSnapshot, lppe)
  365.   else Result := False;
  366. end;
  367. function Process32Next;
  368. begin
  369.   if InitToolHelp then
  370.     Result := _Process32Next(hSnapshot, lppe)
  371.   else Result := False;
  372. end;
  373. function Process32FirstW;
  374. begin
  375.   if InitToolHelp then
  376.     Result := _Process32FirstW(hSnapshot, lppe)
  377.   else Result := False;
  378. end;
  379. function Process32NextW;
  380. begin
  381.   if InitToolHelp then
  382.     Result := _Process32NextW(hSnapshot, lppe)
  383.   else Result := False;
  384. end;
  385. function Thread32First;
  386. begin
  387.   if InitToolHelp then
  388.     Result := _Thread32First(hSnapshot, lpte)
  389.   else Result := False;
  390. end;
  391. function Thread32Next;
  392. begin
  393.   if InitToolHelp then
  394.     Result := _Thread32Next(hSnapshot, lpte)
  395.   else Result := False;
  396. end;
  397. function Module32First;
  398. begin
  399.   if InitToolHelp then
  400.     Result := _Module32First(hSnapshot, lpme)
  401.   else Result := False;
  402. end;
  403. function Module32Next;
  404. begin
  405.   if InitToolHelp then
  406.     Result := _Module32Next(hSnapshot, lpme)
  407.   else Result := False;
  408. end;
  409. function Module32FirstW;
  410. begin
  411.   if InitToolHelp then
  412.     Result := _Module32FirstW(hSnapshot, lpme)
  413.   else Result := False;
  414. end;
  415. function Module32NextW;
  416. begin
  417.   if InitToolHelp then
  418.     Result := _Module32NextW(hSnapshot, lpme)
  419.   else Result := False;
  420. end;
  421. end.

 

CreateToolHelp32SnapShot及其它用户态枚举进程都是基于ZwQuerySystemInformation的5号调用

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值