【问题标题】:how to find if the process is suspended or not?如何查找进程是否暂停?
【发布时间】:2010-12-23 00:03:37
【问题描述】:

我正在将此代码用于挂起进程。我在这里找到了它http://www.codeproject.com/KB/threads/pausep.aspx

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); 
} 

现在我想要一种方法来确定进程是否暂停??? 请帮帮我。

【问题讨论】:

  • “进程被暂停”是什么意思?只有线程可以被挂起。一旦所有线程都被挂起,您就可以将进程定义为挂起 - 这也为您提供了一种检测它的方法。
  • 谢谢,但是我如何检查线程是否被挂起???
  • 没有记录在案的 API 可以做到这一点。如果您需要此类信息,您将不得不检查线程环境块,这是一个实现细节,可以在各种版本的 Windows 上更改。

标签: c++ process suspend


【解决方案1】:

如果我没记错的话,您可以使用NtQuerySystemInformation 来实现此目的。使用NtQuerySystemInformation,您可以通过遍历SYSTEM_PROCESS_INFORMATION 的数组并查找目标进程的PID 来获得SYSTEM_PROCESS_INFORMATION 结构。您可以在 Wine 来源here 中找到SYSTEM_PROCESS_INFORMATION 的详细描述。获得进程信息结构后,只需查看SYSTEM_THREAD_INFORMATION 即可检查线程状态。有关结构和枚举的更多详细信息,请查看 Wine 来源。

【讨论】:

  • 是的。唯一真正可靠的声明来源是 .NET 框架。 NtProcessInfoHelper 类。使用 WMI Win32_Thread 类可以消除依赖关系。用一大块盐拿走你得到的任何东西,没有比线程状态更善变的了。无法冻结操作系统。
  • @Hans Passan:感谢您指出 NtProcessInfoHelper 类。不知道,只是用反光板检查过。
猜你喜欢
  • 2013-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多