Buddhi Chaturanga Ответов: 1

Какие функции 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.: Я никогда не пробовал этого с процессами, только с потоками. Но если вы не можете переключиться на этот процесс в своем отладчике, вы можете попытаться подключить отдельный отладчик к этому процессу, пока он все еще активен и виден в Диспетчере задач

1 Ответов

Рейтинг:
1

Randor

Привет,

Ответы, которые вы получаете на форуме MSDN, неверны.

Монитор ресурсов Windows в основном использует Трассировка событий для Windows (ETW)[^].

Для дискового ввода-вывода проверьте Класс DiskIO[^] что и использует Монитор ресурсов. Возможно, вам придется использовать Класс FileIo[^] чтобы получить имя файла и идентификатор вызывающего потока.

инструментарий WMI[^] построен на вершине трассировки событий Windows. Вы также можете получить эти данные из WMI (который внутренне считывает трассировку ETW) за счет использования Вам-Встречный[^].

Классы MOF трассировки событий[^]

Снова... WMI построен поверх ETW, и вы можете предпочесть получить эти данные из WMI. Ваш выбор.

с наилучшими пожеланиями,
- Дэвид Делон