1 /******************************************************************************
3 ******************************************************************************/
8 KeGetCurrentIrql(VOID
);
22 IN OUT PRKEVENT Event
);
24 #if (NTDDI_VERSION >= NTDDI_WIN2K)
26 #if defined(_NTDDK_) || defined(_NTIFS_)
31 IN CONST VOID
*Address
, /* CONST is added */
34 #endif /* defined(_NTDDK_) || defined(_NTIFS_) */
44 #if defined(SINGLE_GROUP_LEGACY_API)
48 KeRevertToUserAffinityThread(VOID
);
53 KeSetSystemAffinityThread(
54 IN KAFFINITY Affinity
);
59 KeSetTargetProcessorDpc(
66 KeQueryActiveProcessors(VOID
);
69 #if !defined(_M_AMD64)
74 KeQueryInterruptTime(VOID
);
80 OUT PLARGE_INTEGER CurrentTime
);
82 #endif /* !_M_AMD64 */
84 #if defined(_X86_) && (defined(_WDM_INCLUDED_) || defined(WIN9X_COMPAT_SPINLOCK))
89 IN PKSPIN_LOCK SpinLock
);
93 KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock
)
105 IN ULONG BugCheckCode
,
106 IN ULONG_PTR BugCheckParameter1
,
107 IN ULONG_PTR BugCheckParameter2
,
108 IN ULONG_PTR BugCheckParameter3
,
109 IN ULONG_PTR BugCheckParameter4
);
120 KeDelayExecutionThread(
121 IN KPROCESSOR_MODE WaitMode
,
122 IN BOOLEAN Alertable
,
123 IN PLARGE_INTEGER Interval
);
128 KeDeregisterBugCheckCallback(
129 IN OUT PKBUGCHECK_CALLBACK_RECORD CallbackRecord
);
134 KeEnterCriticalRegion(VOID
);
139 KeInitializeDeviceQueue(
140 OUT PKDEVICE_QUEUE DeviceQueue
);
147 IN PKDEFERRED_ROUTINE DeferredRoutine
,
148 IN PVOID DeferredContext OPTIONAL
);
160 KeInitializeSemaphore(
161 OUT PRKSEMAPHORE Semaphore
,
181 KeInsertByKeyDeviceQueue(
182 IN OUT PKDEVICE_QUEUE DeviceQueue
,
183 IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
,
190 IN OUT PKDEVICE_QUEUE DeviceQueue
,
191 IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
);
198 IN PVOID SystemArgument1 OPTIONAL
,
199 IN PVOID SystemArgument2 OPTIONAL
);
204 KeLeaveCriticalRegion(VOID
);
209 KeQueryPerformanceCounter(
210 OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL
);
215 KeQueryPriorityThread(
216 IN PRKTHREAD Thread
);
221 KeQueryTimeIncrement(VOID
);
238 KeReadStateSemaphore(
239 IN PRKSEMAPHORE Semaphore
);
250 KeRegisterBugCheckCallback(
251 OUT PKBUGCHECK_CALLBACK_RECORD CallbackRecord
,
252 IN PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine
,
255 IN PUCHAR Component
);
261 IN OUT PRKMUTEX Mutex
,
268 IN OUT PRKSEMAPHORE Semaphore
,
269 IN KPRIORITY Increment
,
276 KeRemoveByKeyDeviceQueue(
277 IN OUT PKDEVICE_QUEUE DeviceQueue
,
284 IN OUT PKDEVICE_QUEUE DeviceQueue
);
289 KeRemoveEntryDeviceQueue(
290 IN OUT PKDEVICE_QUEUE DeviceQueue
,
291 IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
);
303 IN OUT PRKEVENT Event
);
309 IN OUT PRKEVENT Event
,
310 IN KPRIORITY Increment
,
318 IN KDPC_IMPORTANCE Importance
);
324 IN OUT PKTHREAD Thread
,
325 IN KPRIORITY Priority
);
331 IN OUT PKTIMER Timer
,
332 IN LARGE_INTEGER DueTime
,
333 IN PKDPC Dpc OPTIONAL
);
339 IN OUT PKTIMER Timer
,
340 IN LARGE_INTEGER DueTime
,
341 IN LONG Period OPTIONAL
,
342 IN PKDPC Dpc OPTIONAL
);
347 KeStallExecutionProcessor(
348 IN ULONG MicroSeconds
);
353 KeSynchronizeExecution(
354 IN OUT PKINTERRUPT Interrupt
,
355 IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine
,
356 IN PVOID SynchronizeContext OPTIONAL
);
361 KeWaitForMultipleObjects(
364 IN WAIT_TYPE WaitType
,
365 IN KWAIT_REASON WaitReason
,
366 IN KPROCESSOR_MODE WaitMode
,
367 IN BOOLEAN Alertable
,
368 IN PLARGE_INTEGER Timeout OPTIONAL
,
369 OUT PKWAIT_BLOCK WaitBlockArray OPTIONAL
);
371 #define KeWaitForMutexObject KeWaitForSingleObject
376 KeWaitForSingleObject(
378 IN KWAIT_REASON WaitReason
,
379 IN KPROCESSOR_MODE WaitMode
,
380 IN BOOLEAN Alertable
,
381 IN PLARGE_INTEGER Timeout OPTIONAL
);
383 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
385 #if (NTDDI_VERSION >= NTDDI_WINXP)
390 KeAcquireInStackQueuedSpinLock(
391 IN OUT PKSPIN_LOCK SpinLock
,
392 OUT PKLOCK_QUEUE_HANDLE LockHandle
);
397 KeAcquireInStackQueuedSpinLockAtDpcLevel(
398 IN OUT PKSPIN_LOCK SpinLock
,
399 OUT PKLOCK_QUEUE_HANDLE LockHandle
);
404 KeAcquireInterruptSpinLock(
405 IN OUT PKINTERRUPT Interrupt
);
410 KeAreApcsDisabled(VOID
);
415 KeGetRecommendedSharedDataAlignment(VOID
);
420 KeQueryRuntimeThread(
422 OUT PULONG UserTime
);
427 KeReleaseInStackQueuedSpinLockFromDpcLevel(
428 IN PKLOCK_QUEUE_HANDLE LockHandle
);
433 KeReleaseInterruptSpinLock(
434 IN OUT PKINTERRUPT Interrupt
,
440 KeRemoveByKeyDeviceQueueIfBusy(
441 IN OUT PKDEVICE_QUEUE DeviceQueue
,
447 KeReleaseInStackQueuedSpinLock(
448 IN PKLOCK_QUEUE_HANDLE LockHandle
);
450 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
452 #if (NTDDI_VERSION >= NTDDI_WINXPSP1)
457 KeDeregisterBugCheckReasonCallback(
458 IN OUT PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord
);
463 KeRegisterBugCheckReasonCallback(
464 OUT PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord
,
465 IN PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine
,
466 IN KBUGCHECK_CALLBACK_REASON Reason
,
467 IN PUCHAR Component
);
469 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP1) */
471 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
475 KeFlushQueuedDpcs(VOID
);
476 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
478 #if (NTDDI_VERSION >= NTDDI_WS03)
483 KeRegisterNmiCallback(
484 IN PNMI_CALLBACK CallbackRoutine
,
485 IN PVOID Context OPTIONAL
);
490 KeDeregisterNmiCallback(
496 KeInitializeThreadedDpc(
498 IN PKDEFERRED_ROUTINE DeferredRoutine
,
499 IN PVOID DeferredContext OPTIONAL
);
505 IN PKIPI_BROADCAST_WORKER BroadcastFunction
,
506 IN ULONG_PTR Context
);
511 KeAcquireSpinLockForDpc(
512 IN OUT PKSPIN_LOCK SpinLock
);
517 KeReleaseSpinLockForDpc(
518 IN OUT PKSPIN_LOCK SpinLock
,
525 IN PKSPIN_LOCK SpinLock
);
527 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
529 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
534 KeTryToAcquireSpinLockAtDpcLevel(
535 IN OUT PKSPIN_LOCK SpinLock
);
540 KeAreAllApcsDisabled(VOID
);
545 KeAcquireGuardedMutex(
546 IN OUT PKGUARDED_MUTEX GuardedMutex
);
551 KeAcquireGuardedMutexUnsafe(
552 IN OUT PKGUARDED_MUTEX GuardedMutex
);
557 KeEnterGuardedRegion(VOID
);
562 KeLeaveGuardedRegion(VOID
);
567 KeInitializeGuardedMutex(
568 OUT PKGUARDED_MUTEX GuardedMutex
);
573 KeReleaseGuardedMutexUnsafe(
574 IN OUT PKGUARDED_MUTEX GuardedMutex
);
579 KeReleaseGuardedMutex(
580 IN OUT PKGUARDED_MUTEX GuardedMutex
);
585 KeTryToAcquireGuardedMutex(
586 IN OUT PKGUARDED_MUTEX GuardedMutex
);
588 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
590 #if (NTDDI_VERSION >= NTDDI_VISTA)
595 KeAcquireInStackQueuedSpinLockForDpc(
596 IN OUT PKSPIN_LOCK SpinLock
,
597 OUT PKLOCK_QUEUE_HANDLE LockHandle
);
602 KeReleaseInStackQueuedSpinLockForDpc(
603 IN PKLOCK_QUEUE_HANDLE LockHandle
);
608 KeQueryDpcWatchdogInformation(
609 OUT PKDPC_WATCHDOG_INFORMATION WatchdogInformation
);
611 #if defined(SINGLE_GROUP_LEGACY_API)
615 KeSetSystemAffinityThreadEx(
616 IN KAFFINITY Affinity
);
621 KeRevertToUserAffinityThreadEx(
622 IN KAFFINITY Affinity
);
627 KeQueryActiveProcessorCount(
628 OUT PKAFFINITY ActiveProcessors OPTIONAL
);
633 KeQueryMaximumProcessorCount(VOID
);
636 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
638 #if (NTDDI_VERSION >= NTDDI_WS08)
641 KeRegisterProcessorChangeCallback(
642 IN PPROCESSOR_CALLBACK_FUNCTION CallbackFunction
,
643 IN PVOID CallbackContext OPTIONAL
,
647 KeDeregisterProcessorChangeCallback(
648 IN PVOID CallbackHandle
);
650 #endif /* (NTDDI_VERSION >= NTDDI_WS08) */
652 #if (NTDDI_VERSION >= NTDDI_WIN7)
656 KeQueryTotalCycleTimeProcess(
657 IN OUT PKPROCESS Process
,
658 OUT PULONG64 CycleTimeStamp
);
662 KeQueryTotalCycleTimeThread(
663 IN OUT PKTHREAD Thread
,
664 OUT PULONG64 CycleTimeStamp
);
669 KeSetTargetProcessorDpcEx(
671 IN PPROCESSOR_NUMBER ProcNumber
);
676 KeSetSystemGroupAffinityThread(
677 IN PGROUP_AFFINITY Affinity
,
678 OUT PGROUP_AFFINITY PreviousAffinity OPTIONAL
);
683 KeRevertToUserGroupAffinityThread(
684 IN PGROUP_AFFINITY PreviousAffinity
);
689 KeSetCoalescableTimer(
690 IN OUT PKTIMER Timer
,
691 IN LARGE_INTEGER DueTime
,
693 IN ULONG TolerableDelay
,
694 IN PKDPC Dpc OPTIONAL
);
699 KeQueryUnbiasedInterruptTime(VOID
);
704 KeQueryActiveProcessorCountEx(
705 IN USHORT GroupNumber
);
710 KeQueryMaximumProcessorCountEx(
711 IN USHORT GroupNumber
);
716 KeQueryActiveGroupCount(VOID
);
721 KeQueryMaximumGroupCount(VOID
);
726 KeQueryGroupAffinity(
727 IN USHORT GroupNumber
);
732 KeGetCurrentProcessorNumberEx(
733 OUT PPROCESSOR_NUMBER ProcNumber OPTIONAL
);
738 KeQueryNodeActiveAffinity(
739 IN USHORT NodeNumber
,
740 OUT PGROUP_AFFINITY Affinity OPTIONAL
,
741 OUT PUSHORT Count OPTIONAL
);
746 KeQueryNodeMaximumProcessorCount(
747 IN USHORT NodeNumber
);
752 KeQueryHighestNodeNumber(VOID
);
757 KeGetCurrentNodeNumber(VOID
);
762 KeQueryLogicalProcessorRelationship(
763 IN PPROCESSOR_NUMBER ProcessorNumber OPTIONAL
,
764 IN LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType
,
765 OUT PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Information OPTIONAL
,
766 IN OUT PULONG Length
);
771 KeSaveExtendedProcessorState(
773 OUT PXSTATE_SAVE XStateSave
);
778 KeRestoreExtendedProcessorState(
779 IN PXSTATE_SAVE XStateSave
);
783 KeGetProcessorNumberFromIndex(
785 OUT PPROCESSOR_NUMBER ProcNumber
);
789 KeGetProcessorIndexFromNumber(
790 IN PPROCESSOR_NUMBER ProcNumber
);
792 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
798 KeFlushWriteBuffer(VOID
);
802 * KeInitializeCallbackRecord(
803 * IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord)
805 #define KeInitializeCallbackRecord(CallbackRecord) \
806 CallbackRecord->State = BufferEmpty;
810 #if (NTDDI_VERSION >= NTDDI_VISTA)
811 #define PAGED_ASSERT( exp ) NT_ASSERT( exp )
813 #define PAGED_ASSERT( exp ) ASSERT( exp )
816 #define PAGED_CODE() { \
817 if (KeGetCurrentIrql() > APC_LEVEL) { \
818 KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \
819 PAGED_ASSERT(FALSE); \
829 #define PAGED_CODE_LOCKED() NOP_FUNCTION;