Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
13 / 12 / 4
Регистрация: 20.05.2016
Сообщений: 325

Определение состояния процесса

12.02.2017, 23:29. Показов 4541. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Этот код всегда возвращает значение 259 (STILL_ACTIVE), указывающее, что процесс выполняется.
Даже если из диспетчера задач взять любой процесс, который помечен как "Приостановлен", это всё равно напишет, что процесс выполняется...

C++
1
2
3
4
5
6
7
8
    HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, PID);
 
    if (hProcess == INVALID_HANDLE_VALUE)
        return -1;
 
    DWORD exitCode = 0;
    GetExitCodeProcess(hProcess, &exitCode);
    wcout << exitCode << endl;
Как поправить?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.02.2017, 23:29
Ответы с готовыми решениями:

Определение вида процесса (служба или обычный процесс)
Привет, помогите пож. определить вид процесса. Гуглил, но ответа так и не нашел Добавлено через 6 минут не нужен код, просто...

Определение PPID для текущего процесса
Ребята Help!!! я должен написать программу для текущего значени ppid,pid для родителей и ребёнка,а сам в с++ ваще не шарю. Буду очень рад...

Проверка состояния процесса.
У меня задача проверять состояние выбранного процесса - работает, приостановлен и т.п. По результату проверки выводить сообщение о его...

6
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
13.02.2017, 08:36
А что здесь поправлять?
Даже если процесс "приостановлен" (suspended), то он с точки зрения системы
все равно выполняется и GetExitCodeProcess будет давать STILL_ACTIVE.
1
13 / 12 / 4
Регистрация: 20.05.2016
Сообщений: 325
13.02.2017, 08:41  [ТС]
Вот я и спрашиваю каким образом сделать так, чтобы результат отображался верно. Мб какие то другие функции есть?..
Диспетчер задач же это как то делает.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
13.02.2017, 08:51
Да есть способы.
См. здесь, например:

How to get thread state (e.g. suspended), memory + CPU usage, start time, priority, etc
http://stackoverflow.com/quest... ime-priori
1
 Аватар для Людвиг Бодмер
378 / 375 / 213
Регистрация: 29.03.2013
Сообщений: 867
13.02.2017, 09:24
dm stark, я вот тут набыдлокодил вариант, используя код по уже предоставленной ссылке, не знаю насколько верно получилось, у меня работает:
process.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
#pragma once
 
#include <Windows.h>
#include <winternl.h>
#include <assert.h>
 
typedef LONG KPRIORITY;
typedef LONG NTSTATUS;
 
#define STATUS_SUCCESS              ((NTSTATUS) 0x00000000)
#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS) 0xC0000004)
 
enum KWAIT_REASON
{
    Executive,
    FreePage,
    PageIn,
    PoolAllocation,
    DelayExecution,
    Suspended,
    UserRequest,
    WrExecutive,
    WrFreePage,
    WrPageIn,
    WrPoolAllocation,
    WrDelayExecution,
    WrSuspended,
    WrUserRequest,
    WrEventPair,
    WrQueue,
    WrLpcReceive,
    WrLpcReply,
    WrVirtualMemory,
    WrPageOut,
    WrRendezvous,
    Spare2,
    Spare3,
    Spare4,
    Spare5,
    Spare6,
    WrKernel,
    MaximumWaitReason
};
 
enum THREAD_STATE
{
    Running = 2,
    Waiting = 5,
};
 
#pragma pack(push,4)
 
struct CLIENT_ID
{
    HANDLE UniqueProcess; // Process ID
    HANDLE UniqueThread;  // Thread ID
};
 
struct SYSTEM_THREAD
{
    FILETIME     ftKernelTime;
    FILETIME     ftUserTime;  
    FILETIME     ftCreateTime;
    DWORD        dWaitTime;
    PVOID        pStartAddress;
    CLIENT_ID    Cid; 
    DWORD        dPriority;
    DWORD        dBasePriority;
    DWORD        dContextSwitches;
    THREAD_STATE dThreadState;
    KWAIT_REASON WaitReason;
    DWORD        dReserved01;
};
 
struct VM_COUNTERS // virtual memory of process
{
    DWORD PeakVirtualSize;
    DWORD VirtualSize;
    DWORD PageFaultCount;
    DWORD PeakWorkingSetSize;
    DWORD WorkingSetSize;
    DWORD QuotaPeakPagedPoolUsage;
    DWORD QuotaPagedPoolUsage;
    DWORD QuotaPeakNonPagedPoolUsage;
    DWORD QuotaNonPagedPoolUsage;
    DWORD PagefileUsage;
    DWORD PeakPagefileUsage;
};
 
