- Implement Phase 0 Ex initialization (Resource, Lookaside initialization) and generic Ex initialization routine.

- Clear the crypto exponent on boot-up.
- Set default global flags for checked builds.
- Set NtSystemRoot (SharedUserData) to C:<NT BOOT PATH> on startup.
- Cleanup lookas.c file and implement routines to initialize the system lookaside list in phase 0.

svn path=/trunk/; revision=24360
This commit is contained in:
Alex Ionescu 2006-10-02 13:23:03 +00:00
parent 526efd2ee7
commit afa1de7c81
4 changed files with 208 additions and 62 deletions

View file

@ -22,7 +22,8 @@ ULONG NtMajorVersion = 5;
ULONG NtMinorVersion = 0; ULONG NtMinorVersion = 0;
ULONG NtOSCSDVersion = BUILD_OSCSDVERSION(4, 0); ULONG NtOSCSDVersion = BUILD_OSCSDVERSION(4, 0);
ULONG NtBuildNumber = KERNEL_VERSION_BUILD; ULONG NtBuildNumber = KERNEL_VERSION_BUILD;
ULONG NtGlobalFlag = 0; ULONG NtGlobalFlag;
ULONG ExSuiteMask;
extern ULONG MmCoreDumpType; extern ULONG MmCoreDumpType;
extern LOADER_MODULE KeLoaderModules[64]; extern LOADER_MODULE KeLoaderModules[64];
@ -36,6 +37,9 @@ BOOLEAN ExpInTextModeSetup;
BOOLEAN IoRemoteBootClient; BOOLEAN IoRemoteBootClient;
ULONG InitSafeBootMode; ULONG InitSafeBootMode;
/* NT Boot Path */
UNICODE_STRING NtSystemRoot;
/* Boot NLS information */ /* Boot NLS information */
PVOID ExpNlsTableBase; PVOID ExpNlsTableBase;
ULONG ExpAnsiCodePageDataOffset, ExpOemCodePageDataOffset; ULONG ExpAnsiCodePageDataOffset, ExpOemCodePageDataOffset;
@ -348,14 +352,6 @@ ExpLoadInitialProcess(PHANDLE ProcessHandle,
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
VOID
NTAPI
ExInit2(VOID)
{
ExpInitLookasideLists();
ExpInitializeHandleTables();
}
VOID VOID
NTAPI NTAPI
ExInit3(VOID) ExInit3(VOID)
@ -371,6 +367,61 @@ ExInit3(VOID)
ExpInitUuids(); 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 BOOLEAN
NTAPI NTAPI
ExpIsLoaderValid(IN PLOADER_PARAMETER_BLOCK LoaderBlock) ExpIsLoaderValid(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
@ -402,6 +453,9 @@ ExpInitializeExecutive(IN ULONG Cpu,
IN PLOADER_PARAMETER_BLOCK LoaderBlock) IN PLOADER_PARAMETER_BLOCK LoaderBlock)
{ {
PNLS_DATA_BLOCK NlsData; PNLS_DATA_BLOCK NlsData;
CHAR Buffer[256];
ANSI_STRING AnsiPath;
NTSTATUS Status;
/* FIXME: Deprecate soon */ /* FIXME: Deprecate soon */
ParseAndCacheLoadedModules(); ParseAndCacheLoadedModules();
@ -487,6 +541,31 @@ ExpInitializeExecutive(IN ULONG Cpu,
/* Make sure interrupts are active now */ /* Make sure interrupts are active now */
_enable(); _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 */ /* Setup bugcheck messages */
KiInitializeBugCheck(); KiInitializeBugCheck();
@ -496,14 +575,14 @@ ExpInitializeExecutive(IN ULONG Cpu,
/* Initialize the second stage of the kernel */ /* Initialize the second stage of the kernel */
KeInit2(); KeInit2();
/* Initialize resources */ /* Initialize the executive at phase 0 */
ExpResourceInitialization(); if (!ExInitSystem()) KEBUGCHECK(PHASE0_INITIALIZATION_FAILED);
/* Load basic Security for other Managers */ /* Load basic Security for other Managers */
if (!SeInit1()) KEBUGCHECK(SECURITY_INITIALIZATION_FAILED); if (!SeInit1()) KEBUGCHECK(SECURITY_INITIALIZATION_FAILED);
/* Initialize Lookaside Lists and Handle Table */ /* Initialize the Handle Table */
ExInit2(); ExpInitializeHandleTables();
/* Create the Basic Object Manager Types to allow new Object Types */ /* Create the Basic Object Manager Types to allow new Object Types */
ObInit(); ObInit();

View file

@ -1,18 +1,16 @@
/* /*
* COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS Kernel
* PROJECT: ReactOS kernel * LICENSE: GPL - See COPYING in the top level directory
* FILE: ntoskrnl/ex/lookas.c * FILE: ntoskrnl/ex/lookas.c
* PURPOSE: Lookaside lists * PURPOSE: Lookaside Lists
* PROGRAMMERS: Alex Ionescu (alex@relsoft.net) * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
* David Welch (welch@mcmail.com) */
* Casper S. Hornstrup (chorns@users.sourceforge.net)
*/
/* INCLUDES *****************************************************************/ /* INCLUDES ******************************************************************/
#include <ntoskrnl.h> #include <ntoskrnl.h>
#define NDEBUG #define NDEBUG
#include <internal/debug.h> #include <debug.h>
#if defined (ALLOC_PRAGMA) #if defined (ALLOC_PRAGMA)
#pragma alloc_text(INIT, ExpInitLookasideLists) #pragma alloc_text(INIT, ExpInitLookasideLists)
@ -24,10 +22,41 @@ LIST_ENTRY ExpNonPagedLookasideListHead;
KSPIN_LOCK ExpNonPagedLookasideListLock; KSPIN_LOCK ExpNonPagedLookasideListLock;
LIST_ENTRY ExpPagedLookasideListHead; LIST_ENTRY ExpPagedLookasideListHead;
KSPIN_LOCK ExpPagedLookasideListLock; KSPIN_LOCK ExpPagedLookasideListLock;
LIST_ENTRY ExSystemLookasideListHead;
LIST_ENTRY ExPoolLookasideListHead;
NPAGED_LOOKASIDE_LIST ExpSmallNPagedPoolLookasideLists[MAXIMUM_PROCESSORS]; NPAGED_LOOKASIDE_LIST ExpSmallNPagedPoolLookasideLists[MAXIMUM_PROCESSORS];
PAGED_LOOKASIDE_LIST ExpSmallPagedPoolLookasideLists[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 VOID
NTAPI NTAPI
@ -60,23 +89,49 @@ ExInitPoolLookasidePointers(VOID)
Entry->P = &PagedListEntry->L; Entry->P = &PagedListEntry->L;
} }
} }
VOID VOID
INIT_FUNCTION NTAPI
STDCALL
ExpInitLookasideLists() ExpInitLookasideLists()
{ {
/* Initialize Lock and Listhead */ ULONG i, j;
/* Initialize locks and lists */
InitializeListHead(&ExpNonPagedLookasideListHead); InitializeListHead(&ExpNonPagedLookasideListHead);
KeInitializeSpinLock(&ExpNonPagedLookasideListLock);
InitializeListHead(&ExpPagedLookasideListHead); InitializeListHead(&ExpPagedLookasideListHead);
InitializeListHead(&ExSystemLookasideListHead);
InitializeListHead(&ExPoolLookasideListHead);
KeInitializeSpinLock(&ExpNonPagedLookasideListLock);
KeInitializeSpinLock(&ExpPagedLookasideListLock); 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 * @implemented
*/ */
PVOID PVOID
STDCALL NTAPI
ExiAllocateFromPagedLookasideList(IN PPAGED_LOOKASIDE_LIST Lookaside) ExiAllocateFromPagedLookasideList(IN PPAGED_LOOKASIDE_LIST Lookaside)
{ {
PVOID Entry; PVOID Entry;
@ -97,7 +152,7 @@ ExiAllocateFromPagedLookasideList(IN PPAGED_LOOKASIDE_LIST Lookaside)
* @implemented * @implemented
*/ */
VOID VOID
STDCALL NTAPI
ExiFreeToPagedLookasideList(IN PPAGED_LOOKASIDE_LIST Lookaside, ExiFreeToPagedLookasideList(IN PPAGED_LOOKASIDE_LIST Lookaside,
IN PVOID Entry) IN PVOID Entry)
{ {
@ -117,14 +172,13 @@ ExiFreeToPagedLookasideList(IN PPAGED_LOOKASIDE_LIST Lookaside,
* @implemented * @implemented
*/ */
VOID VOID
STDCALL NTAPI
ExDeleteNPagedLookasideList(PNPAGED_LOOKASIDE_LIST Lookaside) ExDeleteNPagedLookasideList(IN PNPAGED_LOOKASIDE_LIST Lookaside)
{ {
KIRQL OldIrql; KIRQL OldIrql;
PVOID Entry; PVOID Entry;
/* Pop all entries off the stack and release the resources allocated /* Pop all entries off the stack and release their resources */
for them */
for (;;) for (;;)
{ {
Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead); Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
@ -142,14 +196,13 @@ ExDeleteNPagedLookasideList(PNPAGED_LOOKASIDE_LIST Lookaside)
* @implemented * @implemented
*/ */
VOID VOID
STDCALL NTAPI
ExDeletePagedLookasideList(PPAGED_LOOKASIDE_LIST Lookaside) ExDeletePagedLookasideList(IN PPAGED_LOOKASIDE_LIST Lookaside)
{ {
KIRQL OldIrql; KIRQL OldIrql;
PVOID Entry; PVOID Entry;
/* Pop all entries off the stack and release the resources allocated /* Pop all entries off the stack and release their resources */
for them */
for (;;) for (;;)
{ {
Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead); Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
@ -167,17 +220,15 @@ ExDeletePagedLookasideList(PPAGED_LOOKASIDE_LIST Lookaside)
* @implemented * @implemented
*/ */
VOID VOID
STDCALL NTAPI
ExInitializeNPagedLookasideList(PNPAGED_LOOKASIDE_LIST Lookaside, ExInitializeNPagedLookasideList(IN PNPAGED_LOOKASIDE_LIST Lookaside,
PALLOCATE_FUNCTION Allocate, IN PALLOCATE_FUNCTION Allocate OPTIONAL,
PFREE_FUNCTION Free, IN PFREE_FUNCTION Free OPTIONAL,
ULONG Flags, IN ULONG Flags,
ULONG Size, IN ULONG Size,
ULONG Tag, IN ULONG Tag,
USHORT Depth) IN USHORT Depth)
{ {
DPRINT("Initializing nonpaged lookaside list at 0x%p\n", Lookaside);
/* Initialize the Header */ /* Initialize the Header */
ExInitializeSListHead(&Lookaside->L.ListHead); ExInitializeSListHead(&Lookaside->L.ListHead);
Lookaside->L.TotalAllocates = 0; Lookaside->L.TotalAllocates = 0;
@ -221,17 +272,15 @@ ExInitializeNPagedLookasideList(PNPAGED_LOOKASIDE_LIST Lookaside,
* @implemented * @implemented
*/ */
VOID VOID
STDCALL NTAPI
ExInitializePagedLookasideList (PPAGED_LOOKASIDE_LIST Lookaside, ExInitializePagedLookasideList(IN PPAGED_LOOKASIDE_LIST Lookaside,
PALLOCATE_FUNCTION Allocate, IN PALLOCATE_FUNCTION Allocate OPTIONAL,
PFREE_FUNCTION Free, IN PFREE_FUNCTION Free OPTIONAL,
ULONG Flags, IN ULONG Flags,
ULONG Size, IN ULONG Size,
ULONG Tag, IN ULONG Tag,
USHORT Depth) IN USHORT Depth)
{ {
DPRINT("Initializing paged lookaside list at 0x%p\n", Lookaside);
/* Initialize the Header */ /* Initialize the Header */
ExInitializeSListHead(&Lookaside->L.ListHead); ExInitializeSListHead(&Lookaside->L.ListHead);
Lookaside->L.TotalAllocates = 0; Lookaside->L.TotalAllocates = 0;

View file

@ -21,6 +21,10 @@ ULONGLONG STDCALL KeQueryInterruptTime(VOID);
VOID MmPrintMemoryStatistic(VOID); VOID MmPrintMemoryStatistic(VOID);
FAST_MUTEX ExpEnvironmentLock;
ERESOURCE ExpFirmwareTableResource;
LIST_ENTRY ExpFirmwareTableProviderListHead;
/* FUNCTIONS *****************************************************************/ /* FUNCTIONS *****************************************************************/
/* /*

View file

@ -10,6 +10,9 @@ extern POBJECT_TYPE ExEventPairObjectType;
extern ULONG NtBuildNumber; extern ULONG NtBuildNumber;
extern ULONG NtMajorVersion; extern ULONG NtMajorVersion;
extern ULONG NtMinorVersion; extern ULONG NtMinorVersion;
extern FAST_MUTEX ExpEnvironmentLock;
extern ERESOURCE ExpFirmwareTableResource;
extern LIST_ENTRY ExpFirmwareTableProviderListHead;
#define MAX_FAST_REFS 7 #define MAX_FAST_REFS 7
@ -66,6 +69,17 @@ VOID
NTAPI NTAPI
ExpInitLookasideLists(VOID); 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 VOID
NTAPI NTAPI
ExpInitializeCallbacks(VOID); ExpInitializeCallbacks(VOID);