1427 lines
30 KiB
C
Raw Normal View History

2001-01-01 00:00:00 +01:00
/*++ BUILD Version: 0028 // Increment this if a change has global effects
Copyright (c) 1989 Microsoft Corporation
Module Name:
ke.h
Abstract:
This module contains the public (external) header file for the kernel.
Author:
David N. Cutler (davec) 27-Feb-1989
Revision History:
--*/
#ifndef _KE_
#define _KE_
//
// Define the default quantum decrement values.
//
#define CLOCK_QUANTUM_DECREMENT 3
#define WAIT_QUANTUM_DECREMENT 10
//
// Define the default thread quantum value.
//
#define THREAD_QUANTUM 60
//
// Define the round trip decrement count.
//
#define ROUND_TRIP_DECREMENT_COUNT 16
//
// Public (external) constant definitions.
//
#define BASE_PRIORITY_THRESHOLD NORMAL_BASE_PRIORITY // fast path base threshold
//
// Define timer table size.
//
#define TIMER_TABLE_SIZE 32
//
// Enumerated kernel types
//
// Kernel object types.
//
// N.B. There are really two types of event objects; NotificationEvent and
// SynchronizationEvent. The type value for a notification event is 0,
// and that for a synchronization event 1.
//
// N.B. There are two types of new timer objects; NotificationTimer and
// SynchronizationTimer. The type value for a notification timer is
// 8, and that for a synchronization timer is 9. These values are
// very carefully chosen so that the dispatcher object type AND'ed
// with 0x7 yields 0 or 1 for event objects and the timer objects.
//
#define DISPATCHER_OBJECT_TYPE_MASK 0x7
typedef enum _KOBJECTS {
EventNotificationObject = 0,
EventSynchronizationObject = 1,
MutantObject = 2,
ProcessObject = 3,
QueueObject = 4,
SemaphoreObject = 5,
ThreadObject = 6,
Spare1Object = 7,
TimerNotificationObject = 8,
TimerSynchronizationObject = 9,
Spare2Object = 10,
Spare3Object = 11,
Spare4Object = 12,
Spare5Object = 13,
Spare6Object = 14,
Spare7Object = 15,
Spare8Object = 16,
Spare9Object = 17,
ApcObject,
DpcObject,
DeviceQueueObject,
EventPairObject,
InterruptObject,
ProfileObject
} KOBJECTS;
// begin_ntddk begin_wdm begin_ntminiport
//
// Interrupt modes.
//
typedef enum _KINTERRUPT_MODE {
LevelSensitive,
Latched
} KINTERRUPT_MODE;
// end_ntddk end_wdm end_ntminiport
//
// Thread scheduling states.
//
typedef enum _KTHREAD_STATE {
Initialized,
Ready,
Running,
Standby,
Terminated,
Waiting,
Transition
} KTHREAD_STATE;
// begin_ntddk begin_wdm
//
// Wait reasons
//
typedef enum _KWAIT_REASON {
Executive,
FreePage,
PageIn,
PoolAllocation,
DelayExecution,
Suspended,
UserRequest,
WrExecutive,
WrFreePage,
WrPageIn,
WrPoolAllocation,
WrDelayExecution,
WrSuspended,
WrUserRequest,
WrEventPair,
WrQueue,
WrLpcReceive,
WrLpcReply,
WrVirtualMemory,
WrPageOut,
WrRendezvous,
WrFsCacheIn,
WrFsCacheOut,
Spare4,
Spare5,
Spare6,
WrKernel,
MaximumWaitReason
} KWAIT_REASON;
// end_ntddk end_wdm
//
// Miscellaneous type definitions
//
// APC state
//
typedef struct _KAPC_STATE {
LIST_ENTRY ApcListHead[MaximumMode];
struct _KPROCESS *Process;
BOOLEAN KernelApcInProgress;
BOOLEAN KernelApcPending;
BOOLEAN UserApcPending;
BOOLEAN ApcQueueable;
} KAPC_STATE, *PKAPC_STATE, *RESTRICTED_POINTER PRKAPC_STATE;
// begin_ntddk begin_wdm
//
// Common dispatcher object header
//
// N.B. The size field contains the number of dwords in the structure.
//
typedef struct _DISPATCHER_HEADER {
UCHAR Type;
UCHAR Absolute;
UCHAR Size;
UCHAR Inserted;
LONG SignalState;
LIST_ENTRY WaitListHead;
} DISPATCHER_HEADER;
// end_ntddk end_wdm
//
// Wait block
//
// begin_ntddk begin_wdm
typedef struct _KWAIT_BLOCK {
LIST_ENTRY WaitListEntry;
struct _KTHREAD *RESTRICTED_POINTER Thread;
PVOID Object;
struct _KWAIT_BLOCK *RESTRICTED_POINTER NextWaitBlock;
USHORT WaitKey;
USHORT WaitType;
} KWAIT_BLOCK, *PKWAIT_BLOCK, *RESTRICTED_POINTER PRKWAIT_BLOCK;
// end_ntddk end_wdm
//
// Procedure type definitions
//
// Debug routine
//
typedef
BOOLEAN
(*PKDEBUG_ROUTINE) (
IN PKTRAP_FRAME TrapFrame,
IN PKEXCEPTION_FRAME ExceptionFrame,
IN PEXCEPTION_RECORD ExceptionRecord,
IN PCONTEXT ContextRecord,
IN BOOLEAN SecondChance
);
typedef enum {
ContinueError = FALSE,
ContinueSuccess = TRUE,
ContinueProcessorReselected,
ContinueNextProcessor
} KCONTINUE_STATUS;
// begin_ntddk begin_wdm
//
// Thread start function
//
typedef
VOID
(*PKSTART_ROUTINE) (
IN PVOID StartContext
);
// end_wdm
//
// Thread system function
//
typedef
VOID
(*PKSYSTEM_ROUTINE) (
IN PKSTART_ROUTINE StartRoutine OPTIONAL,
IN PVOID StartContext OPTIONAL
);
// begin_wdm
//
// Kernel object structure definitions
//
//
// Device Queue object and entry
//
typedef struct _KDEVICE_QUEUE {
CSHORT Type;
UCHAR Size;
BOOLEAN Busy;
LIST_ENTRY DeviceListHead;
} KDEVICE_QUEUE, *PKDEVICE_QUEUE, *RESTRICTED_POINTER PRKDEVICE_QUEUE;
typedef struct _KDEVICE_QUEUE_ENTRY {
LIST_ENTRY DeviceListEntry;
ULONG SortKey;
BOOLEAN Inserted;
} KDEVICE_QUEUE_ENTRY, *PKDEVICE_QUEUE_ENTRY, *RESTRICTED_POINTER PRKDEVICE_QUEUE_ENTRY;
//
// Event object
//
typedef struct _KEVENT {
DISPATCHER_HEADER Header;
} KEVENT, *PKEVENT, *RESTRICTED_POINTER PRKEVENT;
// end_ntddk end_wdm
// begin_ntddk begin_wdm
//
// Define the interrupt service function type and the empty struct
// type.
//
// end_ntddk end_wdm
struct _KINTERRUPT;
// begin_ntddk begin_wdm
typedef
BOOLEAN
(*PKSERVICE_ROUTINE) (
IN struct _KINTERRUPT *Interrupt,
IN PVOID ServiceContext
);
// end_ntddk end_wdm
//
// Interrupt object
//
typedef struct _KINTERRUPT {
PKSERVICE_ROUTINE ServiceRoutine;
PVOID ServiceContext;
ULONG BusInterruptLevel;
ULONG Irql; // zero extended
BOOLEAN Connected;
BOOLEAN ShareVector;
UCHAR Mode;
ULONG ServiceCount;
ULONG DispatchCode[DISPATCH_LENGTH];
} KINTERRUPT;
typedef struct _KINTERRUPT *PKINTERRUPT, *RESTRICTED_POINTER PRKINTERRUPT; // ntndis
// begin_ntddk begin_wdm
//
// Mutant object
//
typedef struct _KMUTANT {
DISPATCHER_HEADER Header;
LIST_ENTRY MutantListEntry;
struct _KTHREAD *RESTRICTED_POINTER OwnerThread;
BOOLEAN Abandoned;
} KMUTANT, *PKMUTANT, *RESTRICTED_POINTER PRKMUTANT;
// end_ntddk end_wdm
//
// Queue object
//
typedef struct _KQUEUE {
DISPATCHER_HEADER Header;
LIST_ENTRY EntryListHead;
ULONG CurrentCount;
ULONG MaximumCount;
LIST_ENTRY ThreadListHead;
} KQUEUE, *PKQUEUE, *RESTRICTED_POINTER PRKQUEUE;
// begin_ntddk begin_wdm
//
//
// Semaphore object
//
typedef struct _KSEMAPHORE {
DISPATCHER_HEADER Header;
LONG Limit;
} KSEMAPHORE, *PKSEMAPHORE, *RESTRICTED_POINTER PRKSEMAPHORE;
//
//
// Timer object
//
typedef struct _KTIMER {
DISPATCHER_HEADER Header;
ULARGE_INTEGER DueTime;
LIST_ENTRY TimerListEntry;
struct _KDPC *Dpc;
LONG Period;
} KTIMER, *PKTIMER, *RESTRICTED_POINTER PRKTIMER;
// end_ntddk end_wdm
//
// Thread object
//
typedef struct _KTHREAD {
//
// The dispatcher header and mutant listhead are fairly infrequently
// referenced, but pad the thread to a 32-byte boundary (assumption
// that pool allocation is in units of 32-bytes).
//
DISPATCHER_HEADER Header;
LIST_ENTRY MutantListHead;
//
// The following entries are referenced during clock interrupts.
//
ULONG KernelTime;
//
// The following fields are referenced during trap, interrupts, or
// context switches.
//
PVOID StackBase;
PVOID StackLimit;
PVOID KernelStack;
PVOID TlsData;
UCHAR State;
BOOLEAN Alerted[MaximumMode];
BOOLEAN Alertable;
UCHAR NpxState;
CHAR Saturation;
SCHAR Priority;
UCHAR Padding;
KAPC_STATE ApcState;
ULONG ContextSwitches;
//
// The following fields are referenced during wait operations.
//
LONG_PTR WaitStatus;
KIRQL WaitIrql;
KPROCESSOR_MODE WaitMode;
BOOLEAN WaitNext;
UCHAR WaitReason;
PRKWAIT_BLOCK WaitBlockList;
LIST_ENTRY WaitListEntry;
ULONG WaitTime;
ULONG KernelApcDisable;
LONG Quantum;
SCHAR BasePriority;
UCHAR DecrementCount;
SCHAR PriorityDecrement;
BOOLEAN DisableBoost;
UCHAR NpxIrql;
CCHAR SuspendCount;
BOOLEAN Preempted;
BOOLEAN HasTerminated;
//
// The following fields are referenced during queue operations.
//
PRKQUEUE Queue;
LIST_ENTRY QueueListEntry;
//
// The following fields are referenced when the thread is blocking for a
// timed interval.
//
KTIMER Timer;
KWAIT_BLOCK TimerWaitBlock;
//
// The following fields are referenced when the thread is initialized
// and very infrequently thereafter.
//
KAPC SuspendApc;
KSEMAPHORE SuspendSemaphore;
LIST_ENTRY ThreadListEntry;
} KTHREAD, *PKTHREAD, *RESTRICTED_POINTER PRKTHREAD;
//
// Process object structure definition
//
typedef struct _KPROCESS {
LIST_ENTRY ReadyListHead;
LIST_ENTRY ThreadListHead;
ULONG StackCount;
LONG ThreadQuantum;
SCHAR BasePriority;
BOOLEAN DisableBoost;
BOOLEAN DisableQuantum;
} KPROCESS, *PKPROCESS, *RESTRICTED_POINTER PRKPROCESS;
//
// Kernel control object functions
//
// APC object
//
NTKERNELAPI
VOID
KeInitializeApc (
IN PRKAPC Apc,
IN PRKTHREAD Thread,
IN PKKERNEL_ROUTINE KernelRoutine,
IN PKRUNDOWN_ROUTINE RundownRoutine OPTIONAL,
IN PKNORMAL_ROUTINE NormalRoutine OPTIONAL,
IN KPROCESSOR_MODE ProcessorMode OPTIONAL,
IN PVOID NormalContext OPTIONAL
);
PLIST_ENTRY
KeFlushQueueApc (
IN PKTHREAD Thread,
IN KPROCESSOR_MODE ProcessorMode
);
NTKERNELAPI
BOOLEAN
KeInsertQueueApc (
IN PRKAPC Apc,
IN PVOID SystemArgument1,
IN PVOID SystemArgument2,
IN KPRIORITY Increment
);
BOOLEAN
KeRemoveQueueApc (
IN PKAPC Apc
);
// begin_ntddk begin_wdm
//
// DPC object
//
NTKERNELAPI
VOID
KeInitializeDpc (
IN PRKDPC Dpc,
IN PKDEFERRED_ROUTINE DeferredRoutine,
IN PVOID DeferredContext
);
#define INITIALIZED_KDPC(_Dpc, _DeferredRoutine, _DeferredContext) \
KDPC _Dpc = { \
DpcObject, \
FALSE, \
0, \
NULL, \
NULL, \
_DeferredRoutine, \
_DeferredContext \
}
NTKERNELAPI
BOOLEAN
KeInsertQueueDpc (
IN PRKDPC Dpc,
IN PVOID SystemArgument1,
IN PVOID SystemArgument2
);
NTKERNELAPI
BOOLEAN
KeRemoveQueueDpc (
IN PRKDPC Dpc
);
DECLSPEC_NORETURN
VOID
KeRetireDpcListLoop(
VOID
);
//
// Device queue object
//
NTKERNELAPI
VOID
KeInitializeDeviceQueue (
IN PKDEVICE_QUEUE DeviceQueue
);
NTKERNELAPI
BOOLEAN
KeInsertDeviceQueue (
IN PKDEVICE_QUEUE DeviceQueue,
IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
);
NTKERNELAPI
BOOLEAN
KeInsertByKeyDeviceQueue (
IN PKDEVICE_QUEUE DeviceQueue,
IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry,
IN ULONG SortKey
);
NTKERNELAPI
PKDEVICE_QUEUE_ENTRY
KeRemoveDeviceQueue (
IN PKDEVICE_QUEUE DeviceQueue
);
NTKERNELAPI
PKDEVICE_QUEUE_ENTRY
KeRemoveByKeyDeviceQueue (
IN PKDEVICE_QUEUE DeviceQueue,
IN ULONG SortKey
);
NTKERNELAPI
BOOLEAN
KeRemoveEntryDeviceQueue (
IN PKDEVICE_QUEUE DeviceQueue,
IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
);
// end_ntddk end_wdm
//
// Interrupt object
//
NTKERNELAPI // nthal
VOID // nthal
KeInitializeInterrupt ( // nthal
IN PKINTERRUPT Interrupt, // nthal
IN PKSERVICE_ROUTINE ServiceRoutine, // nthal
IN PVOID ServiceContext, // nthal
IN ULONG Vector, // nthal
IN KIRQL Irql, // nthal
IN KINTERRUPT_MODE InterruptMode, // nthal
IN BOOLEAN ShareVector // nthal
); // nthal
// nthal
NTKERNELAPI // nthal
BOOLEAN // nthal
KeConnectInterrupt ( // nthal
IN PKINTERRUPT Interrupt // nthal
); // nthal
// nthal
NTKERNELAPI
BOOLEAN
KeDisconnectInterrupt (
IN PKINTERRUPT Interrupt
);
NTKERNELAPI // ntddk wdm nthal
BOOLEAN // ntddk wdm nthal
KeSynchronizeExecution ( // ntddk wdm nthal
IN PKINTERRUPT Interrupt, // ntddk wdm nthal
IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine, // ntddk wdm nthal
IN PVOID SynchronizeContext // ntddk wdm nthal
); // ntddk wdm nthal
// ntddk wdm nthal
// begin_ntddk begin_wdm
//
// Kernel dispatcher object functions
//
// Event Object
//
// end_wdm end_ntddk
#if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_)
// begin_wdm begin_ntddk
NTKERNELAPI
VOID
KeInitializeEvent (
IN PRKEVENT Event,
IN EVENT_TYPE Type,
IN BOOLEAN State
);
// end_wdm end_ntddk
#else
#define KeInitializeEvent(_Event, _Type, _State) \
(_Event)->Header.Type = (UCHAR)_Type; \
(_Event)->Header.Size = sizeof(KEVENT) / sizeof(LONG); \
(_Event)->Header.SignalState = _State; \
InitializeListHead(&(_Event)->Header.WaitListHead)
#endif
#define INITIALIZED_KEVENT(_Event, _Type, _State) \
KEVENT _Event = { \
_Type, \
FALSE, \
sizeof(KEVENT) / sizeof(LONG), \
FALSE, \
_State, \
&_Event.Header.WaitListHead, \
&_Event.Header.WaitListHead \
}
// begin_ntddk
#define KeClearEvent(Event) ((Event)->Header.SignalState = 0)
NTKERNELAPI
LONG
KePulseEvent (
IN PRKEVENT Event,
IN KPRIORITY Increment,
IN BOOLEAN Wait
);
#define KeReadStateEvent(Event) (Event)->Header.SignalState
// begin_wdm
NTKERNELAPI
LONG
KeResetEvent (
IN PRKEVENT Event
);
NTKERNELAPI
LONG
KeSetEvent (
IN PRKEVENT Event,
IN KPRIORITY Increment,
IN BOOLEAN Wait
);
// end_ntddk end_wdm
VOID
KeSetEventBoostPriority (
IN PRKEVENT Event,
IN PRKTHREAD *Thread OPTIONAL
);
//
// Mutant object
//
NTKERNELAPI
VOID
KeInitializeMutant (
IN PRKMUTANT Mutant,
IN BOOLEAN InitialOwner
);
#define KeReadStateMutant(Mutant) (Mutant)->Header.SignalState
NTKERNELAPI
LONG
KeReleaseMutant (
IN PRKMUTANT Mutant,
IN KPRIORITY Increment,
IN BOOLEAN Abandoned,
IN BOOLEAN Wait
);
//
//
// Queue Object.
//
NTKERNELAPI
VOID
KeInitializeQueue (
IN PRKQUEUE Queue,
IN ULONG Count OPTIONAL
);
#define KeReadStateQueue(Queue) (Queue)->Header.SignalState
NTKERNELAPI
LONG
KeInsertQueue (
IN PRKQUEUE Queue,
IN PLIST_ENTRY Entry
);
NTKERNELAPI
LONG
KeInsertHeadQueue (
IN PRKQUEUE Queue,
IN PLIST_ENTRY Entry
);
NTKERNELAPI
PLIST_ENTRY
KeRemoveQueue (
IN PRKQUEUE Queue,
IN KPROCESSOR_MODE WaitMode,
IN PLARGE_INTEGER Timeout OPTIONAL
);
PLIST_ENTRY
KeRundownQueue (
IN PRKQUEUE Queue
);
// begin_ntddk begin_wdm
//
// Semaphore object
//
NTKERNELAPI
VOID
KeInitializeSemaphore (
IN PRKSEMAPHORE Semaphore,
IN LONG Count,
IN LONG Limit
);
#define KeReadStateSemaphore(Semaphore) (Semaphore)->Header.SignalState
NTKERNELAPI
LONG
KeReleaseSemaphore (
IN PRKSEMAPHORE Semaphore,
IN KPRIORITY Increment,
IN LONG Adjustment,
IN BOOLEAN Wait
);
// end_ntddk end_wdm
//
// Process object
//
VOID
KeInitializeProcess (
IN PRKPROCESS Process,
IN KPRIORITY Priority
);
NTKERNELAPI
KPRIORITY
KeSetPriorityProcess (
IN PKPROCESS Process,
IN KPRIORITY BasePriority
);
LOGICAL
KeSetDisableQuantumProcess (
IN PKPROCESS Process,
IN LOGICAL Disable
);
//
// Thread object
//
VOID
KeInitializeThread (
IN PKTHREAD Thread,
IN PVOID KernelStack,
IN SIZE_T KernelStackSize,
IN SIZE_T TlsDataSize,
IN PKSYSTEM_ROUTINE SystemRoutine,
IN PKSTART_ROUTINE StartRoutine OPTIONAL,
IN PVOID StartContext OPTIONAL,
IN PKPROCESS Process
);
NTKERNELAPI
BOOLEAN
KeAlertThread (
IN PKTHREAD Thread,
IN KPROCESSOR_MODE ProcessorMode
);
NTKERNELAPI
ULONG
KeAlertResumeThread (
IN PKTHREAD Thread
);
NTKERNELAPI
VOID
KeBoostCurrentThread (
VOID
);
VOID
KeBoostPriorityThread (
IN PKTHREAD Thread,
IN KPRIORITY Increment
);
NTKERNELAPI // ntddk wdm nthal ntifs
NTSTATUS // ntddk wdm nthal ntifs
KeDelayExecutionThread ( // ntddk wdm nthal ntifs
IN KPROCESSOR_MODE WaitMode, // ntddk wdm nthal ntifs
IN BOOLEAN Alertable, // ntddk wdm nthal ntifs
IN PLARGE_INTEGER Interval // ntddk wdm nthal ntifs
); // ntddk wdm nthal ntifs
// ntddk wdm nthal ntifs
BOOLEAN
KeDisableApcQueuingThread (
IN PKTHREAD Thread
);
BOOLEAN
KeEnableApcQueuingThread (
IN PKTHREAD Thread
);
NTKERNELAPI
LOGICAL
KeSetDisableBoostThread (
IN PKTHREAD Thread,
IN LOGICAL Disable
);
ULONG
KeForceResumeThread (
IN PKTHREAD Thread
);
NTKERNELAPI
LONG
KeQueryBasePriorityThread (
IN PKTHREAD Thread
);
#define KeQueryPriorityThread(Thread) Thread->Priority
#define KeReadStateThread(Thread) ((BOOLEAN)(Thread)->Header.SignalState)
VOID
KeReadyThread (
IN PKTHREAD Thread
);
ULONG
KeResumeThread (
IN PKTHREAD Thread
);
VOID
KeRundownThread (
VOID
);
NTKERNELAPI // ntddk nthal ntifs
LONG // ntddk nthal ntifs
KeSetBasePriorityThread ( // ntddk nthal ntifs
IN PKTHREAD Thread, // ntddk nthal ntifs
IN LONG Increment // ntddk nthal ntifs
); // ntddk nthal ntifs
NTKERNELAPI // ntddk wdm nthal ntifs
KPRIORITY // ntddk wdm nthal ntifs
KeSetPriorityThread ( // ntddk wdm nthal ntifs
IN PKTHREAD Thread, // ntddk wdm nthal ntifs
IN KPRIORITY Priority // ntddk wdm nthal ntifs
); // ntddk wdm nthal ntifs
// ntddk wdm nthal ntifs
ULONG
KeSuspendThread (
IN PKTHREAD Thread
);
VOID
KeTerminateThread (
VOID
);
NTKERNELAPI
BOOLEAN
KeTestAlertThread (
IN KPROCESSOR_MODE ProcessorMode
);
//
// Define leave critical region macro used for inline and function code
// generation.
//
// Warning: assembly versions of this code are included directly in
// ntgdi assembly routines mutexs.s for MIPS and locka.asm for i386.
// Any changes made to KeEnterCriticalRegion/KeEnterCriticalRegion
// must be reflected in these routines.
//
#define KiLeaveCriticalRegion() { \
PKTHREAD Thread; \
Thread = KeGetCurrentThread(); \
if (((*((volatile ULONG *)&Thread->KernelApcDisable) += 1) == 0) && \
(((volatile LIST_ENTRY *)&Thread->ApcState.ApcListHead[KernelMode])->Flink != \
&Thread->ApcState.ApcListHead[KernelMode])) { \
Thread->ApcState.KernelApcPending = TRUE; \
KiRequestSoftwareInterrupt(APC_LEVEL); \
} \
}
// begin_ntddk
#if (defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_)) && !defined(_NTSYSTEM_DRIVER_)
// begin_wdm
NTKERNELAPI
VOID
KeEnterCriticalRegion (
VOID
);
NTKERNELAPI
VOID
KeLeaveCriticalRegion (
VOID
);
// end_wdm
#else
//++
//
// VOID
// KeEnterCriticalRegion (
// VOID
// )
//
//
// Routine Description:
//
// This function disables kernel APC's.
//
// N.B. The following code does not require any interlocks. There are
// two cases of interest: 1) On an MP system, the thread cannot
// be running on two processors as once, and 2) if the thread is
// is interrupted to deliver a kernel mode APC which also calls
// this routine, the values read and stored will stack and unstack
// properly.
//
// Arguments:
//
// None.
//
// Return Value:
//
// None.
//--
#define KeEnterCriticalRegion() KeGetCurrentThread()->KernelApcDisable -= 1;
//++
//
// VOID
// KeLeaveCriticalRegion (
// VOID
// )
//
//
// Routine Description:
//
// This function enables kernel APC's.
//
// N.B. The following code does not require any interlocks. There are
// two cases of interest: 1) On an MP system, the thread cannot
// be running on two processors as once, and 2) if the thread is
// is interrupted to deliver a kernel mode APC which also calls
// this routine, the values read and stored will stack and unstack
// properly.
//
// Arguments:
//
// None.
//
// Return Value:
//
// None.
//--
#define KeLeaveCriticalRegion() KiLeaveCriticalRegion()
#endif
// begin_wdm
//
// Timer object
//
#define KeInitializeTimer(Timer) KeInitializeTimerEx(Timer, NotificationTimer)
NTKERNELAPI
VOID
KeInitializeTimerEx (
IN PKTIMER Timer,
IN TIMER_TYPE Type
);
#define INITIALIZED_KTIMER(_Timer, _Type) \
KTIMER _Timer = { \
TimerNotificationObject + _Type, \
FALSE, \
sizeof(KTIMER) / sizeof(LONG), \
FALSE, \
FALSE, \
&_Timer.Header.WaitListHead, \
&_Timer.Header.WaitListHead \
}
NTKERNELAPI
BOOLEAN
KeCancelTimer (
IN PKTIMER
);
#define KeClearTimer(Timer) ((Timer)->Header.SignalState = 0)
#define KeReadStateTimer(Timer) ((BOOLEAN)(Timer)->Header.SignalState)
NTKERNELAPI
BOOLEAN
KeSetTimer (
IN PKTIMER Timer,
IN LARGE_INTEGER DueTime,
IN PKDPC Dpc OPTIONAL
);
NTKERNELAPI
BOOLEAN
KeSetTimerEx (
IN PKTIMER Timer,
IN LARGE_INTEGER DueTime,
IN LONG Period OPTIONAL,
IN PKDPC Dpc OPTIONAL
);
// end_ntddk end_wdm
PVOID
KeCheckForTimer(
IN PVOID p,
IN ULONG Size
);
ULONGLONG
KeQueryTimerDueTime (
IN PKTIMER Timer
);
//
// Wait functions
//
// begin_ntddk begin_wdm
NTKERNELAPI
NTSTATUS
KeWaitForMultipleObjects (
IN ULONG Count,
IN PVOID Object[],
IN WAIT_TYPE WaitType,
IN KWAIT_REASON WaitReason,
IN KPROCESSOR_MODE WaitMode,
IN BOOLEAN Alertable,
IN PLARGE_INTEGER Timeout OPTIONAL,
IN PKWAIT_BLOCK WaitBlockArray
);
NTKERNELAPI
NTSTATUS
KeWaitForSingleObject (
IN PVOID Object,
IN KWAIT_REASON WaitReason,
IN KPROCESSOR_MODE WaitMode,
IN BOOLEAN Alertable,
IN PLARGE_INTEGER Timeout OPTIONAL
);
// end_ntddk end_wdm
//
// On Uni-processor systems there is no real Dispatcher Database Lock
// so raising to SYNCH won't help get the lock released any sooner.
// On X86, these functions are implemented in the HAL and don't use
// the KiSynchLevel variable, on other platforms, KiSynchLevel can
// be set appropriately.
//
#define KiLockDispatcherDatabase(OldIrql) \
*(OldIrql) = KeRaiseIrqlToDpcLevel()
NTKERNELAPI
VOID
FASTCALL
KiUnlockDispatcherDatabase (
IN KIRQL OldIrql
);
#define KiLockDispatcherDatabaseAtDpcLevel() \
ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL)
#define KiUnlockDispatcherDatabaseFromDpcLevel() \
ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL)
VOID
FASTCALL
KiSetPriorityThread (
IN PRKTHREAD Thread,
IN KPRIORITY Priority
);
// begin_ntddk begin_wdm
//
// spin lock functions
//
#define KeInitializeSpinLock(a) *(a) = 0
#define KeAcquireSpinLockAtDpcLevel(a) ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL)
#define KeReleaseSpinLockFromDpcLevel(a)
#define KeAcquireSpinLock(a,b) *(b) = KeRaiseIrqlToDpcLevel()
#define KeReleaseSpinLock(a,b) KeLowerIrql(b)
#define KeTryToAcquireSpinLock(a,b) (KeAcquireSpinLock(a,b),TRUE)
// end_wdm end_ntddk
//
// Raise and lower IRQL functions.
//
// begin_wdm begin_ntddk
#if defined(_X86_)
NTHALAPI
VOID
FASTCALL
KfLowerIrql (
IN KIRQL NewIrql
);
NTHALAPI
KIRQL
FASTCALL
KfRaiseIrql (
IN KIRQL NewIrql
);
NTHALAPI
KIRQL
KeRaiseIrqlToDpcLevel(
VOID
);
NTHALAPI
KIRQL
KeRaiseIrqlToSynchLevel(
VOID
);
#define KeLowerIrql(a) KfLowerIrql(a)
#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
#endif
//
// Miscellaneous kernel functions
//
// end_wdm
NTKERNELAPI
DECLSPEC_NORETURN
VOID
NTAPI
KeBugCheck (
IN ULONG BugCheckCode
);
// begin_wdm
NTKERNELAPI
DECLSPEC_NORETURN
VOID
KeBugCheckEx(
IN ULONG BugCheckCode,
IN ULONG_PTR BugCheckParameter1,
IN ULONG_PTR BugCheckParameter2,
IN ULONG_PTR BugCheckParameter3,
IN ULONG_PTR BugCheckParameter4
);
// end_wdm
NTKERNELAPI
VOID
KeEnterKernelDebugger (
VOID
);
// end_ntddk
VOID
KeContextFromKframes (
IN PKTRAP_FRAME TrapFrame,
IN OUT PCONTEXT ContextFrame
);
VOID
KeContextToKframes (
IN OUT PKTRAP_FRAME TrapFrame,
IN PCONTEXT ContextFrame,
IN ULONG ContextFlags
);
NTKERNELAPI // nthal
VOID // nthal
KeFlushCurrentTb ( // nthal
VOID // nthal
); // nthal
// nthal
VOID
KeSetSystemTime (
IN PLARGE_INTEGER NewTime,
OUT PLARGE_INTEGER OldTime
);
// begin_ntddk begin_wdm
NTKERNELAPI
ULONGLONG
KeQueryInterruptTime (
VOID
);
NTKERNELAPI
VOID
KeQuerySystemTime (
OUT PLARGE_INTEGER CurrentTime
);
#if !defined(_NTSYSTEM_)
#define KeQueryTickCount() *KeTickCount
#else
#define KeQueryTickCount() KeTickCount
#endif
#define KiQueryLowTickCount KeQueryTickCount
// end_wdm end_ntddk
//
// Define the firmware routine types
//
typedef enum _FIRMWARE_REENTRY {
HalHaltRoutine,
HalRebootRoutine,
HalQuickRebootRoutine,
HalKdRebootRoutine,
HalFatalErrorRebootRoutine,
HalMaximumRoutine
} FIRMWARE_REENTRY, *PFIRMWARE_REENTRY;
//
// Quick reboot routine.
//
VOID
KeQuickRebootSystem(
VOID
);
//
// begin_ntddk
//
// Context swap notify routine.
//
typedef
VOID
(FASTCALL *PSWAP_CONTEXT_NOTIFY_ROUTINE)(
IN HANDLE OldThreadId,
IN HANDLE NewThreadId
);
//
// Thread select notify routine.
//
typedef
LOGICAL
(FASTCALL *PTHREAD_SELECT_NOTIFY_ROUTINE)(
IN HANDLE ThreadId
);
//
// Time update notify routine.
//
typedef
VOID
(FASTCALL *PTIME_UPDATE_NOTIFY_ROUTINE)(
IN HANDLE ThreadId,
IN KPROCESSOR_MODE Mode
);
// end_ntddk
//
// External references to public kernel data structures
//
extern BOOLEAN KeHasQuickBooted;
extern LARGE_INTEGER KeBootTime;
extern ULONGLONG KeBootTimeBias;
#if !defined(_NTSYSTEM_)
extern const ULONG *KeTimeIncrement;
extern volatile PULONG KeTickCount;
extern volatile PKSYSTEM_TIME KeInterruptTime;
extern volatile PKSYSTEM_TIME KeSystemTime;
#else
extern const ULONG KeTimeIncrement;
extern volatile ULONG KeTickCount;
extern volatile KSYSTEM_TIME KeInterruptTime;
extern volatile KSYSTEM_TIME KeSystemTime;
#endif
#endif // _KE_