3 /* INCLUDES *****************************************************************/
7 /* INTERNAL KERNEL TYPES ****************************************************/
9 typedef struct _WOW64_PROCESS
12 } WOW64_PROCESS
, *PWOW64_PROCESS
;
14 typedef struct _KPROFILE_SOURCE_OBJECT
16 KPROFILE_SOURCE Source
;
18 } KPROFILE_SOURCE_OBJECT
, *PKPROFILE_SOURCE_OBJECT
;
20 typedef enum _CONNECT_TYPE
26 } CONNECT_TYPE
, *PCONNECT_TYPE
;
28 typedef struct _DISPATCH_INFO
31 PKINTERRUPT Interrupt
;
32 PKINTERRUPT_ROUTINE NoDispatch
;
33 PKINTERRUPT_ROUTINE InterruptDispatch
;
34 PKINTERRUPT_ROUTINE FloatingDispatch
;
35 PKINTERRUPT_ROUTINE ChainedDispatch
;
36 PKINTERRUPT_ROUTINE
*FlatDispatch
;
37 } DISPATCH_INFO
, *PDISPATCH_INFO
;
39 typedef struct _DEFERRED_REVERSE_BARRIER
42 ULONG TotalProcessors
;
43 } DEFERRED_REVERSE_BARRIER
, *PDEFERRED_REVERSE_BARRIER
;
45 typedef struct _KI_SAMPLE_MAP
47 LARGE_INTEGER PerfStart
;
48 LARGE_INTEGER PerfEnd
;
50 LARGE_INTEGER PerfFreq
;
55 } KI_SAMPLE_MAP
, *PKI_SAMPLE_MAP
;
57 #define MAX_TIMER_DPCS 16
59 typedef struct _DPC_QUEUE_ENTRY
62 PKDEFERRED_ROUTINE Routine
;
64 } DPC_QUEUE_ENTRY
, *PDPC_QUEUE_ENTRY
;
66 typedef struct _KNMI_HANDLER_CALLBACK
68 struct _KNMI_HANDLER_CALLBACK
* Next
;
69 PNMI_CALLBACK Callback
;
72 } KNMI_HANDLER_CALLBACK
, *PKNMI_HANDLER_CALLBACK
;
75 (NTAPI
*PKE_BUGCHECK_UNICODE_TO_ANSI
)(
76 IN PUNICODE_STRING Unicode
,
81 extern PKNMI_HANDLER_CALLBACK KiNmiCallbackListHead
;
82 extern KSPIN_LOCK KiNmiCallbackListLock
;
83 extern PVOID KeUserApcDispatcher
;
84 extern PVOID KeUserCallbackDispatcher
;
85 extern PVOID KeUserExceptionDispatcher
;
86 extern PVOID KeRaiseUserExceptionDispatcher
;
87 extern LARGE_INTEGER KeBootTime
;
88 extern ULONGLONG KeBootTimeBias
;
89 extern BOOLEAN ExCmosClockIsSane
;
90 extern USHORT KeProcessorArchitecture
;
91 extern USHORT KeProcessorLevel
;
92 extern USHORT KeProcessorRevision
;
93 extern ULONG KeFeatureBits
;
95 extern PKNODE KeNodeBlock
[1];
96 extern UCHAR KeNumberNodes
;
97 extern UCHAR KeProcessNodeSeed
;
98 extern ETHREAD KiInitialThread
;
99 extern EPROCESS KiInitialProcess
;
100 extern PULONG KiInterruptTemplateObject
;
101 extern PULONG KiInterruptTemplateDispatch
;
102 extern PULONG KiInterruptTemplate2ndDispatch
;
103 extern ULONG KiUnexpectedEntrySize
;
104 extern ULONG_PTR KiDoubleFaultStack
;
105 extern EX_PUSH_LOCK KernelAddressSpaceLock
;
106 extern ULONG KiMaximumDpcQueueDepth
;
107 extern ULONG KiMinimumDpcRate
;
108 extern ULONG KiAdjustDpcThreshold
;
109 extern ULONG KiIdealDpcRate
;
110 extern BOOLEAN KeThreadDpcEnable
;
111 extern LARGE_INTEGER KiTimeIncrementReciprocal
;
112 extern UCHAR KiTimeIncrementShiftCount
;
113 extern ULONG KiTimeLimitIsrMicroseconds
;
114 extern ULONG KiServiceLimit
;
115 extern LIST_ENTRY KeBugcheckCallbackListHead
, KeBugcheckReasonCallbackListHead
;
116 extern KSPIN_LOCK BugCheckCallbackLock
;
117 extern KDPC KiTimerExpireDpc
;
118 extern KTIMER_TABLE_ENTRY KiTimerTableListHead
[TIMER_TABLE_SIZE
];
119 extern FAST_MUTEX KiGenericCallDpcMutex
;
120 extern LIST_ENTRY KiProfileListHead
, KiProfileSourceListHead
;
121 extern KSPIN_LOCK KiProfileLock
;
122 extern LIST_ENTRY KiProcessListHead
;
123 extern LIST_ENTRY KiProcessInSwapListHead
, KiProcessOutSwapListHead
;
124 extern LIST_ENTRY KiStackInSwapListHead
;
125 extern KEVENT KiSwapEvent
;
126 extern PKPRCB KiProcessorBlock
[];
127 extern ULONG KiMask32Array
[MAXIMUM_PRIORITY
];
128 extern ULONG_PTR KiIdleSummary
;
129 extern PVOID KeUserApcDispatcher
;
130 extern PVOID KeUserCallbackDispatcher
;
131 extern PVOID KeUserExceptionDispatcher
;
132 extern PVOID KeRaiseUserExceptionDispatcher
;
133 extern ULONG KeTimeIncrement
;
134 extern ULONG KeTimeAdjustment
;
135 extern BOOLEAN KiTimeAdjustmentEnabled
;
136 extern LONG KiTickOffset
;
137 extern ULONG_PTR KiBugCheckData
[5];
138 extern ULONG KiFreezeFlag
;
139 extern ULONG KiDPCTimeout
;
140 extern PGDI_BATCHFLUSH_ROUTINE KeGdiFlushUserBatch
;
141 extern ULONGLONG BootCycles
, BootCyclesEnd
;
142 extern ULONG ProcessCount
;
143 extern VOID __cdecl
KiInterruptTemplate(VOID
);
145 /* MACROS *************************************************************************/
147 #define AFFINITY_MASK(Id) KiMask32Array[Id]
148 #define PRIORITY_MASK(Id) KiMask32Array[Id]
150 /* Tells us if the Timer or Event is a Syncronization or Notification Object */
151 #define TIMER_OR_EVENT_TYPE 0x7L
153 /* One of the Reserved Wait Blocks, this one is for the Thread's Timer */
154 #define TIMER_WAIT_BLOCK 0x3L
156 /* INTERNAL KERNEL FUNCTIONS ************************************************/
158 /* Finds a new thread to run */
174 KeSetDisableBoostThread(
175 IN OUT PKTHREAD Thread
,
181 KeSetDisableBoostProcess(
182 IN PKPROCESS Process
,
188 KeSetAutoAlignmentProcess(
189 IN PKPROCESS Process
,
195 KeSetAffinityProcess(
196 IN PKPROCESS Process
,
197 IN KAFFINITY Affinity
202 KeBoostPriorityThread(
204 IN KPRIORITY Increment
209 KeBalanceSetManager(IN PVOID Context
);
213 KiReadyThread(IN PKTHREAD Thread
);
217 KeSuspendThread(PKTHREAD Thread
);
221 KeReadStateThread(IN PKTHREAD Thread
);
227 IN PKTHREAD CurrentThread
232 KiAdjustQuantumThread(IN PKTHREAD Thread
);
236 KiExitDispatcher(KIRQL OldIrql
);
240 KiDeferredReadyThread(IN PKTHREAD Thread
);
250 KiProcessDeferredReadyList(
258 IN KAFFINITY Affinity
277 IN PLIST_ENTRY ExpiredListHead
,
285 IN LARGE_INTEGER Interval
292 IN PKSPIN_LOCK_QUEUE LockQueue
295 /* gmutex.c ********************************************************************/
299 KiAcquireGuardedMutex(
300 IN OUT PKGUARDED_MUTEX GuardedMutex
306 IN PFAST_MUTEX FastMutex
309 /* gate.c **********************************************************************/
313 KeInitializeGate(PKGATE Gate
);
317 KeSignalGateBoostPriority(PKGATE Gate
);
323 KWAIT_REASON WaitReason
,
324 KPROCESSOR_MODE WaitMode
327 /* ipi.c ********************************************************************/
339 IN KAFFINITY TargetProcessors
,
340 IN PKIPI_WORKER WorkerFunction
,
341 IN PKIPI_BROADCAST_WORKER BroadcastFunction
,
342 IN ULONG_PTR Context
,
348 KiIpiSignalPacketDone(
349 IN PKIPI_CONTEXT PacketContext
354 KiIpiSignalPacketDoneAndStall(
355 IN PKIPI_CONTEXT PacketContext
,
356 IN
volatile PULONG ReverseStall
359 /* next file ***************************************************************/
363 KeFindNextRightSetAffinity(
370 DbgBreakPointNoBugCheck(VOID
);
375 struct _KPROFILE
* Profile
,
376 struct _KPROCESS
* Process
,
380 KPROFILE_SOURCE ProfileSource
,
387 struct _KPROFILE
* Profile
,
393 KeStopProfile(struct _KPROFILE
* Profile
);
397 KeQueryIntervalProfile(KPROFILE_SOURCE ProfileSource
);
401 KeSetIntervalProfile(
402 KPROFILE_SOURCE ProfileSource
,
409 PKTRAP_FRAME TrapFrame
414 KeProfileInterruptWithSource(
415 IN PKTRAP_FRAME TrapFrame
,
416 IN KPROFILE_SOURCE Source
422 PKTRAP_FRAME TrapFrame
,
430 PVOID DeferredContext
,
431 PVOID SystemArgument1
,
432 PVOID SystemArgument2
438 IN PKPROCESS Process
,
439 IN OUT PKTHREAD Thread
,
440 IN PKSYSTEM_ROUTINE SystemRoutine
,
441 IN PKSTART_ROUTINE StartRoutine
,
442 IN PVOID StartContext
,
457 IN OUT PKTHREAD Thread
,
458 IN PVOID KernelStack
,
459 IN PKSYSTEM_ROUTINE SystemRoutine
,
460 IN PKSTART_ROUTINE StartRoutine
,
461 IN PVOID StartContext
,
469 KiInitializeContextThread(
471 PKSYSTEM_ROUTINE SystemRoutine
,
472 PKSTART_ROUTINE StartRoutine
,
480 IN OUT PKTHREAD Thread
487 IN KPROCESSOR_MODE AlertMode
511 KeRundownThread(VOID
);
515 KeReleaseThread(PKTHREAD Thread
);
527 IN PKNORMAL_ROUTINE
*NormalRoutine
,
528 IN PVOID
*NormalContext
,
529 IN PVOID
*SystemArgument1
,
530 IN PVOID
*SystemArgument2
536 IN PVOID NormalContext
,
537 IN PVOID SystemArgument1
,
538 IN PVOID SystemArgument2
543 KeQueryBasePriorityThread(IN PKTHREAD Thread
);
549 IN KPRIORITY Priority
556 IN LONG_PTR WaitStatus
561 KeDumpStackFrames(PULONG Frame
);
571 IN LONG_PTR WaitStatus
,
572 IN KPRIORITY Increment
578 struct _KPROCESS
*Process
,
581 PULONG_PTR DirectoryTableBase
,
588 IN PKPROCESS Process
,
594 KeSetPriorityAndQuantumProcess(
595 IN PKPROCESS Process
,
596 IN KPRIORITY Priority
,
597 IN UCHAR Quantum OPTIONAL
602 KeForceResumeThread(IN PKTHREAD Thread
);
618 KeDisableThreadApcQueueing(IN PKTHREAD Thread
);
629 KeContextToTrapFrame(
631 PKEXCEPTION_FRAME ExeptionFrame
,
632 PKTRAP_FRAME TrapFrame
,
634 KPROCESSOR_MODE PreviousMode
643 KiCheckForKernelApcDelivery(VOID
);
649 IN PLIST_ENTRY Entry
,
657 IN PVOID DeferredContext
,
658 IN PVOID SystemArgument1
,
659 IN PVOID SystemArgument2
665 struct _KPROCESS
* Process
,
672 KeInitializeEventPair(PKEVENT_PAIR EventPair
);
677 IN PKEXCEPTION_FRAME Reserved
,
678 IN PKTRAP_FRAME TrapFrame
,
679 IN PKNORMAL_ROUTINE NormalRoutine
,
680 IN PVOID NormalContext
,
681 IN PVOID SystemArgument1
,
682 IN PVOID SystemArgument2
689 IN KPROCESSOR_MODE PreviousMode
695 struct _KTHREAD
*Thread
,
696 struct _KPROCESS
*Process
,
697 PKLOCK_QUEUE_HANDLE ApcLock
,
698 struct _KAPC_STATE
*SavedApcState
704 struct _KPROCESS
*NewProcess
,
705 struct _KPROCESS
*OldProcess
710 KeTestAlertThread(IN KPROCESSOR_MODE AlertMode
);
714 KeRemoveQueueApc(PKAPC Apc
);
718 KiActivateWaiterQueue(IN PKQUEUE Queue
);
722 KeQueryRuntimeProcess(IN PKPROCESS Process
,
723 OUT PULONG UserTime
);
725 /* INITIALIZATION FUNCTIONS *************************************************/
733 KeInitExceptions(VOID
);
737 KeInitInterrupts(VOID
);
741 KiInitializeBugCheck(VOID
);
746 IN PLOADER_PARAMETER_BLOCK LoaderBlock
751 KiDeliverUserApc(PKTRAP_FRAME TrapFrame
);
756 PKAPC_STATE OldState
,
763 KPROFILE_SOURCE Source
,
770 PEXCEPTION_RECORD ExceptionRecord
,
771 PKEXCEPTION_FRAME ExceptionFrame
,
773 KPROCESSOR_MODE PreviousMode
,
779 KeTrapFrameToContext(
780 IN PKTRAP_FRAME TrapFrame
,
781 IN PKEXCEPTION_FRAME ExceptionFrame
,
782 IN OUT PCONTEXT Context
790 ULONG_PTR BugCheckParameter1
,
791 ULONG_PTR BugCheckParameter2
,
792 ULONG_PTR BugCheckParameter3
,
793 ULONG_PTR BugCheckParameter4
,
803 KeFlushCurrentTb(VOID
);
807 KeInvalidateAllCaches(VOID
);
811 KeZeroPages(IN PVOID Address
,
816 KeInvalidAccessAllowed(IN PVOID TrapInformation OPTIONAL
);
820 KeRosDumpStackFrames(
828 IN PLARGE_INTEGER NewSystemTime
,
829 OUT PLARGE_INTEGER OldSystemTime
,
830 IN BOOLEAN FixInterruptTime
,
831 IN PLARGE_INTEGER HalTime
844 KiStartUnexpectedRange(
850 KiEndUnexpectedRange(
857 IN PEXCEPTION_RECORD ExceptionRecord
,
859 IN PKEXCEPTION_FRAME ExceptionFrame
,
860 IN PKTRAP_FRAME TrapFrame
,
861 IN BOOLEAN SearchFrames
868 IN PKEXCEPTION_FRAME ExceptionFrame
,
869 IN PKTRAP_FRAME TrapFrame
876 IN PKTRAP_FRAME TrapFrame
,
884 IN PKTRAP_FRAME TrapFrame
891 IN PKTRAP_FRAME TrapFrame
,
892 IN PKINTERRUPT Interrupt
899 IN PKTRAP_FRAME TrapFrame
,
900 IN PKINTERRUPT Interrupt
905 KiInitializeMachineType(
911 KiSetupStackAndInitializeKernel(
912 IN PKPROCESS InitProcess
,
913 IN PKTHREAD InitThread
,
917 IN PLOADER_PARAMETER_BLOCK LoaderBlock
944 IN KPRIORITY PriorityBoost
950 IN PVOID
*OutputBuffer
,
951 IN PULONG OutputLength
964 KiInitMachineDependent(VOID
);
968 KeFreezeExecution(IN PKTRAP_FRAME TrapFrame
,
969 IN PKEXCEPTION_FRAME ExceptionFrame
);
973 KeThawExecution(IN BOOLEAN Enable
);
977 KeAcquireQueuedSpinLockAtDpcLevel(
978 IN OUT PKSPIN_LOCK_QUEUE LockQueue
983 KeReleaseQueuedSpinLockFromDpcLevel(
984 IN OUT PKSPIN_LOCK_QUEUE LockQueue
989 KiRestoreProcessorControlState(
990 IN PKPROCESSOR_STATE ProcessorState
995 KiSaveProcessorControlState(
996 OUT PKPROCESSOR_STATE ProcessorState
1001 KiSaveProcessorState(
1002 IN PKTRAP_FRAME TrapFrame
,
1003 IN PKEXCEPTION_FRAME ExceptionFrame
1027 KiSystemFatalException(
1028 IN ULONG ExceptionCode
,
1029 IN PKTRAP_FRAME TrapFrame
1034 KiPcToFileHeader(IN PVOID Eip
,
1035 OUT PLDR_DATA_TABLE_ENTRY
*LdrEntry
,
1036 IN BOOLEAN DriversOnly
,
1037 OUT PBOOLEAN InKernel
);
1041 KiRosPcToUserFileHeader(IN PVOID Eip
,
1042 OUT PLDR_DATA_TABLE_ENTRY
*LdrEntry
);
1046 KeBugCheckUnicodeToAnsi(
1047 IN PUNICODE_STRING Unicode
,