#include #include #include #include typedef enum _TIMER_INFORMATION_CLASS { TimerBasicInformation = 0 } TIMER_INFORMATION_CLASS, *PTIMER_INFORMATION_CLASS; typedef struct _TIMER_BASIC_INFORMATION { LARGE_INTEGER TimeRemaining; BOOLEAN SignalState; } TIMER_BASIC_INFORMATION, *PTIMER_BASIC_INFORMATION; NTSTATUS NTAPI NtCreateTimer(PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES, TIMER_TYPE); NTSTATUS NTAPI NtCancelTimer(HANDLE, PBOOLEAN); NTSTATUS NTAPI NtSetTimer(HANDLE, PLARGE_INTEGER, PVOID, PVOID, BOOLEAN, LONG, PBOOLEAN); NTSTATUS NTAPI NtQueryTimer (HANDLE, TIMER_INFORMATION_CLASS, PVOID, ULONG, PULONG); int main () { HANDLE event; HANDLE timer; NTSTATUS status; LARGE_INTEGER timeout; TIMER_BASIC_INFORMATION tbi; event = CreateEvent (NULL, TRUE, FALSE, NULL); status = NtCreateTimer (&timer, TIMER_ALL_ACCESS, NULL, NotificationTimer); if (!NT_SUCCESS (status)) { fprintf (stderr, "NtCreateTimer: 0x%08lx\n", status); return 1; } timeout.QuadPart = -10000000LL; /* 1 sec */ status = NtSetTimer (timer, &timeout, NULL, NULL, FALSE, 0, NULL); if (!NT_SUCCESS (status)) { fprintf (stderr, "NtSetTimer: 0x%08lx\n", status); return 1; } WaitForSingleObject (event, 985L); NtQueryTimer (timer, TimerBasicInformation, &tbi, sizeof tbi, NULL); printf ("SignalState: %d TimeRemaining: %lld\n", tbi.SignalState, tbi.TimeRemaining.QuadPart); NtCancelTimer (timer, NULL); NtClose (timer); return 0; }