CreateToolHelp32Snapshot函数获取系统快照

来源:互联网 发布:linux怎么配置jdk 编辑:程序博客网 时间:2024/06/05 00:08

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