[NTOS:KE/x64] Improve KiInitializePcr

This commit is contained in:
Timo Kreuzer 2023-12-02 16:48:10 +02:00
parent d2a3b1c791
commit 8c466c3e36
2 changed files with 33 additions and 31 deletions

View file

@ -474,13 +474,6 @@ KiSetTrapContext(
_In_ PCONTEXT Context, _In_ PCONTEXT Context,
_In_ KPROCESSOR_MODE RequestorMode); _In_ KPROCESSOR_MODE RequestorMode);
VOID
NTAPI
KiInitializePcr(IN PKIPCR Pcr,
IN ULONG ProcessorNumber,
IN PKTHREAD IdleThread,
IN PVOID DpcStack);
#ifdef __cplusplus #ifdef __cplusplus
} // extern "C" } // extern "C"
#endif #endif

View file

@ -87,17 +87,17 @@ KiInitMachineDependent(VOID)
} }
static
VOID VOID
NTAPI KiInitializePcr(
KiInitializePcr(IN PKIPCR Pcr, _Out_ PKIPCR Pcr,
IN ULONG ProcessorNumber, _In_ ULONG ProcessorNumber,
IN PKTHREAD IdleThread, _In_ PKGDTENTRY64 GdtBase,
IN PVOID DpcStack) _In_ PKIDTENTRY64 IdtBase,
_In_ PKTSS64 TssBase,
_In_ PKTHREAD IdleThread,
_In_ PVOID DpcStack)
{ {
KDESCRIPTOR GdtDescriptor = {{0},0,0}, IdtDescriptor = {{0},0,0};
PKGDTENTRY64 TssEntry;
USHORT Tr = 0;
/* Zero out the PCR */ /* Zero out the PCR */
RtlZeroMemory(Pcr, sizeof(KIPCR)); RtlZeroMemory(Pcr, sizeof(KIPCR));
@ -126,21 +126,12 @@ KiInitializePcr(IN PKIPCR Pcr,
Pcr->Prcb.Number = (UCHAR)ProcessorNumber; Pcr->Prcb.Number = (UCHAR)ProcessorNumber;
Pcr->Prcb.SetMember = 1ULL << ProcessorNumber; Pcr->Prcb.SetMember = 1ULL << ProcessorNumber;
/* Get GDT and IDT descriptors */ /* Set GDT and IDT base */
__sgdt(&GdtDescriptor.Limit); Pcr->GdtBase = GdtBase;
__sidt(&IdtDescriptor.Limit); Pcr->IdtBase = IdtBase;
Pcr->GdtBase = (PVOID)GdtDescriptor.Base;
Pcr->IdtBase = (PKIDTENTRY)IdtDescriptor.Base;
/* Get TSS Selector */ /* Set TssBase */
__str(&Tr); Pcr->TssBase = TssBase;
ASSERT(Tr == KGDT64_SYS_TSS);
/* Get TSS Entry */
TssEntry = KiGetGdtEntry(Pcr->GdtBase, Tr);
/* Get the KTSS itself */
Pcr->TssBase = KiGetGdtDescriptorBase(TssEntry);
Pcr->Prcb.RspBase = Pcr->TssBase->Rsp0; // FIXME Pcr->Prcb.RspBase = Pcr->TssBase->Rsp0; // FIXME
@ -285,14 +276,32 @@ VOID
KiInitializeP0BootStructures( KiInitializeP0BootStructures(
_Inout_ PLOADER_PARAMETER_BLOCK LoaderBlock) _Inout_ PLOADER_PARAMETER_BLOCK LoaderBlock)
{ {
KDESCRIPTOR GdtDescriptor = {{0},0,0}, IdtDescriptor = {{0},0,0};
PKGDTENTRY64 TssEntry;
PKTSS64 TssBase;
/* Set the initial stack, idle thread and process for processor 0 */ /* Set the initial stack, idle thread and process for processor 0 */
LoaderBlock->KernelStack = (ULONG_PTR)KiP0BootStack; LoaderBlock->KernelStack = (ULONG_PTR)KiP0BootStack;
LoaderBlock->Thread = (ULONG_PTR)&KiInitialThread; LoaderBlock->Thread = (ULONG_PTR)&KiInitialThread;
LoaderBlock->Process = (ULONG_PTR)&KiInitialProcess.Pcb; LoaderBlock->Process = (ULONG_PTR)&KiInitialProcess.Pcb;
LoaderBlock->Prcb = (ULONG_PTR)&KiInitialPcr.Prcb; LoaderBlock->Prcb = (ULONG_PTR)&KiInitialPcr.Prcb;
/* Get GDT and IDT descriptors */
__sgdt(&GdtDescriptor.Limit);
__sidt(&IdtDescriptor.Limit);
/* Get the boot TSS from the GDT */
TssEntry = KiGetGdtEntry(GdtDescriptor.Base, KGDT64_SYS_TSS);
TssBase = KiGetGdtDescriptorBase(TssEntry);
/* Initialize the PCR */ /* Initialize the PCR */
KiInitializePcr(&KiInitialPcr, 0, &KiInitialThread.Tcb, KiP0DoubleFaultStack); KiInitializePcr(&KiInitialPcr,
0,
GdtDescriptor.Base,
IdtDescriptor.Base,
TssBase,
&KiInitialThread.Tcb,
KiP0DoubleFaultStack);
/* Setup the TSS descriptors and entries */ /* Setup the TSS descriptors and entries */
KiInitializeTss(&KiInitialPcr, KiInitializeTss(&KiInitialPcr,