struct SYSTEM_PROCESS
{
    DWORD          dNext;         // relative offset
    DWORD          dThreadCount;
    DWORD          dReserved01;
    DWORD          dReserved02;
    DWORD          dReserved03;
    DWORD          dReserved04;
    DWORD          dReserved05;
    DWORD          dReserved06;
    FILETIME       ftCreateTime;
    FILETIME       ftUserTime;  
    FILETIME       ftKernelTime;
    UNICODE_STRING usName;        // process name (unicode)
    KPRIORITY      BasePriority;
    DWORD          dUniqueProcessId;
    DWORD          dInheritedFromUniqueProcessId;
    DWORD          dHandleCount;
    DWORD          dReserved07;
    DWORD          dReserved08;
    VM_COUNTERS    VmCounters;    // see ntddk.h
    DWORD          dCommitCharge; // bytes
    IO_COUNTERS    IoCounters;    // see ntddk.h
    SYSTEM_THREAD  aThreads;      // thread array
};
 
#pragma pack(pop)
 
typedef NTSTATUS (WINAPI* t_NtQueryInfo)(SYSTEM_INFORMATION_CLASS, PVOID, ULONG, PULONG);
 
class cProcInfo
{
public:
    cProcInfo()
    {
        mu32_DataSize  = 1000;
        mp_Data        = NULL;
        mf_NtQueryInfo = NULL;
    }
    virtual ~cProcInfo()
    {
        if (mp_Data) LocalFree(mp_Data);
    }
 
    // Capture all running processes and all their threads.
    // returns an API or NTSTATUS Error code or zero if successfull
    DWORD Capture()
    {
        if (!mf_NtQueryInfo)
        {
            mf_NtQueryInfo = (t_NtQueryInfo)GetProcAddress(GetModuleHandleA("NtDll.dll"), "NtQuerySystemInformation");
            if (!mf_NtQueryInfo)
                return GetLastError();
        }
 
        // This must run in a loop because in the mean time a new process may have started 
        // and we need more buffer than u32_Needed !!
        while (true)
        {
            if (!mp_Data) 
            {
                mp_Data = (BYTE*)LocalAlloc(LMEM_FIXED, mu32_DataSize);
                if (!mp_Data)
                    return GetLastError();
            }
 
            ULONG u32_Needed = 0;
            NTSTATUS s32_Status = mf_NtQueryInfo(SystemProcessInformation, mp_Data, mu32_DataSize, &u32_Needed);
 
            if (s32_Status == STATUS_INFO_LENGTH_MISMATCH) // The buffer was too small
            {
                mu32_DataSize = u32_Needed + 4000;
                LocalFree(mp_Data);
                mp_Data = NULL;
                continue;
            }
            return s32_Status;
        }
    }
 
    // Searches a process by a given Process Identifier
    // Capture() must have been called before!
    SYSTEM_PROCESS* FindProcessByPid(DWORD u32_PID)
    {
        if (!mp_Data)
        {
            assert(mp_Data);
            return NULL;
        }
 
        SYSTEM_PROCESS* pk_Proc = (SYSTEM_PROCESS*)mp_Data;
        while (TRUE)
        {
            if (pk_Proc->dUniqueProcessId == u32_PID)
                return pk_Proc;
 
            if (!pk_Proc->dNext)
                return NULL;
 
            pk_Proc = (SYSTEM_PROCESS*)((BYTE*)pk_Proc + pk_Proc->dNext);
        }
    }
 
    SYSTEM_THREAD* FindThreadByTid(SYSTEM_PROCESS* pk_Proc, DWORD u32_TID)
    {
        if (!pk_Proc)
        {
            assert(pk_Proc);
            return NULL;
        }
 
        SYSTEM_THREAD* pk_Thread = &pk_Proc->aThreads;
 
        for (DWORD i=0; i<pk_Proc->dThreadCount; i++)
        {
            if (pk_Thread->Cid.UniqueThread == (HANDLE)(DWORD_PTR)u32_TID)
                return pk_Thread;
 
            pk_Thread++;
        }
        return NULL;
    }
 
