diff --git a/sdk/xtdk/kefuncs.h b/sdk/xtdk/kefuncs.h index ac2abe7..fa8d831 100644 --- a/sdk/xtdk/kefuncs.h +++ b/sdk/xtdk/kefuncs.h @@ -32,6 +32,10 @@ XTFASTCALL KRUNLEVEL KeGetCurrentRunLevel(VOID); +XTAPI +BOOLEAN +KeGetTimerState(IN PKTIMER Timer); + XTAPI VOID KeInitializeApc(IN PKAPC Apc, @@ -102,6 +106,13 @@ VOID KeSetTargetProcessorDpc(IN PKDPC Dpc, IN CCHAR Number); +XTAPI +VOID +KeSetTimer(IN PKTIMER Timer, + IN LARGE_INTEGER DueTime, + IN LONG Period, + IN PKDPC Dpc); + XTAPI VOID KeSignalCallDpcDone(IN PVOID SystemArgument); diff --git a/sdk/xtdk/ketypes.h b/sdk/xtdk/ketypes.h index 6960618..b997e77 100644 --- a/sdk/xtdk/ketypes.h +++ b/sdk/xtdk/ketypes.h @@ -330,6 +330,7 @@ typedef struct _KTIMER DISPATCHER_HEADER Header; ULARGE_INTEGER DueTime; LIST_ENTRY TimerListEntry; + PKDPC Dpc; LONG Period; } KTIMER, *PKTIMER; diff --git a/xtoskrnl/includes/kei.h b/xtoskrnl/includes/kei.h index c452ea7..59b8fd3 100644 --- a/xtoskrnl/includes/kei.h +++ b/xtoskrnl/includes/kei.h @@ -63,6 +63,10 @@ KePanicEx(IN ULONG Code, IN ULONG_PTR Parameter3, IN ULONG_PTR Parameter4); +XTAPI +ULONGLONG +KeQueryTimer(IN PKTIMER Timer); + XTAPI LONG KeSetEvent(IN PKEVENT Event, diff --git a/xtoskrnl/ke/timer.c b/xtoskrnl/ke/timer.c index f6b408c..8c7bbee 100644 --- a/xtoskrnl/ke/timer.c +++ b/xtoskrnl/ke/timer.c @@ -24,13 +24,13 @@ BOOLEAN KeCancelTimer(IN PKTIMER Timer) { BOOLEAN Result; - KRUNLEVEL OldRunLevel; + KRUNLEVEL RunLevel; /* Set default result value */ Result = FALSE; /* Raise run level and acquire dispatcher lock */ - OldRunLevel = KeRaiseRunLevel(SYNC_LEVEL); + RunLevel = KeRaiseRunLevel(SYNC_LEVEL); KeAcquireQueuedSpinLock(DispatcherLock); /* Check timer status */ @@ -41,9 +41,9 @@ KeCancelTimer(IN PKTIMER Timer) Result = TRUE; } - /* Release dispatcher lock and processes the deferred ready list */ + /* Release dispatcher lock and process the deferred ready list */ KeReleaseQueuedSpinLock(DispatcherLock); - KepExitDispatcher(OldRunLevel); + KepExitDispatcher(RunLevel); /* Return result */ return Result; @@ -67,6 +67,24 @@ KeClearTimer(IN PKTIMER Timer) Timer->Header.SignalState = 0; } +/** + * Reads the current signal state of the given timer. + * + * @param Timer + * Supplies a pointer to a timer object. + * + * @return This routine returns TRUE if the timer is set, or FALSE otherwise. + * + * @since XT 1.0 + */ +XTAPI +BOOLEAN +KeGetTimerState(IN PKTIMER Timer) +{ + /* Return timer state */ + return (BOOLEAN)Timer->Header.SignalState; +} + /** * Initializes an extended kernel timer. * @@ -99,6 +117,74 @@ KeInitializeTimer(OUT PKTIMER Timer, RtlInitializeListHead(&Timer->TimerListEntry); } +/** + * Queries the timer's interrupt due time. + * + * @param Timer + * Supplies a pointer to a timer object. + * + * @return This routine returns the time remaining on the timer, or 0 if the timer is not set. + * + * @since XT 1.0 + */ +XTAPI +ULONGLONG +KeQueryTimer(IN PKTIMER Timer) +{ + KRUNLEVEL RunLevel; + ULONGLONG DueTime; + + /* Set initial due time */ + DueTime = 0; + + /* Raise run level and acquire dispatcher lock */ + RunLevel = KeRaiseRunLevel(SYNC_LEVEL); + KeAcquireQueuedSpinLock(DispatcherLock); + + /* Check timer status */ + if(Timer->Header.Inserted) + { + /* Get timer's due time */ + DueTime = Timer->DueTime.QuadPart; + } + + /* Release dispatcher lock and process the deferred ready list */ + KeReleaseQueuedSpinLock(DispatcherLock); + KepExitDispatcher(RunLevel); + + /* Return timer's due time */ + return DueTime; +} + +/** + * Sets the supplied timer to expire at the specified time. + * + * @param Timer + * Supplies a pointer to a timer object. + * + * @param DueTime + * Supplies the time at which the timer should expire (both absolute and relative times are supported). + * + * @param Period + * Supplies the timer period. + * + * @param Dpc + * Supplies a pointer to a Deferred Procedure Call (DPC) object. + * + * @return This routine does not return any value. + * + * @since XT 1.0 + */ +XTAPI +VOID +KeSetTimer(IN PKTIMER Timer, + IN LARGE_INTEGER DueTime, + IN LONG Period, + IN PKDPC Dpc) +{ + UNIMPLEMENTED; +} + /** * Removes a specified timer from the timer list. * diff --git a/xtoskrnl/xtoskrnl.spec b/xtoskrnl/xtoskrnl.spec index c256988..9944db7 100644 --- a/xtoskrnl/xtoskrnl.spec +++ b/xtoskrnl/xtoskrnl.spec @@ -15,6 +15,7 @@ @ fastcall KeAcquireSpinLock(ptr) @ stdcall KeCancelTimer(ptr) @ fastcall KeGetCurrentRunLevel() +@ stdcall KeGetTimerState(ptr) @ stdcall KeInitializeApc(ptr ptr long ptr ptr ptr long ptr) @ stdcall KeInitializeDpc(ptr ptr ptr) @ stdcall KeInitializeSemaphore(ptr long long) @@ -28,6 +29,7 @@ @ fastcall KeReleaseQueuedSpinLock(long) @ fastcall KeReleaseSpinLock(ptr) @ stdcall KeSetTargetProcessorDpc(ptr long) +@ stdcall KeSetTimer(ptr long long long ptr) @ stdcall KeSignalCallDpcDone(ptr) @ stdcall KeSignalCallDpcSynchronize(ptr) @ stdcall RtlClearAllBits(ptr)