CreateToolHelp32Snapshot函數獲取系統快照

        系統爲我們在內存中指定了一個關於進程、線程、堆和模塊等的當前狀態信息副本-----系統快照,我們可以通過CreateToolHelp32Snapshot函數來獲取系統快照的句柄,通過該句柄來獲取當前狀態信息。該函數如下:

HANDLE WINAPI CreateToolhelp32Snapshot(
  DWORD dwFlags,       
  DWORD th32ProcessID  
);
  • dwFlags:該參數用於指定系統快照中包含的內容,其可以爲下面值之一:

TH32CS_INHERIT 聲明快照句柄是可繼承的
TH32CS_SNAPALL 在快照中包含系統中所有的線程和進程,堆,模塊
TH32CS_SNAPHEAPLIST 在快照中包括在th32ProcessID中指定的所有堆
TH32CS_SNAPMODULE 在快照中包括在th32ProcessID中指定的所有模塊
TH32CS_SNAPPROCESS 在快照中包括所有的進程
TH32CS_SNAPTHREAD 在快照中包括所有的線程
  •  th32ProcessID:該參數用於指定進程的ID。只有在dwFlags爲TH32CS_SNAPHEAPLIST或TH32CS_SNAPMODULE時纔有效。

       操作完成後,我們可以運用CloseToolHelp32Snapshot函數來關閉系統快照句柄:

BOOL WINAPI CloseToolhelp32Snapshot(
  HANDLE hSnapshot );

1.操作進程快照

1)Process32First函數

BOOL WINAPI Process32First( 
  HANDLE hSnapshot, 
  LPPROCESSENTRY32 lppe );

功能:獲取進程快照列表的第一個進程狀態信息。

參數:hSnapshot爲快照句柄;lppe參數爲指向PROCESSENTRY32結構體的指針,該結構體的形式如下:

typedef struct tagPROCESSENTRY32 { 
  DWORD dwSize;//該結構體的大小 
  DWORD cntUsage;//進程的引用計數 
  DWORD th32ProcessID; //進程的ID
  DWORD th32DefaultHeapID; //進程的默認堆ID
  DWORD th32ModuleID; //進程模塊ID
  DWORD cntThreads; //次進程開啓的線程計數
  DWORD th32ParentProcessID; //此進程的父進程ID
  LONG pcPriClassBase; //線程的相對優先級
  DWORD dwFlags; //保留字段
  TCHAR szExeFile[MAX_PATH];//進程的全名 
} PROCESSENTRY32; 
typedef PROCESSENTRY32 * PPROCESSENTRY32; 

注意:調用該函數必須制定dwSize的大小。

2)Process32Next函數

BOOL WINAPI Process32Next( 
  HANDLE hSnapshot, 
  LPPROCESSENTRY32 lppe );

功能:該函數獲取進程快照列表中的下一個進程狀態信息,該函數返回TRUE,表示成功獲取;返回FLASE,表示失敗。

2.操作線程快照

1)Thread3First含糊

BOOL WINAPI Thread32First( 
  HANDLE hSnapshot, 
  LPTHREADENTRY32 lpte );

功能:獲取快照列表中的第一個線程的狀態信息。

參數:hSnapshot爲系統快照句柄;lpte爲一個指向THREADENTRY32結構體的指針,該結構的形式如下:

typedef struct tagTHREADENTRY32{ 
  DWORD dwSize; //結構體的大小
  DWORD cntUsage; //線程引用計數
  DWORD th32ThreadID; //線程的ID
  DWORD th32OwnerProcessID; //擁有該線程的進程ID
  LONG tpBasePri; //線程的相對優先級,共7個值
  LONG tpDeltaPri; //這個成員已經不再被使用,總是設置爲零。
  DWORD dwFlags;//保留字段,沒使用,爲0.
} THREADENTRY32; 
typedef THREADENTRY32 * PTHREADENTRY32; 

2)Thread32Next函數

BOOL WINAPI Thread32Next( 
  HANDLE hSnapshot, 
  LPTHREADENTRY32 lpte );

功能:獲取快照列表中的下一個線程快照狀態信息。

3.操作堆快照

1)Heap32First函數

BOOL WINAPI Heap32First( 
  HANDLE hSnapshot, 
  LPHEAPENTRY32 lphe, 
  DWORD th32ProcessID, 
  DWORD th32HeapID );

該函數:獲取快照中響應的堆。

參數:

typedef struct tagHEAPENTRY32 
{ 
  DWORD dwSize;//結構體大小 
  HANDLE hHandle; //指向一個堆塊
  DWORD dwAddress; //堆的拾起地址
  DWORD dwBlockSize; //堆的大小
  DWORD dwFlags; //保留
  DWORD dwLockCount; //沒使用
  DWORD dwResvd; //不再使用
  DWORD th32ProcessID; //擁有該對的進程ID
  DWORD th32HeapID; //該堆的標識符
} HEAPENTRY32; 
typedef HEAPENTRY32 * PHEAPENTRY32; 
typedef HEAPENTRY32 * LPHEAPENTRY32; 

2)Heap32Next函數

BOOL WINAPI Heap32Next( 
  HANDLE hSnapshot, 
  LPHEAPENTRY32 lphe );

3)Heap32LitFirst函數

BOOL WINAPI Heap32ListFirst( 
  HANDLE hSnapshot, 
  LPHEAPLIST32 lphl );

參數:

typedef struct tagHEAPLIST32 { 
  DWORD dwSize;//結構體大小 
  DWORD th32ProcessID; //進程ID
  DWORD th32HeapID; //堆棧標識符
  DWORD dwFlags; //保留,爲0
} HEAPLIST32; 
typedef HEAPLIST32 * PHEAPLIST32; 
typedef HEAPLIST32 * LPHEAPLIST32; 

4)Heap32ListNext函數

BOOL WINAPI Heap32ListNext( 
  HANDLE hSnapshot, 
  LPHEAPLIST32 lphl );


4.操作模塊快照

1)Module32First函數

BOOL WINAPI Module32First( 
  HANDLE hSnapshot, 
  LPMODULEENTRY32 lpme );

功能:從系統快照中獲取第一個模塊信息。

參數:lpme爲指向MODULEENTRY32結構體的指針,其形式如下:

typedef struct tagMODULEENTRY32 { 
  DWORD dwSize; //該結構體的大小
  DWORD th32ModuleID; //進程上下文模塊標識符
  DWORD th32ProcessID; //進程標識符
  DWORD GlblcntUsage; //全局模塊引用計數
  DWORD ProccntUsage; //所屬進程的模塊引用計數
  BYTE *modBaseAddr; //所屬進程的基地址
  DWORD modBaseSize; //
  HMODULE hModule;//模塊的句柄 
  TCHAR szModule[MAX_MODULE_NAME32 + 1]; //模塊名
  TCHAR szExePath[MAX_PATH]; //路徑
} MODULEENTRY32; 
typedef MODULEENTRY32 * PMODULEENTRY32; 

2)Module32Next函數

BOOL WINAPI Module32Next(
  HANDLE hSnapshot, 
  LPMODULEENTRY32 lpme );

5.Toolhelp32ReadProcessMemory   函數獲得指定進程中指定內存區域的數據。

BOOL WINAPI Toolhelp32ReadProcessMemory( 
  DWORD th32ProcessID,//指定的進程的ID
  LPCVOID lpBaseAddress, //指定進程的基地址
  LPVOID lpBuffer, //緩衝區,用於保存數據
  DWORD cbRead, //緩衝區的大小
  LPDWORD lpNumberOfBytesRead //實際讀到的數據  
);


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章