    DWORD IsThreadSuspended(SYSTEM_THREAD* pk_Thread, BOOL* pb_Suspended)
    {
        if (!pk_Thread)
            return ERROR_INVALID_PARAMETER;
 
        *pb_Suspended = (pk_Thread->dThreadState == Waiting &&
                         pk_Thread->WaitReason   == Suspended);
        return 0;
    }
 
private:
    BYTE*         mp_Data;
    DWORD       mu32_DataSize;
    t_NtQueryInfo mf_NtQueryInfo;
};
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include "stdafx.h"
#include "process.h"
 
DWORD GetMainThreadId(DWORD pId)
{
    LPVOID lpThId;
 
    _asm
    {
        mov eax, fs:[18h]
        add eax, 36
        mov [lpThId], eax
    }
 
    HANDLE hProcess = OpenProcess(PROCESS_VM_READ, FALSE, pId);
    if(hProcess == NULL)
        return NULL;
 
    DWORD tId;
    if(ReadProcessMemory(hProcess, lpThId, &tId, sizeof(tId), NULL) == FALSE)
    {
        CloseHandle(hProcess);
        return NULL;
    }
 
    CloseHandle(hProcess);
 
    return tId;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    cProcInfo i_Proc;
    DWORD u32_Error = i_Proc.Capture();
    if (u32_Error)
    {
        printf("Error 0x%X capturing processes.\n", u32_Error);
        return 0;
    }
 
    SYSTEM_PROCESS* pk_Proc = i_Proc.FindProcessByPid(...); // Тут Pid процесса втавить
    if (!pk_Proc)
    {
        printf("The process does not exist.\n");
        return 0;
    }
 
    SYSTEM_THREAD* pk_Thread = i_Proc.FindThreadByTid(pk_Proc, GetMainThreadId(...)); // И тут тоже Pid процесса втавить
    if (!pk_Thread)
    {
        printf("The thread does not exist.\n");
        return 0;
    }
 
    BOOL b_Suspend;
    i_Proc.IsThreadSuspended(pk_Thread, &b_Suspend);
 
    if (b_Suspend) printf("The thread is suspended.\n");
    else           printf("The thread is not suspended.\n");
    
    return 0;
}
1
Покинул форум
3700 / 1483 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
13.02.2017, 09:49
Как вариант можно послать SendMessageTimeout'ом WM_NULL и если приложение не ответило в течении секунды-трех, значит оно зависло или приостановлено. По крайней мере именно таким образом в .NET Framework реализовано свойство Responding в классе Diagnostics.Process, - почему бы не попробовать данный способ в С++?
1
13 / 12 / 4
Регистрация: 20.05.2016
Сообщений: 325
13.02.2017, 21:58  [ТС]
Usage:
C++
1
2
3
4
5
6
    DWORD PID = 0;
    cout << "Enter PID: ";
    cin >> PID;
 
    cout << "Is process suspended: " << (IsProcessSuspended(PID) ? "Yes" : "No") << endl;
    system("pause");
Func:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#include <winternl.h>
#include <winnt.h>
 
typedef LONG KPRIORITY;
typedef LONG NTSTATUS;
 
#define STATUS_SUCCESS ((NTSTATUS) 0x00000000)
#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS) 0xC0000004)
 
enum KWAIT_REASON
{
    Executive,
    FreePage,
    PageIn,
    PoolAllocation,
    DelayExecution,
    Suspended,
    UserRequest,
    WrExecutive,
    WrFreePage,
    WrPageIn,
    WrPoolAllocation,
    WrDelayExecution,
    WrSuspended,
    WrUserRequest,
    WrEventPair,
    WrQueue,
    WrLpcReceive,
    WrLpcReply,
    WrVirtualMemory,
    WrPageOut,
    WrRendezvous,
    Spare2,
    Spare3,
    Spare4,
    Spare5,
    Spare6,
    WrKernel,
    MaximumWaitReason
};
 
enum THREAD_STATE
{
    Running = 2,
    Waiting = 5,
};
 
struct CLIENT_ID
{
    HANDLE UniqueProcess;
    HANDLE UniqueThread;
};
 
struct SYSTEM_THREAD
{
    FILETIME ftKernelTime;
    FILETIME ftUserTime;
    FILETIME ftCreateTime;
    DWORD dWaitTime;
    PVOID pStartAddress;
    CLIENT_ID Cid;
    DWORD dPriority;
    DWORD dBasePriority;
    DWORD dContextSwitches;
    THREAD_STATE dThreadState;
    KWAIT_REASON WaitReason;
    DWORD dReserved01;
};
 
