Какие функции win32 используются монитором ресурсов windows для обнаружения активности диска и netwrork для завершенного процесса?
В Windows Resource Monitor есть четыре вкладки-CPU,MEMORY,DISK, NETWORK эта программа показывает нам каждый процесс с их соответствующим PID(process ID), которые связаны с операциями ввода-вывода с дисковыми дисками и сетью.
Вопрос
Я использую Программирование Win32 плюс Visual C++(Visual Studio).Я создал процесс(используя функцию CreateProcess) "VBS3_64.exe" предположим, что я не знаю его внутреннего поведения,в моей программе моим единственным намерением было создать этот процесс, позволить ему выполняться в течение нескольких минут и завершить его с помощью функций Terminate или SendMessage. После того, как я завершаю этот процесс программно, Монитор ресурсов Windows показывает, что как процессор, так и память используются в состоянии "прекращено" (серый цвет), но как дисковая активность, так и сетевая активность были запущены(черный цвет) в данный момент в течение нескольких минут. Даже диспетчер задач Windows не показывал этот процесс.
Я использовал функции Win32, чтобы проверить, что процесс все еще работает в системе, даже если он называется Terminate или force kill, но все эти функции дали мне один и тот же результат.Но только монитор ресурсов обнаруживает его действия по очистке диска и сетевые действия.
Вопрос
1. как завершенный процесс все еще работает в фоновом режиме для его очистки, и только монитор ресурсов обнаруживает его с соответствующим PID ?
2. Какие функции Win32 помогают нам обнаружить такой процесс ? (какие функции Win32 используются монитором ресурсов для обнаружения фоновых действий / очистки завершенного процесса).
Пожалуйста, обратитесь к следующему вопросу, который я задал на MSDN :- [^]
Что я уже пробовал:
Я попытался получить статус процесса и его операций ввода-вывода с помощью следующих функций Win32:
DWORD pid = 14216; HANDLE process = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); HPSS snapShot; PSS_PROCESS_INFORMATION info; PSS_PERFORMANCE_COUNTERS traceInfo; BOOL status = STILL_ACTIVE; do { auto ret = PssCaptureSnapshot(process, PSS_CAPTURE_HANDLES | PSS_CREATE_MEASURE_PERFORMANCE, NULL, &snapShot); if (ret == ERROR_SUCCESS) { std::cout << "SnapShot okey" << std::endl; ret = PssQuerySnapshot(snapShot, PSS_QUERY_PROCESS_INFORMATION, &info, sizeof(info)); if (ret == ERROR_SUCCESS) { status = info.ExitStatus; std::cout << status << std::endl; std::cout << info.PebBaseAddress << std::endl; } ret = PssQuerySnapshot(snapShot, PSS_QUERY_PERFORMANCE_COUNTERS, &traceInfo, sizeof(traceInfo)); if (ret == ERROR_SUCCESS) { std::cout << "Cycles:" << traceInfo.TotalCycleCount << std::endl; } }; } while (status == STILL_ACTIVE);
И
IO_COUNTERS counters; while (process && GetProcessIoCounters(process, &counters)) { std::cout << "Read operations: " << counters.ReadOperationCount << std::endl; std::cout << "Read Transfers: " << counters.ReadTransferCount << std::endl; CloseHandle(process); Sleep(1000); process = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); }
Stefan_Lang
Не могу помочь с функциями Win32, но пробовали ли вы просто нажать кнопку "пауза" в вашем отладчике, а затем переключиться на этот процесс, чтобы посмотреть, что он делает?
P.S.: Я никогда не пробовал этого с процессами, только с потоками. Но если вы не можете переключиться на этот процесс в своем отладчике, вы можете попытаться подключить отдельный отладчик к этому процессу, пока он все еще активен и виден в Диспетчере задач