系统为我们在内存中指定了一个关于进程、线程、堆和模块等的当前状态信息副本-----系统快照,我们可以通过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 //实际读到的数据
);