系统为我们在内存中指定了一个关于进程、线程、堆和模块等的当前状态信息副本-----系统快照,我们可以通过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.Toolhelp32ReadProcessMem
BOOL WINAPI Toolhelp32ReadProcessMemory( DWORD th32ProcessID,//指定的进程的ID LPCVOID lpBaseAddress, //指定进程的基地址 LPVOID lpBuffer, //缓冲区,用于保存数据 DWORD cbRead, //缓冲区的大小 LPDWORD lpNumberOfBytesRead //实际读到的数据 );