现在的位置: 首页 > 综合 > 正文

CreateToolHelp32Snapshot函数获取系统快照

2013年09月26日 ⁄ 综合 ⁄ 共 3496字 ⁄ 字号 评论关闭

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

 

抱歉!评论已关闭.