#include #include #include #include int main (int argc, char* argv[]) { NTSTATUS status; HANDLE timer; LARGE_INTEGER duetime; PTIMER_BASIC_INFORMATION tbi; int cnt = 10, i; long long lastTimer = 0; duetime.QuadPart = -10000000000LL; tbi = (PTIMER_BASIC_INFORMATION) calloc (cnt + 1, sizeof (TIMER_BASIC_INFORMATION)); if (!tbi) { printf ("malloc failed\n:"); return 1; } status = NtCreateTimer (&timer, TIMER_ALL_ACCESS, NULL, NotificationTimer); if (!NT_SUCCESS (status)) { printf ("NtCreateTimer: %p\n", status); return 1; } status = NtSetTimer (timer, &duetime, NULL, NULL, FALSE, 1000000L, NULL); if (!NT_SUCCESS (status)) { printf ("NtSetTimer: %p\n", status); return 1; } for (i = 0; i < cnt; ++i) { do { NtQueryTimer (timer, TimerBasicInformation, tbi + i, sizeof *tbi, NULL); //Sleep(1); } while (tbi[i].TimeRemaining.QuadPart == tbi[i - 1].TimeRemaining.QuadPart); } NtCancelTimer (timer, NULL); status = NtQueryTimer (timer, TimerBasicInformation, tbi + i, sizeof *tbi, NULL); if (!NT_SUCCESS (status)) printf ("NtQueryTimer: %p\n", status); NtClose (timer); for (i = 1; i < cnt + 1; ++i) printf("Timer: %lld (%llx), dTimer: %lld usec\n", tbi[i].TimeRemaining.QuadPart, tbi[i].TimeRemaining.QuadPart, (tbi[i - 1].TimeRemaining.QuadPart - tbi[i].TimeRemaining.QuadPart) / 10); return 0; }