Как получить процессорное время потока внутри ядра?

Из моего устаревшего драйвера я вызываю PsCreateSystemThread API для создания нескольких потоков. Поскольку этот вызов происходит внутри ядра, эти новые созданные потоки будут выполняться в контексте системного процесса.

На мой вопрос дается дескриптор этих потоков, есть ли какой-либо API, с помощью которого я могу получить их процессорное время? Меня интересует чистое время ЦП, в течение которого поток фактически что-то делал (аналогично времени ядра, которое мы получаем, вызывая GetProcessTimes). Я знаю, что есть API под названием GetThreadTimes, но это из пользовательского режима, мне нужно процессорное время внутри режима ядра.

Спасибо


person nikhil    schedule 19.05.2014    source источник


Ответы (2)


Не существует документированного API для получения процессорного времени потока в ядре (насколько я знаю). Но вы можете получить доступ к полю структуры KTHREAD: UserTime и KernelTime. Проблема с этим подходом в основном в том, что KTHREAD официально не документирован и может варьироваться в зависимости от версии ОС.

person Gonmator    schedule 20.05.2014

Пользовательский режим GetThreadTimes API на самом деле вызывает только NtQueryInformationThread.
Вы можете сделать то же самое:

KERNEL_USER_TIMES times;
ZwQueryInformationThread(hThread, ThreadTimes, &times, sizeof(times), NULL);

И ThreadTimes, и KERNEL_USER_TIMES определены в заголовке ntddk.h в WDK.

person ge0rdi    schedule 15.03.2015