C++ 如何确定进程是否已暂停?
我将此代码用于挂起进程。我在此处找到它C++ 如何确定进程是否已暂停?,c++,process,suspend,C++,Process,Suspend,我将此代码用于挂起进程。我在此处找到它 BOOL SuspendResumeThreadList(DWORD dwOwnerPID,BOOL bResumeThread) { 句柄hThreadSnap=NULL; 布尔-布雷特=假; THREADENTRY32 te32={0}; hThreadSnap=CreateToolhelp32Snapshot(TH32CS\u SNAPTHREAD,0); if(hThreadSnap==无效的\u句柄\u值) 返回(假); te32.dwSize
BOOL SuspendResumeThreadList(DWORD dwOwnerPID,BOOL bResumeThread)
{
句柄hThreadSnap=NULL;
布尔-布雷特=假;
THREADENTRY32 te32={0};
hThreadSnap=CreateToolhelp32Snapshot(TH32CS\u SNAPTHREAD,0);
if(hThreadSnap==无效的\u句柄\u值)
返回(假);
te32.dwSize=sizeof(THREADENTRY32);
if(Thread32First(hThreadSnap,&te32))
{
做
{
if(te32.th32OwnerProcessID==dwOwnerPID)
{
HANDLE hThread=OpenThread(THREAD\u SUSPEND\u RESUME,FALSE,te32.th32ThreadID);
if(bResumeThread)
{
//如果我没记错的话,你可以用于这个目的。使用NtQuerySystemInformation
你可以通过迭代SYSTEM\u PROCESS\u INFORMATION
数组并查找目标进程的PID来获得SYSTEM\u PROCESS\u INFORMATION
结构。你可以找到SYSTEM\u PROCESS\u INFORMATION的详细描述在Wine sources中的
上。获取流程信息结构后,只需查看系统线程信息
即可检查线程状态。有关结构和枚举的更多详细信息,请查看Wine sources。什么是“流程已挂起”?只有线程可以挂起。一旦进程的所有线程都挂起,您可以将其定义为挂起-这也为您提供了一种方法来检测它。谢谢,但是我如何检查线程是否挂起???没有记录在案的API来执行此操作。如果您需要此类信息,您必须检查线程环境t block,这是一个可以在不同版本的windows.Yup上更改的实现细节。声明唯一真正可靠的来源是在所有地方的.NET framework.NtProcessInfoHelper类中。使用WMI Win32_线程类可以消除依赖性。只需一大块盐就可以得到任何东西,没有什么比这更易变的了然后是线程状态。无法冻结操作系统。@Hans Passan:感谢您指出NtProcessInfoHelper类。我不知道,只是用reflector检查了一下。
BOOL SuspendResumeThreadList(DWORD dwOwnerPID, bool bResumeThread)
{
HANDLE hThreadSnap = NULL;
BOOL bRet = FALSE;
THREADENTRY32 te32 = {0};
hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
if (hThreadSnap == INVALID_HANDLE_VALUE)
return (FALSE);
te32.dwSize = sizeof(THREADENTRY32);
if (Thread32First(hThreadSnap, &te32))
{
do
{
if (te32.th32OwnerProcessID == dwOwnerPID)
{
HANDLE hThread = OpenThread(THREAD_SUSPEND_RESUME, FALSE, te32.th32ThreadID);
if (bResumeThread)
{
//cout << _T("Resuming Thread 0x") << cout.setf( ios_base::hex ) << te32.th32ThreadID << '\n';
ResumeThread(hThread);
}
else
{
//cout << _T("Suspending Thread 0x") << cout.setf( ios_base::hex ) << te32.th32ThreadID << '\n';
SuspendThread(hThread);
}
CloseHandle(hThread);
}
}
while (Thread32Next(hThreadSnap, &te32));
bRet = TRUE;
}
else
bRet = FALSE;
CloseHandle (hThreadSnap);
return (bRet);
}