diff --git a/reactos/ntoskrnl/ex/init.c b/reactos/ntoskrnl/ex/init.c index 4f07213eddd..a3091c14890 100644 --- a/reactos/ntoskrnl/ex/init.c +++ b/reactos/ntoskrnl/ex/init.c @@ -22,7 +22,8 @@ ULONG NtMajorVersion = 5; ULONG NtMinorVersion = 0; ULONG NtOSCSDVersion = BUILD_OSCSDVERSION(4, 0); ULONG NtBuildNumber = KERNEL_VERSION_BUILD; -ULONG NtGlobalFlag = 0; +ULONG NtGlobalFlag; +ULONG ExSuiteMask; extern ULONG MmCoreDumpType; extern LOADER_MODULE KeLoaderModules[64]; @@ -36,6 +37,9 @@ BOOLEAN ExpInTextModeSetup; BOOLEAN IoRemoteBootClient; ULONG InitSafeBootMode; +/* NT Boot Path */ +UNICODE_STRING NtSystemRoot; + /* Boot NLS information */ PVOID ExpNlsTableBase; ULONG ExpAnsiCodePageDataOffset, ExpOemCodePageDataOffset; @@ -348,14 +352,6 @@ ExpLoadInitialProcess(PHANDLE ProcessHandle, return STATUS_SUCCESS; } -VOID -NTAPI -ExInit2(VOID) -{ - ExpInitLookasideLists(); - ExpInitializeHandleTables(); -} - VOID NTAPI ExInit3(VOID) @@ -371,6 +367,61 @@ ExInit3(VOID) ExpInitUuids(); } +BOOLEAN +NTAPI +ExpInitSystemPhase0(VOID) +{ + /* Initialize EXRESOURCE Support */ + ExpResourceInitialization(); + + /* Initialize the environment lock */ + ExInitializeFastMutex(&ExpEnvironmentLock); + + /* Initialize the lookaside lists and locks */ + ExpInitLookasideLists(); + + /* Initialize the Firmware Table resource and listhead */ + InitializeListHead(&ExpFirmwareTableProviderListHead); + ExInitializeResourceLite(&ExpFirmwareTableResource); + + /* Set the suite mask to maximum and return */ + ExSuiteMask = 0xFFFFFFFF; + return TRUE; +} + +BOOLEAN +NTAPI +ExpInitSystemPhase1(VOID) +{ + /* Not yet done */ + return FALSE; +} + +BOOLEAN +NTAPI +ExInitSystem(VOID) +{ + /* Check the initialization phase */ + switch (ExpInitializationPhase) + { + case 0: + + /* Do Phase 0 */ + return ExpInitSystemPhase0(); + + case 1: + + /* Do Phase 1 */ + return ExpInitSystemPhase1(); + + default: + + /* Don't know any other phase! Bugcheck! */ + KeBugCheck(UNEXPECTED_INITIALIZATION_CALL); + return FALSE; + } +} + BOOLEAN NTAPI ExpIsLoaderValid(IN PLOADER_PARAMETER_BLOCK LoaderBlock) @@ -402,6 +453,9 @@ ExpInitializeExecutive(IN ULONG Cpu, IN PLOADER_PARAMETER_BLOCK LoaderBlock) { PNLS_DATA_BLOCK NlsData; + CHAR Buffer[256]; + ANSI_STRING AnsiPath; + NTSTATUS Status; /* FIXME: Deprecate soon */ ParseAndCacheLoadedModules(); @@ -487,6 +541,31 @@ ExpInitializeExecutive(IN ULONG Cpu, /* Make sure interrupts are active now */ _enable(); + /* Clear the crypto exponent */ + SharedUserData->CryptoExponent = 0; + + /* Set global flags for the checked build */ +#if DBG + NtGlobalFlag |= FLG_ENABLE_CLOSE_EXCEPTIONS | + FLG_ENABLE_KDEBUG_SYMBOL_LOAD; +#endif + + /* Setup NT System Root Path */ + sprintf(Buffer, "C:%s", LoaderBlock->NtBootPathName); + + /* Convert to ANSI_STRING and null-terminate it */ + RtlInitString(&AnsiPath, Buffer ); + Buffer[--AnsiPath.Length] = UNICODE_NULL; + + /* Get the string from KUSER_SHARED_DATA's buffer */ + NtSystemRoot.Buffer = SharedUserData->NtSystemRoot; + NtSystemRoot.MaximumLength = sizeof(SharedUserData->NtSystemRoot) / sizeof(WCHAR); + NtSystemRoot.Length = 0; + + /* Now fill it in */ + Status = RtlAnsiStringToUnicodeString(&NtSystemRoot, &AnsiPath, FALSE); + if (!NT_SUCCESS(Status)) KEBUGCHECK(SESSION3_INITIALIZATION_FAILED); + /* Setup bugcheck messages */ KiInitializeBugCheck(); @@ -496,14 +575,14 @@ ExpInitializeExecutive(IN ULONG Cpu, /* Initialize the second stage of the kernel */ KeInit2(); - /* Initialize resources */ - ExpResourceInitialization(); + /* Initialize the executive at phase 0 */ + if (!ExInitSystem()) KEBUGCHECK(PHASE0_INITIALIZATION_FAILED); /* Load basic Security for other Managers */ if (!SeInit1()) KEBUGCHECK(SECURITY_INITIALIZATION_FAILED); - /* Initialize Lookaside Lists and Handle Table */ - ExInit2(); + /* Initialize the Handle Table */ + ExpInitializeHandleTables(); /* Create the Basic Object Manager Types to allow new Object Types */ ObInit(); diff --git a/reactos/ntoskrnl/ex/lookas.c b/reactos/ntoskrnl/ex/lookas.c index 32654a521eb..4619ce58768 100644 --- a/reactos/ntoskrnl/ex/lookas.c +++ b/reactos/ntoskrnl/ex/lookas.c @@ -1,18 +1,16 @@ /* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * FILE: ntoskrnl/ex/lookas.c - * PURPOSE: Lookaside lists - * PROGRAMMERS: Alex Ionescu (alex@relsoft.net) - * David Welch (welch@mcmail.com) - * Casper S. Hornstrup (chorns@users.sourceforge.net) - */ +* PROJECT: ReactOS Kernel +* LICENSE: GPL - See COPYING in the top level directory +* FILE: ntoskrnl/ex/lookas.c +* PURPOSE: Lookaside Lists +* PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) +*/ -/* INCLUDES *****************************************************************/ +/* INCLUDES ******************************************************************/ #include #define NDEBUG -#include +#include #if defined (ALLOC_PRAGMA) #pragma alloc_text(INIT, ExpInitLookasideLists) @@ -24,10 +22,41 @@ LIST_ENTRY ExpNonPagedLookasideListHead; KSPIN_LOCK ExpNonPagedLookasideListLock; LIST_ENTRY ExpPagedLookasideListHead; KSPIN_LOCK ExpPagedLookasideListLock; +LIST_ENTRY ExSystemLookasideListHead; +LIST_ENTRY ExPoolLookasideListHead; NPAGED_LOOKASIDE_LIST ExpSmallNPagedPoolLookasideLists[MAXIMUM_PROCESSORS]; PAGED_LOOKASIDE_LIST ExpSmallPagedPoolLookasideLists[MAXIMUM_PROCESSORS]; -/* FUNCTIONS *****************************************************************/ +/* PRIVATE FUNCTIONS *********************************************************/ + +VOID +NTAPI +ExInitializeSystemLookasideList(IN PGENERAL_LOOKASIDE List, + IN POOL_TYPE Type, + IN ULONG Size, + IN ULONG Tag, + IN USHORT MaximumDepth, + IN PLIST_ENTRY ListHead) +{ + /* Initialize the list */ + List->Tag = Tag; + List->Type = Type; + List->Size = Size; + InsertHeadList(ListHead, &List->ListEntry); + List->MaximumDepth = MaximumDepth; + List->Depth = 2; + List->Allocate = ExAllocatePoolWithTag; + List->Free = ExFreePool; + List->ListHead.Next.Next = NULL; + List->ListHead.Depth = 0; + List->ListHead.Sequence = 0; + List->TotalAllocates = 0; + List->AllocateHits = 0; + List->TotalFrees = 0; + List->FreeHits = 0; + List->LastTotalAllocates = 0; + List->LastAllocateHits = 0; +} VOID NTAPI @@ -60,23 +89,49 @@ ExInitPoolLookasidePointers(VOID) Entry->P = &PagedListEntry->L; } } + VOID -INIT_FUNCTION -STDCALL +NTAPI ExpInitLookasideLists() { - /* Initialize Lock and Listhead */ + ULONG i, j; + + /* Initialize locks and lists */ InitializeListHead(&ExpNonPagedLookasideListHead); - KeInitializeSpinLock(&ExpNonPagedLookasideListLock); InitializeListHead(&ExpPagedLookasideListHead); + InitializeListHead(&ExSystemLookasideListHead); + InitializeListHead(&ExPoolLookasideListHead); + KeInitializeSpinLock(&ExpNonPagedLookasideListLock); KeInitializeSpinLock(&ExpPagedLookasideListLock); + + /* Initialize the system lookaside lists */ + for (i = 0, j = 1; i < (MAXIMUM_PROCESSORS - 1); j++, i++) + { + /* Initialize the non-paged list */ + ExInitializeSystemLookasideList(&ExpSmallNPagedPoolLookasideLists[i].L, + NonPagedPool, + j * 8, + TAG('P', 'o', 'o', 'l'), + 256, + &ExPoolLookasideListHead); + + /* Initialize the paged list */ + ExInitializeSystemLookasideList(&ExpSmallPagedPoolLookasideLists[i].L, + PagedPool, + j * 8, + TAG('P', 'o', 'o', 'l'), + 256, + &ExPoolLookasideListHead); + } } +/* PUBLIC FUNCTIONS **********************************************************/ + /* * @implemented */ PVOID -STDCALL +NTAPI ExiAllocateFromPagedLookasideList(IN PPAGED_LOOKASIDE_LIST Lookaside) { PVOID Entry; @@ -87,7 +142,7 @@ ExiAllocateFromPagedLookasideList(IN PPAGED_LOOKASIDE_LIST Lookaside) { Lookaside->L.AllocateMisses++; Entry = (Lookaside->L.Allocate)(Lookaside->L.Type, - Lookaside->L.Size, + Lookaside->L.Size, Lookaside->L.Tag); } return Entry; @@ -97,7 +152,7 @@ ExiAllocateFromPagedLookasideList(IN PPAGED_LOOKASIDE_LIST Lookaside) * @implemented */ VOID -STDCALL +NTAPI ExiFreeToPagedLookasideList(IN PPAGED_LOOKASIDE_LIST Lookaside, IN PVOID Entry) { @@ -117,21 +172,20 @@ ExiFreeToPagedLookasideList(IN PPAGED_LOOKASIDE_LIST Lookaside, * @implemented */ VOID -STDCALL -ExDeleteNPagedLookasideList(PNPAGED_LOOKASIDE_LIST Lookaside) +NTAPI +ExDeleteNPagedLookasideList(IN PNPAGED_LOOKASIDE_LIST Lookaside) { KIRQL OldIrql; PVOID Entry; - /* Pop all entries off the stack and release the resources allocated - for them */ + /* Pop all entries off the stack and release their resources */ for (;;) { Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead); if (!Entry) break; (*Lookaside->L.Free)(Entry); } - + /* Remove from list */ KeAcquireSpinLock(&ExpNonPagedLookasideListLock, &OldIrql); RemoveEntryList(&Lookaside->L.ListEntry); @@ -142,21 +196,20 @@ ExDeleteNPagedLookasideList(PNPAGED_LOOKASIDE_LIST Lookaside) * @implemented */ VOID -STDCALL -ExDeletePagedLookasideList(PPAGED_LOOKASIDE_LIST Lookaside) +NTAPI +ExDeletePagedLookasideList(IN PPAGED_LOOKASIDE_LIST Lookaside) { KIRQL OldIrql; PVOID Entry; - /* Pop all entries off the stack and release the resources allocated - for them */ + /* Pop all entries off the stack and release their resources */ for (;;) { Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead); if (!Entry) break; (*Lookaside->L.Free)(Entry); } - + /* Remove from list */ KeAcquireSpinLock(&ExpPagedLookasideListLock, &OldIrql); RemoveEntryList(&Lookaside->L.ListEntry); @@ -167,17 +220,15 @@ ExDeletePagedLookasideList(PPAGED_LOOKASIDE_LIST Lookaside) * @implemented */ VOID -STDCALL -ExInitializeNPagedLookasideList(PNPAGED_LOOKASIDE_LIST Lookaside, - PALLOCATE_FUNCTION Allocate, - PFREE_FUNCTION Free, - ULONG Flags, - ULONG Size, - ULONG Tag, - USHORT Depth) +NTAPI +ExInitializeNPagedLookasideList(IN PNPAGED_LOOKASIDE_LIST Lookaside, + IN PALLOCATE_FUNCTION Allocate OPTIONAL, + IN PFREE_FUNCTION Free OPTIONAL, + IN ULONG Flags, + IN ULONG Size, + IN ULONG Tag, + IN USHORT Depth) { - DPRINT("Initializing nonpaged lookaside list at 0x%p\n", Lookaside); - /* Initialize the Header */ ExInitializeSListHead(&Lookaside->L.ListHead); Lookaside->L.TotalAllocates = 0; @@ -221,17 +272,15 @@ ExInitializeNPagedLookasideList(PNPAGED_LOOKASIDE_LIST Lookaside, * @implemented */ VOID -STDCALL -ExInitializePagedLookasideList (PPAGED_LOOKASIDE_LIST Lookaside, - PALLOCATE_FUNCTION Allocate, - PFREE_FUNCTION Free, - ULONG Flags, - ULONG Size, - ULONG Tag, - USHORT Depth) +NTAPI +ExInitializePagedLookasideList(IN PPAGED_LOOKASIDE_LIST Lookaside, + IN PALLOCATE_FUNCTION Allocate OPTIONAL, + IN PFREE_FUNCTION Free OPTIONAL, + IN ULONG Flags, + IN ULONG Size, + IN ULONG Tag, + IN USHORT Depth) { - DPRINT("Initializing paged lookaside list at 0x%p\n", Lookaside); - /* Initialize the Header */ ExInitializeSListHead(&Lookaside->L.ListHead); Lookaside->L.TotalAllocates = 0; @@ -264,7 +313,7 @@ ExInitializePagedLookasideList (PPAGED_LOOKASIDE_LIST Lookaside, { Lookaside->L.Free = ExFreePool; } - + /* Insert it into the list */ ExInterlockedInsertTailList(&ExpNonPagedLookasideListHead, &Lookaside->L.ListEntry, diff --git a/reactos/ntoskrnl/ex/sysinfo.c b/reactos/ntoskrnl/ex/sysinfo.c index 5cced43ab6c..a9e1778af23 100644 --- a/reactos/ntoskrnl/ex/sysinfo.c +++ b/reactos/ntoskrnl/ex/sysinfo.c @@ -21,6 +21,10 @@ ULONGLONG STDCALL KeQueryInterruptTime(VOID); VOID MmPrintMemoryStatistic(VOID); +FAST_MUTEX ExpEnvironmentLock; +ERESOURCE ExpFirmwareTableResource; +LIST_ENTRY ExpFirmwareTableProviderListHead; + /* FUNCTIONS *****************************************************************/ /* diff --git a/reactos/ntoskrnl/include/internal/ex.h b/reactos/ntoskrnl/include/internal/ex.h index 96a060420f9..39fa724ca3e 100644 --- a/reactos/ntoskrnl/include/internal/ex.h +++ b/reactos/ntoskrnl/include/internal/ex.h @@ -10,6 +10,9 @@ extern POBJECT_TYPE ExEventPairObjectType; extern ULONG NtBuildNumber; extern ULONG NtMajorVersion; extern ULONG NtMinorVersion; +extern FAST_MUTEX ExpEnvironmentLock; +extern ERESOURCE ExpFirmwareTableResource; +extern LIST_ENTRY ExpFirmwareTableProviderListHead; #define MAX_FAST_REFS 7 @@ -66,6 +69,17 @@ VOID NTAPI ExpInitLookasideLists(VOID); +VOID +NTAPI +ExInitializeSystemLookasideList( + IN PGENERAL_LOOKASIDE List, + IN POOL_TYPE Type, + IN ULONG Size, + IN ULONG Tag, + IN USHORT MaximumDepth, + IN PLIST_ENTRY ListHead +); + VOID NTAPI ExpInitializeCallbacks(VOID);