как узнать приостановлен процесс или нет?

я использую этот код для приостановки процесса. Я нашел его здесь 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); 
} 

Теперь я хочу найти способ узнать, приостановлен ли процесс или нет ??? пожалуйста, помогите мне.


person YAHOOOOO    schedule 22.12.2010    source источник
comment
Что значит процесс приостановлен? Только потоки могут быть приостановлены. Вы можете определить процесс как приостановленный после того, как все его потоки будут приостановлены - это также дает вам способ обнаружить это.   -  person Suma    schedule 22.12.2010
comment
спасибо, но как я могу проверить, приостановлен ли поток или нет???   -  person YAHOOOOO    schedule 22.12.2010
comment
Для этого нет документированного API. Если вам нужна такая информация, вам придется изучить блок среды потока, который является деталью реализации, которая может меняться в различных версиях Windows.   -  person Billy ONeal    schedule 22.12.2010


Ответы (1)


Если я правильно помню, вы можете использовать NtQuerySystemInformation для эта цель. С помощью NtQuerySystemInformation вы можете получить структуру SYSTEM_PROCESS_INFORMATION, перебирая массив SYSTEM_PROCESS_INFORMATION и ища PID целевого процесса. Вы можете найти подробное описание SYSTEM_PROCESS_INFORMATION в источниках Wine здесь. После того, как вы получите структуру информации о процессе, просто посмотрите на SYSTEM_THREAD_INFORMATION, где вы можете проверить состояние потока. Дополнительные сведения о структурах и перечислениях см. в источниках Wine.

person DReJ    schedule 22.12.2010
comment
Ага. Единственный действительно надежный источник объявлений находится во всех местах, в .NET framework. Класс NtProcessInfoHelper. Использование класса WMI Win32_Thread устраняет зависимость. Возьмите все, что вы получите, с большим куском соли, ничего более непостоянного, чем состояние потока. Не могу заморозить операционную систему. - person Hans Passant; 22.12.2010
comment
@Hans Passan: Спасибо, что указали на класс NtProcessInfoHelper. Не знал об этом, только что посмотрел с отражателем. - person DReJ; 22.12.2010