LIST_ENTRY ListEntry;
} KPROFILE_SOURCE_OBJECT, *PKPROFILE_SOURCE_OBJECT;
-/* Cached modules from the loader block */
-typedef enum _CACHED_MODULE_TYPE
-{
- AnsiCodepage,
- OemCodepage,
- UnicodeCasemap,
- SystemRegistry,
- HardwareRegistry,
- MaximumCachedModuleType,
-} CACHED_MODULE_TYPE, *PCACHED_MODULE_TYPE;
-extern PLOADER_MODULE CachedModules[MaximumCachedModuleType];
-
typedef enum _CONNECT_TYPE
{
NoConnect,
PKINTERRUPT_ROUTINE *FlatDispatch;
} DISPATCH_INFO, *PDISPATCH_INFO;
+typedef struct _KI_SAMPLE_MAP
+{
+ LARGE_INTEGER PerfStart;
+ LARGE_INTEGER PerfEnd;
+ LONGLONG PerfDelta;
+ LARGE_INTEGER PerfFreq;
+ LONGLONG TSCStart;
+ LONGLONG TSCEnd;
+ LONGLONG TSCDelta;
+ ULONG MHz;
+} KI_SAMPLE_MAP, *PKI_SAMPLE_MAP;
+
typedef struct _KTIMER_TABLE_ENTRY
{
LIST_ENTRY Entry;
ULARGE_INTEGER Time;
} KTIMER_TABLE_ENTRY, *PKTIMER_TABLE_ENTRY;
+#define MAX_TIMER_DPCS 16
+
+typedef struct _DPC_QUEUE_ENTRY
+{
+ PKDPC Dpc;
+ PKDEFERRED_ROUTINE Routine;
+ PVOID Context;
+} DPC_QUEUE_ENTRY, *PDPC_QUEUE_ENTRY;
+
typedef PCHAR
(NTAPI *PKE_BUGCHECK_UNICODE_TO_ANSI)(
IN PUNICODE_STRING Unicode,
IN ULONG Length
);
-struct _KIRQ_TRAPFRAME;
-struct _KPCR;
-struct _KPRCB;
-struct _KEXCEPTION_FRAME;
+extern ULONG_PTR MmFreeLdrFirstKrnlPhysAddr;
+extern ULONG_PTR MmFreeLdrLastKrnlPhysAddr;
+extern ULONG_PTR MmFreeLdrLastKernelAddress;
extern PVOID KeUserApcDispatcher;
extern PVOID KeUserCallbackDispatcher;
extern PVOID KeUserExceptionDispatcher;
extern PVOID KeRaiseUserExceptionDispatcher;
-extern LARGE_INTEGER SystemBootTime;
-extern ULONG_PTR KERNEL_BASE;
+extern LARGE_INTEGER KeBootTime;
+extern ULONGLONG KeBootTimeBias;
+extern BOOLEAN ExCmosClockIsSane;
extern ULONG KeI386NpxPresent;
extern ULONG KeI386XMMIPresent;
extern ULONG KeI386FxsrPresent;
+extern ULONG KiMXCsrMask;
extern ULONG KeI386CpuType;
extern ULONG KeI386CpuStep;
extern ULONG KeProcessorArchitecture;
extern ULONG KeProcessorRevision;
extern ULONG KeFeatureBits;
extern ULONG Ke386GlobalPagesEnabled;
+extern BOOLEAN KiI386PentiumLockErrataPresent;
extern KNODE KiNode0;
extern PKNODE KeNodeBlock[1];
extern UCHAR KeNumberNodes;
extern PULONG KiInterruptTemplateDispatch;
extern PULONG KiInterruptTemplate2ndDispatch;
extern ULONG KiUnexpectedEntrySize;
+#if defined(_M_IX86) || defined(_M_AMD64)
extern PVOID Ki386IopmSaveArea;
extern ULONG KeI386EFlagsAndMaskV86;
extern ULONG KeI386EFlagsOrMaskV86;
extern KDESCRIPTOR KiGdtDescriptor;
extern KDESCRIPTOR KiIdtDescriptor;
extern KTSS KiBootTss;
+#endif
extern UCHAR P0BootStack[];
extern UCHAR KiDoubleFaultStack[];
-extern FAST_MUTEX KernelAddressSpaceLock;
+extern EX_PUSH_LOCK KernelAddressSpaceLock;
extern ULONG KiMaximumDpcQueueDepth;
extern ULONG KiMinimumDpcRate;
extern ULONG KiAdjustDpcThreshold;
extern ULONG KiIdealDpcRate;
+extern BOOLEAN KeThreadDpcEnable;
extern LARGE_INTEGER KiTimeIncrementReciprocal;
extern UCHAR KiTimeIncrementShiftCount;
-extern LIST_ENTRY BugcheckCallbackListHead, BugcheckReasonCallbackListHead;
+extern ULONG KiTimeLimitIsrMicroseconds;
+extern ULONG KiServiceLimit;
+extern LIST_ENTRY KeBugcheckCallbackListHead, KeBugcheckReasonCallbackListHead;
extern KSPIN_LOCK BugCheckCallbackLock;
-extern KDPC KiExpireTimerDpc;
+extern KDPC KiTimerExpireDpc;
extern KTIMER_TABLE_ENTRY KiTimerTableListHead[TIMER_TABLE_SIZE];
-extern LIST_ENTRY KiTimerListHead;
-extern KMUTEX KiGenericCallDpcMutex;
+extern FAST_MUTEX KiGenericCallDpcMutex;
extern LIST_ENTRY KiProfileListHead, KiProfileSourceListHead;
extern KSPIN_LOCK KiProfileLock;
extern LIST_ENTRY KiProcessListHead;
extern PKPRCB KiProcessorBlock[];
extern ULONG KiMask32Array[MAXIMUM_PRIORITY];
extern ULONG KiIdleSummary;
-extern VOID KiTrap8(VOID);
-extern VOID KiTrap2(VOID);
+extern VOID __cdecl KiTrap19(VOID);
+extern VOID __cdecl KiTrap8(VOID);
+extern VOID __cdecl KiTrap2(VOID);
+extern VOID __cdecl KiFastCallEntry(VOID);
+extern PVOID KeUserApcDispatcher;
+extern PVOID KeUserCallbackDispatcher;
+extern PVOID KeUserExceptionDispatcher;
+extern PVOID KeRaiseUserExceptionDispatcher;
+extern UCHAR KiDebugRegisterTrapOffsets[9];
+extern UCHAR KiDebugRegisterContextOffsets[9];
+extern ULONG KeTimeIncrement;
+extern ULONG_PTR KiBugCheckData[5];
+extern ULONG KiFreezeFlag;
+extern ULONG KiDPCTimeout;
/* MACROS *************************************************************************/
InitializeListHead(&((Header)->WaitListHead)); \
}
-#define KEBUGCHECKWITHTF(a,b,c,d,e,f) \
- DbgPrint("KeBugCheckWithTf at %s:%i\n",__FILE__,__LINE__), \
- KeBugCheckWithTf(a,b,c,d,e,f)
-
/* Tells us if the Timer or Event is a Syncronization or Notification Object */
#define TIMER_OR_EVENT_TYPE 0x7L
/* INTERNAL KERNEL FUNCTIONS ************************************************/
-/* Readies a Thread for Execution. */
-BOOLEAN
-NTAPI
-KiDispatchThreadNoLock(ULONG NewThreadStatus);
-
-/* Readies a Thread for Execution. */
-VOID
-NTAPI
-KiDispatchThread(ULONG NewThreadStatus);
-
/* Finds a new thread to run */
-NTSTATUS
+LONG_PTR
FASTCALL
KiSwapThread(
IN PKTHREAD Thread,
IN PKPRCB Prcb
);
+VOID
+NTAPI
+KeReadyThread(
+ IN PKTHREAD Thread
+);
+
+BOOLEAN
+NTAPI
+KeSetDisableBoostThread(
+ IN OUT PKTHREAD Thread,
+ IN BOOLEAN Disable
+);
+
+VOID
+NTAPI
+KeBalanceSetManager(IN PVOID Context);
+
VOID
NTAPI
KiReadyThread(IN PKTHREAD Thread);
-NTSTATUS
+ULONG
NTAPI
KeSuspendThread(PKTHREAD Thread);
+BOOLEAN
+NTAPI
+KeReadStateThread(IN PKTHREAD Thread);
+
BOOLEAN
FASTCALL
KiSwapContext(
NTAPI
KiDeferredReadyThread(IN PKTHREAD Thread);
+PKTHREAD
+FASTCALL
+KiIdleSchedule(
+ IN PKPRCB Prcb
+);
+
+VOID
+FASTCALL
+KiProcessDeferredReadyList(
+ IN PKPRCB Prcb
+);
+
KAFFINITY
-NTAPI
+FASTCALL
KiSetAffinityThread(
IN PKTHREAD Thread,
- IN KAFFINITY Affinity,
- IN PBOOLEAN Released // hack
+ IN KAFFINITY Affinity
);
PKTHREAD
-NTAPI
+FASTCALL
KiSelectNextThread(
IN PKPRCB Prcb
);
+VOID
+NTAPI
+CPUID(
+ OUT ULONG CpuInfo[4],
+ IN ULONG InfoType
+);
+
+BOOLEAN
+FASTCALL
+KiInsertTimerTable(
+ IN PKTIMER Timer,
+ IN ULONG Hand
+);
+
+VOID
+FASTCALL
+KiTimerListExpire(
+ IN PLIST_ENTRY ExpiredListHead,
+ IN KIRQL OldIrql
+);
+
+BOOLEAN
+FASTCALL
+KiInsertTreeTimer(
+ IN PKTIMER Timer,
+ IN LARGE_INTEGER Interval
+);
+
+VOID
+FASTCALL
+KiCompleteTimer(
+ IN PKTIMER Timer,
+ IN PKSPIN_LOCK_QUEUE LockQueue
+);
+
/* gmutex.c ********************************************************************/
VOID
/* ipi.c ********************************************************************/
VOID
-NTAPI
-KiIpiSendRequest(
+FASTCALL
+KiIpiSend(
KAFFINITY TargetSet,
ULONG IpiRequest
);
+VOID
+NTAPI
+KiIpiSendPacket(
+ IN KAFFINITY TargetProcessors,
+ IN PKIPI_WORKER WorkerFunction,
+ IN PKIPI_BROADCAST_WORKER BroadcastFunction,
+ IN ULONG_PTR Context,
+ IN PULONG Count
+);
+
+VOID
+FASTCALL
+KiIpiSignalPacketDone(
+ IN PKIPI_CONTEXT PacketContext
+);
+
+VOID
+FASTCALL
+KiIpiSignalPacketDoneAndStall(
+ IN PKIPI_CONTEXT PacketContext,
+ IN volatile PULONG ReverseStall
+);
+
/* next file ***************************************************************/
UCHAR
IN ULONG Set
);
-VOID
+VOID
NTAPI
DbgBreakPointNoBugCheck(VOID);
IN KPROFILE_SOURCE Source
);
-BOOLEAN
-NTAPI
-KiRosPrintAddress(PVOID Address);
-
VOID
NTAPI
KeUpdateRunTime(
KeQueryBasePriorityThread(IN PKTHREAD Thread);
VOID
-NTAPI
+FASTCALL
KiSetPriorityThread(
IN PKTHREAD Thread,
- IN KPRIORITY Priority,
- IN PBOOLEAN Released // hack
-);
-
-BOOLEAN
-NTAPI
-KiDispatcherObjectWake(
- DISPATCHER_HEADER* hdr,
- KPRIORITY increment
+ IN KPRIORITY Priority
);
VOID
-NTAPI
-KeExpireTimers(
- PKDPC Apc,
- PVOID Arg1,
- PVOID Arg2,
- PVOID Arg3
+FASTCALL
+KiUnlinkThread(
+ IN PKTHREAD Thread,
+ IN NTSTATUS WaitStatus
);
VOID
VOID
FASTCALL
-KiAbortWaitThread(
+KiUnwaitThread(
IN PKTHREAD Thread,
- IN NTSTATUS WaitStatus,
+ IN LONG_PTR WaitStatus,
IN KPRIORITY Increment
);
struct _KPROCESS *Process,
KPRIORITY Priority,
KAFFINITY Affinity,
- PLARGE_INTEGER DirectoryTableBase,
+ PULONG DirectoryTableBase,
IN BOOLEAN Enable
);
NTAPI
KeForceResumeThread(IN PKTHREAD Thread);
-BOOLEAN
+VOID
NTAPI
-KeDisableThreadApcQueueing(IN PKTHREAD Thread);
+KeThawAllThreads(
+ VOID
+);
-BOOLEAN
+VOID
NTAPI
-KiInsertTimer(
- PKTIMER Timer,
- LARGE_INTEGER DueTime
+KeFreezeAllThreads(
+ VOID
);
+BOOLEAN
+NTAPI
+KeDisableThreadApcQueueing(IN PKTHREAD Thread);
+
VOID
FASTCALL
KiWaitTest(
KPRIORITY Increment
);
-PULONG
-NTAPI
-KeGetStackTopThread(struct _ETHREAD* Thread);
-
VOID
NTAPI
KeContextToTrapFrame(
BOOLEAN Head
);
+VOID
+NTAPI
+KiTimerExpiration(
+ IN PKDPC Dpc,
+ IN PVOID DeferredContext,
+ IN PVOID SystemArgument1,
+ IN PVOID SystemArgument2
+);
+
+ULONG
+NTAPI
+KiComputeTimerTableIndex(
+ IN LONGLONG TimeValue
+);
+
ULONG
NTAPI
KeSetProcess(
VOID
FASTCALL
-KiWakeQueue(IN PKQUEUE Queue);
-
-/* INITIALIZATION FUNCTIONS *************************************************/
+KiActivateWaiterQueue(IN PKQUEUE Queue);
-VOID
+ULONG
NTAPI
-KeInitExceptions(VOID);
+KeQueryRuntimeProcess(IN PKPROCESS Process,
+ OUT PULONG UserTime);
-VOID
-NTAPI
-KeInitInterrupts(VOID);
+/* INITIALIZATION FUNCTIONS *************************************************/
-VOID
+BOOLEAN
NTAPI
-KeInitTimer(VOID);
+KeInitSystem(VOID);
VOID
NTAPI
-KeInitDispatcher(VOID);
+KeInitExceptions(VOID);
VOID
NTAPI
-KiInitializeSystemClock(VOID);
+KeInitInterrupts(VOID);
VOID
NTAPI
VOID
NTAPI
-Phase1Initialization(PVOID Context);
-
-VOID
-NTAPI
-KiSystemStartup(
- IN PROS_LOADER_PARAMETER_BLOCK LoaderBlock
+KiSystemStartupReal(
+ IN PLOADER_PARAMETER_BLOCK LoaderBlock
);
-VOID
-NTAPI
-KeInit2(VOID);
-
BOOLEAN
NTAPI
KiDeliverUserApc(PKTRAP_FRAME TrapFrame);
VOID
NTAPI
-KeApplicationProcessorInit(VOID);
-
-VOID
-NTAPI
-KePrepareForApplicationProcessorInit(ULONG id);
-
-ULONG
-NTAPI
-KiUserTrapHandler(
- PKTRAP_FRAME Tf,
- ULONG ExceptionNr,
- PVOID Cr2
+KeBugCheckWithTf(
+ ULONG BugCheckCode,
+ ULONG_PTR BugCheckParameter1,
+ ULONG_PTR BugCheckParameter2,
+ ULONG_PTR BugCheckParameter3,
+ ULONG_PTR BugCheckParameter4,
+ PKTRAP_FRAME Tf
);
VOID
NTAPI
-KePushAndStackSwitchAndSysRet(
- ULONG Push,
- PVOID NewStack
-);
+KeFlushCurrentTb(VOID);
-VOID
+BOOLEAN
NTAPI
-KeStackSwitchAndRet(PVOID NewStack);
+KeInvalidateAllCaches(VOID);
VOID
-NTAPI
-KeBugCheckWithTf(
- ULONG BugCheckCode,
- ULONG BugCheckParameter1,
- ULONG BugCheckParameter2,
- ULONG BugCheckParameter3,
- ULONG BugCheckParameter4,
- PKTRAP_FRAME Tf
-);
+FASTCALL
+KeZeroPages(IN PVOID Address,
+ IN ULONG Size);
-VOID
-NTAPI
-KeFlushCurrentTb(VOID);
+BOOLEAN
+FASTCALL
+KeInvalidAccessAllowed(IN PVOID TrapInformation OPTIONAL);
VOID
NTAPI
KeRosDumpStackFrames(
- PULONG Frame,
+ PULONG_PTR Frame,
ULONG FrameCount
);
VOID
NTAPI
-KiSetSystemTime(PLARGE_INTEGER NewSystemTime);
+KeSetSystemTime(
+ IN PLARGE_INTEGER NewSystemTime,
+ OUT PLARGE_INTEGER OldSystemTime,
+ IN BOOLEAN FixInterruptTime,
+ IN PLARGE_INTEGER HalTime
+);
ULONG
NTAPI
VOID
);
+VOID
+NTAPI
+KiInitializeMachineType(
+ VOID
+);
+
+//
+// We need to do major portability work
+//
+#ifdef _M_IX86
VOID
NTAPI
KiFlushNPXState(
IN FLOATING_SAVE_AREA *SaveArea
);
+#endif
+
+VOID
+NTAPI
+KiSetupStackAndInitializeKernel(
+ IN PKPROCESS InitProcess,
+ IN PKTHREAD InitThread,
+ IN PVOID IdleStack,
+ IN PKPRCB Prcb,
+ IN CCHAR Number,
+ IN PLOADER_PARAMETER_BLOCK LoaderBlock
+);
VOID
NTAPI
IN KPRIORITY PriorityBoost
);
+NTSTATUS
+NTAPI
+KiCallUserMode(
+ IN PVOID *OutputBuffer,
+ IN PULONG OutputLength
+);
+
+PULONG
+NTAPI
+KiGetUserModeStackAddress(
+ VOID
+);
+
+ULONG_PTR
+NTAPI
+Ki386EnableGlobalPage(IN volatile ULONG_PTR Context);
+
+VOID
+NTAPI
+KiInitializePAT(VOID);
+
+VOID
+NTAPI
+KiInitializeMTRR(IN BOOLEAN FinalCpu);
+
+VOID
+NTAPI
+KiAmdK6InitializeMTRR(VOID);
+
+VOID
+NTAPI
+KiRestoreFastSyscallReturnState(VOID);
+
+ULONG_PTR
+NTAPI
+Ki386EnableDE(IN ULONG_PTR Context);
+
+ULONG_PTR
+NTAPI
+Ki386EnableFxsr(IN ULONG_PTR Context);
+
+ULONG_PTR
+NTAPI
+Ki386EnableXMMIExceptions(IN ULONG_PTR Context);
+
+VOID
+NTAPI
+KiInitMachineDependent(VOID);
+
+VOID
+NTAPI
+KiI386PentiumLockErrataFixup(VOID);
+
+VOID
+WRMSR(
+ IN ULONG Register,
+ IN LONGLONG Value
+);
+
+BOOLEAN
+NTAPI
+KeFreezeExecution(IN PKTRAP_FRAME TrapFrame,
+ IN PKEXCEPTION_FRAME ExceptionFrame);
+
+VOID
+NTAPI
+KeThawExecution(IN BOOLEAN Enable);
+
+BOOLEAN
+NTAPI
+KeDisableInterrupts(
+ VOID
+);
+
+VOID
+FASTCALL
+KeAcquireQueuedSpinLockAtDpcLevel(
+ IN OUT PKSPIN_LOCK_QUEUE LockQueue
+);
+
+VOID
+FASTCALL
+KeReleaseQueuedSpinLockFromDpcLevel(
+ IN OUT PKSPIN_LOCK_QUEUE LockQueue
+);
+
+VOID
+NTAPI
+KiRestoreProcessorControlState(
+ IN PKPROCESSOR_STATE ProcessorState
+);
+
+VOID
+NTAPI
+KiSaveProcessorControlState(
+ OUT PKPROCESSOR_STATE ProcessorState
+);
+
+VOID
+FASTCALL
+KiRetireDpcList(
+ IN PKPRCB Prcb
+);
+
+VOID
+NTAPI
+KiQuantumEnd(
+ VOID
+);
+
+VOID
+KiSystemService(
+ IN PKTHREAD Thread,
+ IN PKTRAP_FRAME TrapFrame,
+ IN ULONG Instruction
+);
+
+VOID
+KiIdleLoop(
+ VOID
+);
+
+PVOID
+NTAPI
+KiPcToFileHeader(IN PVOID Eip,
+ OUT PLDR_DATA_TABLE_ENTRY *LdrEntry,
+ IN BOOLEAN DriversOnly,
+ OUT PBOOLEAN InKernel);
+
+PVOID
+NTAPI
+KiRosPcToUserFileHeader(IN PVOID Eip,
+ OUT PLDR_DATA_TABLE_ENTRY *LdrEntry);
+
#include "ke_x.h"
#endif /* __NTOSKRNL_INCLUDE_INTERNAL_KE_H */