1427 lines
30 KiB
C
1427 lines
30 KiB
C
|
/*++ 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_
|