diff --git a/reactos/ntoskrnl/ex/init.c b/reactos/ntoskrnl/ex/init.c index a99ac306958..04db2017e36 100644 --- a/reactos/ntoskrnl/ex/init.c +++ b/reactos/ntoskrnl/ex/init.c @@ -44,20 +44,14 @@ static ULONG MaxMem = 0; BOOLEAN SetupMode = TRUE; static BOOLEAN ForceAcpiDisable = FALSE; -#if defined (ALLOC_PRAGMA) -#pragma alloc_text(INIT, InitSystemSharedUserPage) -#pragma alloc_text(INIT, ExpDisplayNotice) -#pragma alloc_text(INIT, ExpLoadInitialProcess) -#pragma alloc_text(INIT, ExpInitializeExecutive) -#pragma alloc_text(INIT, ExInit2) -#endif - BOOLEAN NTAPI PspInitPhase0( VOID ); +ULONG ExpInitializationPhase; + /* FUNCTIONS ****************************************************************/ static @@ -482,10 +476,64 @@ ExInit3(VOID) ExpInitUuids(); } +BOOLEAN +NTAPI +ExpIsLoaderValid(IN PLOADER_PARAMETER_BLOCK LoaderBlock) +{ + PLOADER_PARAMETER_EXTENSION Extension; + + /* Get the loader extension */ + Extension = LoaderBlock->Extension; + + /* Validate the size (larger structures are OK, we'll just ignore them) */ + if (Extension->Size < sizeof(LOADER_PARAMETER_EXTENSION)) return FALSE; + + /* Don't validate upper versions */ + if (Extension->MajorVersion > 5) return TRUE; + + /* Fail if this is NT 4 */ + if (Extension->MajorVersion < 5) return FALSE; + + /* Fail if this is XP */ + if (Extension->MinorVersion < 2) return FALSE; + + /* This is 2003 or newer, aprove it */ + return TRUE; +} + VOID NTAPI -ExpInitializeExecutive(VOID) +ExpInitializeExecutive(IN ULONG Cpu, + IN PLOADER_PARAMETER_BLOCK LoaderBlock) { + /* Validate Loader */ + if (!ExpIsLoaderValid(LoaderBlock)) + { + /* Invalid loader version */ + KeBugCheckEx(MISMATCHED_HAL, + 3, + LoaderBlock->Extension->Size, + LoaderBlock->Extension->MajorVersion, + LoaderBlock->Extension->MinorVersion); + } + + /* Initialize PRCB pool lookaside pointers */ + ExInitPoolLookasidePointers(); + + /* Check if this is an application CPU */ + if (Cpu) + { + /* Then simply initialize it with HAL */ + if (!HalInitSystem(ExpInitializationPhase, LoaderBlock)) + { + /* Initialization failed */ + KEBUGCHECK(HAL_INITIALIZATION_FAILED); + } + + /* We're done */ + return; + } + /* Initialize HAL */ HalInitSystem (0, KeLoaderBlock); diff --git a/reactos/ntoskrnl/ex/lookas.c b/reactos/ntoskrnl/ex/lookas.c index 9958ef85170..e1749ca190d 100644 --- a/reactos/ntoskrnl/ex/lookas.c +++ b/reactos/ntoskrnl/ex/lookas.c @@ -24,9 +24,42 @@ LIST_ENTRY ExpNonPagedLookasideListHead; KSPIN_LOCK ExpNonPagedLookasideListLock; LIST_ENTRY ExpPagedLookasideListHead; KSPIN_LOCK ExpPagedLookasideListLock; +PNPAGED_LOOKASIDE_LIST ExpSmallNPagedPoolLookasideLists; +PPAGED_LOOKASIDE_LIST ExpSmallPagedPoolLookasideLists; /* FUNCTIONS *****************************************************************/ +VOID +NTAPI +ExInitPoolLookasidePointers(VOID) +{ + ULONG i; + PPP_LOOKASIDE_LIST Entry; + PNPAGED_LOOKASIDE_LIST ListEntry; + PPAGED_LOOKASIDE_LIST PagedListEntry; + + /* Loop for all CPUs */ + for (i = 0; i < MAXIMUM_PROCESSORS; i++) + { + /* Initialize the non-paged list */ + ListEntry = &ExpSmallNPagedPoolLookasideLists[i]; + InitializeSListHead(&ListEntry->L.ListHead); + + /* Bind to PRCB */ + Entry = &KeGetCurrentPrcb()->PPPagedLookasideList[i]; + Entry->L = &ListEntry->L; + Entry->P = &ListEntry->L; + + /* Initialize the paged list */ + PagedListEntry = &ExpSmallPagedPoolLookasideLists[i]; + InitializeSListHead(&PagedListEntry->L.ListHead); + + /* Bind to PRCB */ + Entry = &KeGetCurrentPrcb()->PPNPagedLookasideList[i]; + Entry->L = &PagedListEntry->L; + Entry->P = &PagedListEntry->L; + } +} VOID INIT_FUNCTION STDCALL diff --git a/reactos/ntoskrnl/include/internal/ex.h b/reactos/ntoskrnl/include/internal/ex.h index d8e3674fa55..96a060420f9 100644 --- a/reactos/ntoskrnl/include/internal/ex.h +++ b/reactos/ntoskrnl/include/internal/ex.h @@ -76,7 +76,10 @@ ExpInitUuids(VOID); VOID NTAPI -ExpInitializeExecutive(VOID); +ExpInitializeExecutive( + IN ULONG Cpu, + IN PLOADER_PARAMETER_BLOCK LoaderBlock +); VOID NTAPI @@ -110,6 +113,10 @@ VOID NTAPI ExpResourceInitialization(VOID); +VOID +NTAPI +ExInitPoolLookasidePointers(VOID); + /* Rundown Functions ********************************************************/ VOID diff --git a/reactos/ntoskrnl/include/internal/ntoskrnl.h b/reactos/ntoskrnl/include/internal/ntoskrnl.h index 73fcc44e483..f6e13e049d3 100644 --- a/reactos/ntoskrnl/include/internal/ntoskrnl.h +++ b/reactos/ntoskrnl/include/internal/ntoskrnl.h @@ -310,8 +310,8 @@ C_ASSERT(FIELD_OFFSET(KPROCESS, LdtDescriptor) == KPROCESS_LDT_DESCRIPTOR0); C_ASSERT(FIELD_OFFSET(KV86M_TRAP_FRAME, SavedExceptionStack) == TF_SAVED_EXCEPTION_STACK); C_ASSERT(FIELD_OFFSET(KV86M_TRAP_FRAME, regs) == TF_REGS); C_ASSERT(FIELD_OFFSET(KV86M_TRAP_FRAME, orig_ebp) == TF_ORIG_EBP); -C_ASSERT(FIELD_OFFSET(KPCR, Tib.ExceptionList) == KPCR_EXCEPTION_LIST); -C_ASSERT(FIELD_OFFSET(KPCR, Self) == KPCR_SELF); +//C_ASSERT(FIELD_OFFSET(KPCR, Tib.ExceptionList) == KPCR_EXCEPTION_LIST); +//C_ASSERT(FIELD_OFFSET(KPCR, Self) == KPCR_SELF); C_ASSERT(FIELD_OFFSET(KPCR, IRR) == KPCR_IRR); C_ASSERT(FIELD_OFFSET(KPCR, IDR) == KPCR_IDR); C_ASSERT(FIELD_OFFSET(KPCR, Irql) == KPCR_IRQL); diff --git a/reactos/ntoskrnl/ke/freeldr.c b/reactos/ntoskrnl/ke/freeldr.c index 8b47b5ad3d1..8f44100da9f 100644 --- a/reactos/ntoskrnl/ke/freeldr.c +++ b/reactos/ntoskrnl/ke/freeldr.c @@ -41,6 +41,7 @@ extern LDR_DATA_TABLE_ENTRY HalModuleObject; /* NT Loader Data */ LOADER_PARAMETER_BLOCK BldrLoaderBlock; +LOADER_PARAMETER_EXTENSION BldrExtensionBlock; CHAR BldrCommandLine[256]; LDR_DATA_TABLE_ENTRY BldrModules[64]; MEMORY_ALLOCATION_DESCRIPTOR BldrMemoryDescriptors[64]; @@ -241,6 +242,12 @@ KiRosFrldrLpbToNtLpb(IN PROS_LOADER_PARAMETER_BLOCK RosLoaderBlock, /* Setup command line */ LoaderBlock->LoadOptions = BldrCommandLine; strcpy(BldrCommandLine, KeLoaderCommandLine); + + /* Setup the extension block */ + LoaderBlock->Extension = &BldrExtensionBlock; + LoaderBlock->Extension->Size = sizeof(LOADER_PARAMETER_EXTENSION); + LoaderBlock->Extension->MajorVersion = 5; + LoaderBlock->Extension->MinorVersion = 2; } VOID diff --git a/reactos/ntoskrnl/ke/i386/kiinit.c b/reactos/ntoskrnl/ke/i386/kiinit.c index c81368c333d..dba13f77e54 100644 --- a/reactos/ntoskrnl/ke/i386/kiinit.c +++ b/reactos/ntoskrnl/ke/i386/kiinit.c @@ -189,7 +189,7 @@ KiInitializeKernel(IN PKPROCESS InitProcess, Prcb->IdleThread = InitThread; /* Initialize the Kernel Executive */ - ExpInitializeExecutive(); + ExpInitializeExecutive(Number, LoaderBlock); /* Only do this on the boot CPU */ if (!Number)