SYSTEM_TIME_OF_DAY_INFORMATION.CurrentTime что в нем? Я ожидаю увидеть там количество 100-наносекундных интервалов от рождества Бальтасарова... Код (Text): while (TRUE){ KeWaitForSingleObject (&kTimer, Executive, KernelMode, FALSE, NULL); Status = ZwQuerySystemInformation (3, &g_Date, sizeof(SYSTEM_TIME_OF_DAY_INFORMATION), &dwReturn); if (Status == STATUS_SUCCESS){ DbgPrint("%d", g_Date.CurrentTime.LowPart); } if (!g_TimerActive) break; } И ожидаю, что это количество будет постоянно меняться. Количество вижу, а вот чтобы оно менялось - нет. Или я что-то не понимаю, или одно из двух...
а если преобразовать CurrentTime в TIME_FIELDS, то видно, как тикают часики Код (Text): while (TRUE){ KeWaitForSingleObject (&kTimer, Executive, KernelMode, FALSE, NULL); Status = ZwQuerySystemInformation (3, &g_Date, sizeof(SYSTEM_TIME_OF_DAY_INFORMATION), &dwReturn); if (Status == STATUS_SUCCESS){ DbgPrint("%d", g_Date.CurrentTime.LowPart); RtlTimeToTimeFields(&g_Date.CurrentTime, &tCurrentFields); DbgPrint("%d", (int)tCurrentFields.Second); } if (!g_TimerActive) break; } В чем прикол?
Я, в общем, ничего нового здесь не скажу, но время в ядре следует получать через KeQuerySystemTime(), при этом если требуется локальное время, то полученное значение необходимо дополнительно преобразовать функцией ExSystemTimeToLocalTime().
ZwQuerySystemInformation и обращается к KeQuerySystemTime для заполнения поля CurrentTime. Выводи для разнообразия и HighPart.
n0name HighPart смотрел, просто не привел к коде, т.к. его обновления приходится ждать довольно долго. А LowPart должен ежесекундно обновляться.