struct VM_COUNTERS
{
    DWORD PeakVirtualSize;
    DWORD VirtualSize;
    DWORD PageFaultCount;
    DWORD PeakWorkingSetSize;
    DWORD WorkingSetSize;
    DWORD QuotaPeakPagedPoolUsage;
    DWORD QuotaPagedPoolUsage;
    DWORD QuotaPeakNonPagedPoolUsage;
    DWORD QuotaNonPagedPoolUsage;
    DWORD PagefileUsage;
    DWORD PeakPagefileUsage;
};
 
struct SYSTEM_PROCESS
{
    DWORD dNext;
    DWORD dThreadCount;
    DWORD dReserved01;
    DWORD dReserved02;
    DWORD dReserved03;
    DWORD dReserved04;
    DWORD dReserved05;
    DWORD dReserved06;
    FILETIME ftCreateTime;
    FILETIME ftUserTime;
    FILETIME ftKernelTime;
    UNICODE_STRING usName;
    KPRIORITY BasePriority;
    DWORD dUniqueProcessId;
    DWORD dInheritedFromUniqueProcessId;
    DWORD dHandleCount;
    DWORD dReserved07;
    DWORD dReserved08;
    VM_COUNTERS VmCounters;
    DWORD dCommitCharge;
    IO_COUNTERS IoCounters;
    SYSTEM_THREAD aThreads[];
};
 
typedef NTSTATUS(WINAPI *NtQuerySystemInfoProc)(SYSTEM_INFORMATION_CLASS, PVOID, ULONG, PULONG);
 
BOOL IsProcessSuspended(DWORD pid)
{
    BYTE* byProcessData = 0;
    DWORD dwProcessDataSize = 0;
    NtQuerySystemInfoProc NtQuerySystemInfo = (NtQuerySystemInfoProc)GetProcAddress(GetModuleHandleA("NtDll.dll"), "NtQuerySystemInformation");
 
    if (NtQuerySystemInfo)
    {
        while (true)
        {
            if (!byProcessData)
            {
                byProcessData = (BYTE*)LocalAlloc(LMEM_FIXED, dwProcessDataSize);
                if (!byProcessData)
                    break;
            }
 
            ULONG cbNeeded = 0;
            NTSTATUS ntStatus = NtQuerySystemInfo(SystemProcessInformation, byProcessData, dwProcessDataSize, &cbNeeded);
 
            if (ntStatus == STATUS_INFO_LENGTH_MISMATCH)
            {
                dwProcessDataSize += cbNeeded;
                LocalFree(byProcessData);
                byProcessData = NULL;
                continue;
            }
 
            break;
        }
    }
 
    if (byProcessData)
    {
        SYSTEM_PROCESS* sp = (SYSTEM_PROCESS*)byProcessData;
 
        while (true)
        {
            if (sp->dUniqueProcessId == pid)
                break;
 
            if (!sp->dNext)
                break;
 
            sp = (SYSTEM_PROCESS*)((BYTE*)sp + sp->dNext);
        }
 
        if (sp)
            return sp->aThreads[0].dThreadState == Waiting && sp->aThreads[0].WaitReason == Suspended;
    }
 
    return FALSE;
}
Добавлено через 1 минуту
Да попробовать то запросто, но это только для процессов которые UI имеют. И для того, чтобы определить отвечает этот UI или нет. Совсем не то...

Добавлено через 27 секунд
(я о SendMessageTimeout)

Добавлено через 5 минут
Чуть не забыл)
Кому про структуры интересно, вот тут весьма подробно расписано (мб поможет кому): http://www.informit.com/articl... 2&seqNum=5
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.02.2017, 21:58
Помогаю со студенческими работами здесь

Контроль состояния процесса
Доброго времени!!!!! пожалуйста помогите!!! очень нужно. запуская процесс следующим образом: string pathCompiler =...

Отслеживание состояния запущенного процесса
Здравствуйте. запускаю кнопкой выполнение программы: protected void Button3_Click(object sender, EventArgs e) { ...

Расчёт переходного процесса методом переменных состояния
Добрый день! Не получается составить систему уравнений по методу переменных состояния, а именно, избавиться от производных в правой части....

Системный вызов для определения состояния процесса
Здравствуйте, уважаемые форумчане! Помогите, пожалуйста, советом. Существует ли системный вызов в LINUX для определения состояния процесса?...

ADOQuery - определение состояния
Вот два примера кода. И в том, и в другом случае результат один. Или все таки есть разница или какие то преимущества от использования...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru