CreateToolhelp32Snapshot详解
HANDLE WINAPI CreateToolhelp32Snapshot(
DWORD dwFlags,
DWORD th32ProcessID
);//这个函数的意思是给想看的东西拍个照,然后慢慢的看(系统的进程或者线程的创建非常的迅速,所以只能拍个照片慢慢看,若是拍过照片之后,系统的进程,线程,堆栈等发生了变化,就不在考虑范围之内了,从这点来说,函数的名字还是挺贴合实际的)
dwFlags:
TH32CS_INHERIT :使用这个标志表示,这个快照句柄是可继承的
TH32CS_SNAPALL :表示使用了以下的全部标志,总共四个TH32CS_SNAPHEAPLIST, TH32CS_SNAPMODULE, TH32CS_SNAPPROCESS, and TH32CS_SNAPTHREAD.
TH32CS_SNAPHEAPLIST:表示快照信息包含特定进程的堆栈列表
TH32CS_SNAPMODULE :表示快照信息包含特定进程的使用模块的列表
TH32CS_SNAPPROCESS:表示快照信息包含系统的所有进程的列表
TH32CS_SNAPTHREAD :表示快照信息包含系统所有线程的列表
th32ProcessID:
只有当dwFlags信息中包含TH32CS_SNAPHEAPLIST,TH32CS_SNAPMODULE 时这个值才有效,否则,这个值会被忽略
那么我们举个例子
1.列举堆栈,若要列举堆栈,必须要用的函数是:Heap32ListFirst,Heap32ListNext(实际上我也不知道这么用的实际用途,不知道堆栈ID有什么用)
void CSuspendProcessDlg::EnumHeap(DWORD PID)
{
if(PID==0)
{
MessageBox("进程ID不能为0");
return;
}
CString temp;
m_threadid.ResetContent();//m_threadid为一个列表框
HANDLE hShot=CreateToolhelp32Snapshot(TH32CS_SNAPHEAPLIST,PID);//获取进程ID为PID的堆栈列表
int err=GetLastError();
if(hShot==INVALID_HANDLE_VALUE)
{
MessageBox("创建进程快照失败");
return;
}
HEAPLIST32 te={sizeof(te)};
BOOL bRet=Heap32ListFirst(hShot,&te);
while(bRet)
{
temp.Format("%d",te.th32HeapID);
m_threadid.AddString(temp.GetBuffer(0));
bRet=Heap32ListNext(hShot,&te);
}
CloseHandle(hShot);
}
2.列举模块信息,若要列举模块信息,必须要用的函数是:Module32First,Module32Next
void CSuspendProcessDlg::EnumModule(DWORD PID)
{
if(PID==0)
{
MessageBox("进程ID不能为0");
return;
}
CString temp;
m_threadid.ResetContent();
HANDLE hShot=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,PID);
int err=GetLastError();
if(hShot==INVALID_HANDLE_VALUE)
{
MessageBox("创建进程快照失败");
return;
}
MODULEENTRY32 te={sizeof(te)};
BOOL bRet=Module32First(hShot,&te);
while(bRet)
{
//temp.Format("%d",te.th32HeapID);
m_threadid.AddString(te.szModule);
bRet=Module32Next(hShot,&te);
}
CloseHandle(hShot);
}
3列举系统进程信息,若要列举系统进程信息,必须要用的函数是:Process32First,Process32Next
void CSuspendProcessDlg::EnumProcess()
{
CString temp;
m_threadid.ResetContent();
HANDLE hShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
int err=GetLastError();
if(hShot==INVALID_HANDLE_VALUE)
{
MessageBox("创建进程快照失败");
return;
}
PROCESSENTRY32 te={sizeof(te)};
BOOL bRet=Process32First(hShot,&te);
while(bRet)
{
m_threadid.AddString(te.szExeFile);
bRet=Process32Next(hShot,&te);
}
CloseHandle(hShot);
}
3列举一个进程的线程ID,若要列举线程ID,必须要用的函数是:Thread32First,Thread32Next
void CSuspendProcessDlg::EnumThread(DWORD PID)
{
if(PID==0)
{
MessageBox("进程ID不能为0");
return;
}
CString temp;
m_threadid.ResetContent();
HANDLE hShot=CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
if(hShot==INVALID_HANDLE_VALUE)
{
MessageBox("创建进程快照失败");
return;
}
THREADENTRY32 te={sizeof(te)};
BOOL bRet=Thread32First(hShot,&te);
while(bRet)
{
if(te.th32OwnerProcessID==PID)
{
temp.Format("%d",te.th32ThreadID);
m_threadid.AddString(temp.GetBuffer(0));
}
bRet=Thread32Next(hShot,&te);
}
CloseHandle(hShot);
}