weiden@svn.reactos.com wrote:
Alex Ionescu ionucu@videotron.ca
- Reorganized Bootup code. Most of the Executive initialization is now in ex/init.c
- Remove ExPostSystemEvent.
- Sped up Command-line parasing and wrote a function specificalyl for it, to ease extensibility
- Sped up and optimized loading modules from FreeLoader. The data is only looked up once and then the pointers are cached for easy re-use.
- Moved KeGetRecommendedSharedDataAlignmented to ke/main.c and implemented it.
- Moved subsystem-specific intialization to their own subsystem, like Io in ioinit and Cm in CmInit.
Modified: trunk/reactos/ntoskrnl/cm/registry.c Modified: trunk/reactos/ntoskrnl/ex/init.c Modified: trunk/reactos/ntoskrnl/include/internal/ex.h Modified: trunk/reactos/ntoskrnl/include/internal/io.h Modified: trunk/reactos/ntoskrnl/include/internal/ke.h Modified: trunk/reactos/ntoskrnl/include/internal/nls.h Modified: trunk/reactos/ntoskrnl/include/internal/ntoskrnl.h Modified: trunk/reactos/ntoskrnl/io/bootlog.c Modified: trunk/reactos/ntoskrnl/io/iomgr.c Modified: trunk/reactos/ntoskrnl/ke/catch.c Modified: trunk/reactos/ntoskrnl/ke/main.c Modified: trunk/reactos/ntoskrnl/ntoskrnl.def Modified: trunk/reactos/ntoskrnl/rtl/nls.c
What didn't make it into the ros-diff:
Index: ntoskrnl/ke/main.c =================================================================== --- ntoskrnl/ke/main.c (.../trunk/reactos) (revision 13937) +++ ntoskrnl/ke/main.c (.../branches/alex_devel_branch/reactos) (revision 13942) @@ -58,19 +45,17 @@ EXPORTED ULONG InitSafeBootMode = 0; /* KB83764 */ #endif /* __GNUC__ */
-static LOADER_MODULE KeLoaderModules[64]; +LOADER_MODULE KeLoaderModules[64]; static CHAR KeLoaderModuleStrings[64][256]; static CHAR KeLoaderCommandLine[256]; -static ADDRESS_RANGE KeMemoryMap[64]; -static ULONG KeMemoryMapRangeCount; -static ULONG_PTR FirstKrnlPhysAddr; -static ULONG_PTR LastKrnlPhysAddr; -static ULONG_PTR LastKernelAddress; +ADDRESS_RANGE KeMemoryMap[64]; +ULONG KeMemoryMapRangeCount; +ULONG_PTR FirstKrnlPhysAddr; +ULONG_PTR LastKrnlPhysAddr; +ULONG_PTR LastKernelAddress; volatile BOOLEAN Initialized = FALSE; -extern ULONG MmCoreDumpType; -extern CHAR KiTimerSystemAuditing;
-extern PVOID Ki386InitialStackArray[MAXIMUM_PROCESSORS]; +ULONG KeLargestCacheLine = 0x40; /* FIXME: Arch-specific */
/* We allocate 4 pages, but we only use 3. The 4th is to guarantee page alignment */ ULONG kernel_stack[4096]; @@ -82,796 +67,59 @@ ULONG trap_stack; ULONG trap_stack_top;
+/* Cached modules from the loader block */ +PLOADER_MODULE CachedModules[MaximumCachedModuleType]; + /* FUNCTIONS ****************************************************************/
-static VOID INIT_FUNCTION -InitSystemSharedUserPage (PCSZ ParameterLine) -{ - UNICODE_STRING ArcDeviceName; - UNICODE_STRING ArcName; - UNICODE_STRING BootPath; - UNICODE_STRING DriveDeviceName; - UNICODE_STRING DriveName; - WCHAR DriveNameBuffer[20]; - PCHAR ParamBuffer; - PWCHAR ArcNameBuffer; - PCHAR p; - NTSTATUS Status; - ULONG Length; - OBJECT_ATTRIBUTES ObjectAttributes; - HANDLE Handle; - ULONG i; - BOOLEAN BootDriveFound; - - /* - * NOTE: - * The shared user page has been zeroed-out right after creation. - * There is NO need to do this again. - */ - - Ki386SetProcessorFeatures(); - - SharedUserData->NtProductType = NtProductWinNt; - SharedUserData->ProductTypeIsValid = TRUE; - SharedUserData->NtMajorVersion = 5; - SharedUserData->NtMinorVersion = 0; - - BootDriveFound = FALSE; - - /* - * Retrieve the current dos system path - * (e.g.: C:\reactos) from the given arc path - * (e.g.: multi(0)disk(0)rdisk(0)partititon(1)\reactos) - * Format: "<arc_name><path> [options...]" - */ - - /* create local parameter line copy */ - ParamBuffer = ExAllocatePool (PagedPool, 256); - strcpy (ParamBuffer, (char *)ParameterLine); - DPRINT("%s\n", ParamBuffer); - - /* cut options off */ - p = strchr (ParamBuffer, ' '); - if (p) - { - *p = 0; - } - DPRINT("%s\n", ParamBuffer); - - /* extract path */ - p = strchr (ParamBuffer, '\'); - if (p) - { - DPRINT("Boot path: %s\n", p); - RtlCreateUnicodeStringFromAsciiz (&BootPath, p); - *p = 0; - } - else - { - DPRINT("Boot path: %s\n", "\"); - RtlCreateUnicodeStringFromAsciiz (&BootPath, "\"); - } - DPRINT("Arc name: %s\n", ParamBuffer); - - /* Only arc name left - build full arc name */ - ArcNameBuffer = ExAllocatePool (PagedPool, 256 * sizeof(WCHAR)); - swprintf (ArcNameBuffer, L"\ArcName\%S", ParamBuffer); - RtlInitUnicodeString (&ArcName, ArcNameBuffer); - DPRINT("Arc name: %wZ\n", &ArcName); - - /* free ParamBuffer */ - ExFreePool (ParamBuffer); - - /* allocate arc device name string */ - ArcDeviceName.Length = 0; - ArcDeviceName.MaximumLength = 256 * sizeof(WCHAR); - ArcDeviceName.Buffer = ExAllocatePool (PagedPool, 256 * sizeof(WCHAR)); - - InitializeObjectAttributes (&ObjectAttributes, - &ArcName, - OBJ_OPENLINK, - NULL, - NULL); - - Status = NtOpenSymbolicLinkObject (&Handle, - SYMBOLIC_LINK_ALL_ACCESS, - &ObjectAttributes); - RtlFreeUnicodeString (&ArcName); - if (!NT_SUCCESS(Status)) - { - RtlFreeUnicodeString (&BootPath); - RtlFreeUnicodeString (&ArcDeviceName); - CPRINT("NtOpenSymbolicLinkObject() failed (Status %x)\n", - Status); - - KEBUGCHECK (0x0); - } - - Status = NtQuerySymbolicLinkObject (Handle, - &ArcDeviceName, - &Length); - NtClose (Handle); - if (!NT_SUCCESS(Status)) - { - RtlFreeUnicodeString (&BootPath); - RtlFreeUnicodeString (&ArcDeviceName); - CPRINT("NtQuerySymbolicObject() failed (Status %x)\n", - Status); - - KEBUGCHECK (0x0); - } - DPRINT("Length: %lu ArcDeviceName: %wZ\n", Length, &ArcDeviceName); - - - /* allocate device name string */ - DriveDeviceName.Length = 0; - DriveDeviceName.MaximumLength = 256 * sizeof(WCHAR); - DriveDeviceName.Buffer = ExAllocatePool (PagedPool, 256 * sizeof(WCHAR)); - - for (i = 0; i < 26; i++) - { - swprintf (DriveNameBuffer, L"\??\%C:", 'A' + i); - RtlInitUnicodeString (&DriveName, - DriveNameBuffer); - - InitializeObjectAttributes (&ObjectAttributes, - &DriveName, - OBJ_OPENLINK, - NULL, - NULL); - - Status = NtOpenSymbolicLinkObject (&Handle, - SYMBOLIC_LINK_ALL_ACCESS, - &ObjectAttributes); - if (!NT_SUCCESS(Status)) - { - DPRINT("Failed to open link %wZ\n", - &DriveName); - continue; - } - - Status = NtQuerySymbolicLinkObject (Handle, - &DriveDeviceName, - &Length); - if (!NT_SUCCESS(Status)) - { - DPRINT("Failed query open link %wZ\n", - &DriveName); - continue; - } - DPRINT("Opened link: %wZ ==> %wZ\n", - &DriveName, &DriveDeviceName); - - if (!RtlCompareUnicodeString (&ArcDeviceName, &DriveDeviceName, FALSE)) - { - DPRINT("DOS Boot path: %c:%wZ\n", 'A' + i, &BootPath); - swprintf(SharedUserData->NtSystemRoot, - L"%C:%wZ", 'A' + i, &BootPath); - - BootDriveFound = TRUE; - } - - NtClose (Handle); - } - - RtlFreeUnicodeString (&BootPath); - RtlFreeUnicodeString (&DriveDeviceName); - RtlFreeUnicodeString (&ArcDeviceName); - - if (BootDriveFound == FALSE) - { - DbgPrint("No system drive found!\n"); - KEBUGCHECK (NO_BOOT_DEVICE); - } -} - -VOID INIT_FUNCTION -ExpInitializeExecutive(VOID) -{ - LARGE_INTEGER Timeout; - HANDLE ProcessHandle; - HANDLE ThreadHandle; - ULONG i; - ULONG start; - ULONG length; - PCHAR name; - CHAR str[50]; - NTSTATUS Status; - BOOLEAN SetupBoot; - PCHAR p1, p2; - ULONG MaxMem; - BOOLEAN NoGuiBoot = FALSE; - UNICODE_STRING Name; - HANDLE InitDoneEventHandle; - OBJECT_ATTRIBUTES ObjectAttributes; - - /* - * Fail at runtime if someone has changed various structures without - * updating the offsets used for the assembler code. - */ - ASSERT(FIELD_OFFSET(KTHREAD, InitialStack) == KTHREAD_INITIAL_STACK); - ASSERT(FIELD_OFFSET(KTHREAD, Teb) == KTHREAD_TEB); - ASSERT(FIELD_OFFSET(KTHREAD, KernelStack) == KTHREAD_KERNEL_STACK); - ASSERT(FIELD_OFFSET(KTHREAD, NpxState) == KTHREAD_NPX_STATE); - ASSERT(FIELD_OFFSET(KTHREAD, ServiceTable) == KTHREAD_SERVICE_TABLE); - ASSERT(FIELD_OFFSET(KTHREAD, PreviousMode) == KTHREAD_PREVIOUS_MODE); - ASSERT(FIELD_OFFSET(KTHREAD, TrapFrame) == KTHREAD_TRAP_FRAME); - ASSERT(FIELD_OFFSET(KTHREAD, CallbackStack) == KTHREAD_CALLBACK_STACK); - ASSERT(FIELD_OFFSET(KTHREAD, ApcState.Process) == KTHREAD_APCSTATE_PROCESS); - ASSERT(FIELD_OFFSET(KPROCESS, DirectoryTableBase) == - KPROCESS_DIRECTORY_TABLE_BASE); - ASSERT(FIELD_OFFSET(KPROCESS, IopmOffset) == KPROCESS_IOPM_OFFSET); - ASSERT(FIELD_OFFSET(KPROCESS, LdtDescriptor) == KPROCESS_LDT_DESCRIPTOR0); - ASSERT(FIELD_OFFSET(KTRAP_FRAME, Reserved9) == KTRAP_FRAME_RESERVED9); - ASSERT(FIELD_OFFSET(KV86M_TRAP_FRAME, SavedExceptionStack) == TF_SAVED_EXCEPTION_STACK); - ASSERT(FIELD_OFFSET(KV86M_TRAP_FRAME, regs) == TF_REGS); - ASSERT(FIELD_OFFSET(KV86M_TRAP_FRAME, orig_ebp) == TF_ORIG_EBP); - - ASSERT(FIELD_OFFSET(KPCR, Tib.ExceptionList) == KPCR_EXCEPTION_LIST); - ASSERT(FIELD_OFFSET(KPCR, Self) == KPCR_SELF); - ASSERT(FIELD_OFFSET(KPCR, PrcbData) + FIELD_OFFSET(KPRCB, CurrentThread) == KPCR_CURRENT_THREAD); - ASSERT(FIELD_OFFSET(KPCR, PrcbData) + FIELD_OFFSET(KPRCB, NpxThread) == KPCR_NPX_THREAD); - - ASSERT(FIELD_OFFSET(KTSS, Esp0) == KTSS_ESP0); - ASSERT(FIELD_OFFSET(KTSS, Eflags) == KTSS_EFLAGS); - ASSERT(FIELD_OFFSET(KTSS, IoMapBase) == KTSS_IOMAPBASE); - - ASSERT(sizeof(FX_SAVE_AREA) == SIZEOF_FX_SAVE_AREA); - - LdrInit1(); - - KeLowerIrql(DISPATCH_LEVEL); - - NtEarlyInitVdm(); - - p1 = (PCHAR)KeLoaderBlock.CommandLine; - - MaxMem = 0; - while(*p1 && (p2 = strchr(p1, '/'))) - { - p2++; - if (!_strnicmp(p2, "MAXMEM", 6)) - { - p2 += 6; - while (isspace(*p2)) p2++; - if (*p2 == '=') - { - p2++; - while(isspace(*p2)) p2++; - if (isdigit(*p2)) - { - while (isdigit(*p2)) - { - MaxMem = MaxMem * 10 + *p2 - '0'; - p2++; - } - break; - } - } - } - else if (!_strnicmp(p2, "NOGUIBOOT", 9)) - { - p2 += 9; - NoGuiBoot = TRUE; - } - else if (!_strnicmp(p2, "CRASHDUMP", 9)) - { - p2 += 9; - if (*p2 == ':') - { - p2++; - if (!_strnicmp(p2, "FULL", 4)) - { - MmCoreDumpType = MM_CORE_DUMP_TYPE_FULL; - } - else - { - MmCoreDumpType = MM_CORE_DUMP_TYPE_NONE; - } - } - } - p1 = p2; - } - - MmInit1(FirstKrnlPhysAddr, - LastKrnlPhysAddr, - LastKernelAddress, - (PADDRESS_RANGE)&KeMemoryMap, - KeMemoryMapRangeCount, - MaxMem > 8 ? MaxMem : 4096); - - /* Import ANSI code page table */ - for (i = 1; i < KeLoaderBlock.ModsCount; i++) - { - start = KeLoaderModules[i].ModStart; - length = KeLoaderModules[i].ModEnd - start; - - name = strrchr((PCHAR)KeLoaderModules[i].String, '\'); - if (name == NULL) - { - name = (PCHAR)KeLoaderModules[i].String; - } - else - { - name++; - } - - if (!_stricmp (name, "ansi.nls")) - { - RtlpImportAnsiCodePage((PUSHORT)start, length); - } - } - - /* Import OEM code page table */ - for (i = 1; i < KeLoaderBlock.ModsCount; i++) - { - start = KeLoaderModules[i].ModStart; - length = KeLoaderModules[i].ModEnd - start; - - name = strrchr((PCHAR)KeLoaderModules[i].String, '\'); - if (name == NULL) - { - name = (PCHAR)KeLoaderModules[i].String; - } - else - { - name++; - } - - if (!_stricmp (name, "oem.nls")) - { - RtlpImportOemCodePage((PUSHORT)start, length); - } - } - - /* Import Unicode casemap table */ - for (i = 1; i < KeLoaderBlock.ModsCount; i++) - { - start = KeLoaderModules[i].ModStart; - length = KeLoaderModules[i].ModEnd - start; - - name = strrchr((PCHAR)KeLoaderModules[i].String, '\'); - if (name == NULL) - { - name = (PCHAR)KeLoaderModules[i].String; - } - else - { - name++; - } - - if (!_stricmp (name, "casemap.nls")) - { - RtlpImportUnicodeCasemap((PUSHORT)start, length); - } - } - - /* Create initial NLS tables */ - RtlpCreateInitialNlsTables(); - - /* - * Initialize the kernel debugger - */ - KdInitSystem (1, (PLOADER_PARAMETER_BLOCK)&KeLoaderBlock); - - KeInit2(); - -#if 0 - if (KeMemoryMapRangeCount > 0) - { - DPRINT1("MemoryMap:\n"); - for (i = 0; i < KeMemoryMapRangeCount; i++) - { - switch(KeMemoryMap[i].Type) - { - case 1: - strcpy(str, "(usable)"); - break; - case 2: - strcpy(str, "(reserved)"); - break; - case 3: - strcpy(str, "(ACPI data)"); - break; - case 4: - strcpy(str, "(ACPI NVS)"); - break; - default: - sprintf(str, "type %lu", KeMemoryMap[i].Type); - } - DPRINT1("%08x - %08x %s\n", KeMemoryMap[i].BaseAddrLow, KeMemoryMap[i].BaseAddrLow + KeMemoryMap[i].LengthLow, str); - } - } -#endif - - KeLowerIrql(PASSIVE_LEVEL); - - if (!SeInit1()) - KEBUGCHECK(SECURITY_INITIALIZATION_FAILED); - - ObInit(); - ExInit2(); - MmInit2(); - - if (!SeInit2()) - KEBUGCHECK(SECURITY1_INITIALIZATION_FAILED); - - KeNumberProcessors = 1; - - PiInitProcessManager(); - - if (KdPollBreakIn ()) - { - DbgBreakPointWithStatus (DBG_STATUS_CONTROL_C); - } - - /* Initialize all processors */ - while (!HalAllProcessorsStarted()) - { - PVOID ProcessorStack; - - KePrepareForApplicationProcessorInit(KeNumberProcessors); - PsPrepareForApplicationProcessorInit(KeNumberProcessors); - - /* Allocate a stack for use when booting the processor */ - ProcessorStack = Ki386InitialStackArray[((int)KeNumberProcessors)] + MM_STACK_SIZE; - - HalStartNextProcessor(0, (ULONG)ProcessorStack - 2*sizeof(FX_SAVE_AREA)); - KeNumberProcessors++; - } - - /* - * Initialize various critical subsystems - */ - HalInitSystem(1, (PLOADER_PARAMETER_BLOCK)&KeLoaderBlock); - - ExInit3(); - KdInit1(); - IoInit(); - PoInit(); - CmInitializeRegistry(); - MmInit3(); - CcInit(); - KdInit2(); - FsRtlpInitFileLockingImplementation(); - - /* Report all resources used by hal */ - HalReportResourceUsage(); - - /* - * Clear the screen to blue - */ - HalInitSystem(2, (PLOADER_PARAMETER_BLOCK)&KeLoaderBlock); - - /* - * Display version number and copyright/warranty message - */ - HalDisplayString("Starting ReactOS "KERNEL_VERSION_STR" (Build " - KERNEL_VERSION_BUILD_STR")\n"); - HalDisplayString(RES_STR_LEGAL_COPYRIGHT); - HalDisplayString("\n\nReactOS is free software, covered by the GNU General " - "Public License, and you\n"); - HalDisplayString("are welcome to change it and/or distribute copies of it " - "under certain\n"); - HalDisplayString("conditions. There is absolutely no warranty for " - "ReactOS.\n\n"); - - if (KeNumberProcessors > 1) - { - sprintf(str, - "Found %d system processors. [%lu MB Memory]\n", - KeNumberProcessors, - (KeLoaderBlock.MemHigher + 1088)/ 1024); - } - else - { - sprintf(str, - "Found 1 system processor. [%lu MB Memory]\n", - (KeLoaderBlock.MemHigher + 1088)/ 1024); - } - HalDisplayString(str); - - KdInit3(); - - - /* Create the NLS section */ - RtlpCreateNlsSection(); - - /* - * Initalize services loaded at boot time - */ - DPRINT("%d files loaded\n",KeLoaderBlock.ModsCount); - for (i=0; i < KeLoaderBlock.ModsCount; i++) - { - CPRINT("Module: '%s' at %08lx, length 0x%08lx\n", - KeLoaderModules[i].String, - KeLoaderModules[i].ModStart, - KeLoaderModules[i].ModEnd - KeLoaderModules[i].ModStart); - } - - /* Pass 1: import system hive registry chunk */ - SetupBoot = TRUE; - for (i = 1; i < KeLoaderBlock.ModsCount; i++) - { - start = KeLoaderModules[i].ModStart; - length = KeLoaderModules[i].ModEnd - start; - - DPRINT("Module: '%s'\n", (PCHAR)KeLoaderModules[i].String); - name = strrchr((PCHAR)KeLoaderModules[i].String, '\'); - if (name == NULL) - { - name = (PCHAR)KeLoaderModules[i].String; - } - else - { - name++; - } - - if (!_stricmp (name, "system") || - !_stricmp (name, "system.hiv")) - { - CPRINT("Process system hive registry chunk at %08lx\n", start); - SetupBoot = FALSE; - CmImportSystemHive((PCHAR)start, length); - } - } - - /* Pass 2: import hardware hive registry chunk */ - for (i = 1; i < KeLoaderBlock.ModsCount; i++) - { - start = KeLoaderModules[i].ModStart; - length = KeLoaderModules[i].ModEnd - start; - name = (PCHAR)KeLoaderModules[i].String; - if (!_stricmp (name, "hardware") || - !_stricmp (name, "hardware.hiv")) - { - CPRINT("Process hardware hive registry chunk at %08lx\n", start); - CmImportHardwareHive((PCHAR)start, length); - } - } - - /* Create dummy keys if no hardware hive was found */ - CmImportHardwareHive (NULL, 0); - - /* Initialize volatile registry settings */ - if (SetupBoot == FALSE) - { - CmInit2((PCHAR)KeLoaderBlock.CommandLine); - } - - /* Initialize the time zone information from the registry */ - ExpInitTimeZoneInfo(); - - /* - * Enter the kernel debugger before starting up the boot drivers - */ -#ifdef KDBG - KdbEnter(); -#endif /* KDBG */ - - IoCreateDriverList(); - - IoInit2(); - - /* Initialize Callbacks before drivers */ - ExpInitializeCallbacks(); - - /* Start boot logging */ - IopInitBootLog(); - p1 = (PCHAR)KeLoaderBlock.CommandLine; - while (*p1 && (p2 = strchr(p1, '/'))) - { - p2++; - if (!_strnicmp(p2, "BOOTLOG", 7)) - { - p2 += 7; - IopStartBootLog(); - } - - p1 = p2; - } - - /* - * Load boot start drivers - */ - IopInitializeBootDrivers(); - - /* Display the boot screen image if not disabled */ - if (!NoGuiBoot) - { - InbvEnableBootDriver(TRUE); - } - - /* Create ARC names for boot devices */ - IoCreateArcNames(); - - /* Create the SystemRoot symbolic link */ - CPRINT("CommandLine: %s\n", (PCHAR)KeLoaderBlock.CommandLine); - DPRINT1("MmSystemRangeStart: 0x%x PageDir: 0x%x\n", MmSystemRangeStart, KeLoaderBlock.PageDirectoryStart); - Status = IoCreateSystemRootLink((PCHAR)KeLoaderBlock.CommandLine); - if (!NT_SUCCESS(Status)) - { - DbgPrint ( "IoCreateSystemRootLink FAILED: (0x%x) - ", Status ); - DbgPrintErrorMessage ( Status ); - KEBUGCHECK(INACCESSIBLE_BOOT_DEVICE); - } - -#if defined(KDBG) - KdbInit(); -#endif /* KDBG */ -#if defined(KDBG) || defined(DBG) - KdbInitProfiling2(); -#endif /* KDBG || DBG */ - - /* On the assumption that we can now access disks start up the debug - * logger thread */ - if ((KdDebuggerEnabled == TRUE) && (KdDebugState & KD_DEBUG_BOOTLOG)) - { - DebugLogInit2(); - } - - PiInitDefaultLocale(); - - /* - * Load services for devices found by PnP manager - */ - IopInitializePnpServices(IopRootDeviceNode, FALSE); - - /* - * Load system start drivers - */ - IopInitializeSystemDrivers(); - - IoDestroyDriverList(); - - /* Stop boot logging */ - IopStopBootLog(); - - /* - * Assign drive letters - */ - IoAssignDriveLetters ((PLOADER_PARAMETER_BLOCK)&KeLoaderBlock, - NULL, - NULL, - NULL); - - /* - * Initialize shared user page: - * - set dos system path, dos device map, etc. - */ - InitSystemSharedUserPage ((PCHAR)KeLoaderBlock.CommandLine); - - /* Create 'ReactOSInitDone' event */ - RtlInitUnicodeString(&Name, L"\ReactOSInitDone"); - InitializeObjectAttributes(&ObjectAttributes, - &Name, - 0, - NULL, - NULL); - Status = ZwCreateEvent(&InitDoneEventHandle, - EVENT_ALL_ACCESS, - &ObjectAttributes, - SynchronizationEvent, - FALSE); /* Not signalled */ - if (!NT_SUCCESS(Status)) - { - DPRINT1("Failed to create 'ReactOSInitDone' event (Status 0x%x)\n", Status); - InitDoneEventHandle = INVALID_HANDLE_VALUE; - } - - /* - * Launch initial process - */ - Status = LdrLoadInitialProcess(&ProcessHandle, - &ThreadHandle); - if (!NT_SUCCESS(Status)) - { - KEBUGCHECKEX(SESSION4_INITIALIZATION_FAILED, Status, 0, 0, 0); - } - - if (InitDoneEventHandle != INVALID_HANDLE_VALUE) - { - HANDLE Handles[2]; /* Init event, Initial process */ - - Handles[0] = InitDoneEventHandle; - Handles[1] = ProcessHandle; - - /* Wait for the system to be initialized */ - Timeout.QuadPart = (LONGLONG)-1200000000; /* 120 second timeout */ - Status = ZwWaitForMultipleObjects(((LONG) sizeof(Handles) / sizeof(HANDLE)), - Handles, - WaitAny, - FALSE, /* Non-alertable */ - &Timeout); - if (!NT_SUCCESS(Status)) - { - DPRINT1("NtWaitForMultipleObjects failed with status 0x%x!\n", Status); - } - else if (Status == STATUS_TIMEOUT) - { - DPRINT1("WARNING: System not initialized after 120 seconds.\n"); - } - else if (Status == STATUS_WAIT_0 + 1) - { - /* - * Crash the system if the initial process was terminated. - */ - KEBUGCHECKEX(SESSION5_INITIALIZATION_FAILED, Status, 0, 0, 0); - } - - if (!NoGuiBoot) - { - InbvEnableBootDriver(FALSE); - } - - ZwSetEvent(InitDoneEventHandle, NULL); - - ZwClose(InitDoneEventHandle); - } - else - { - /* On failure to create 'ReactOSInitDone' event, go to text mode ASAP */ - if (!NoGuiBoot) - { - InbvEnableBootDriver(FALSE); - } - - /* - * Crash the system if the initial process terminates within 5 seconds. - */ - Timeout.QuadPart = (LONGLONG)-50000000; /* 5 second timeout */ - Status = ZwWaitForSingleObject(ProcessHandle, - FALSE, - &Timeout); - if (Status != STATUS_TIMEOUT) - { - KEBUGCHECKEX(SESSION5_INITIALIZATION_FAILED, Status, 1, 0, 0); - } - } /* - * Tell ke/timer.c it's okay to run. + * @implemented */ - - KiTimerSystemAuditing = 1; - - ZwClose(ThreadHandle); - ZwClose(ProcessHandle); +ULONG +STDCALL +KeGetRecommendedSharedDataAlignment(VOID) +{ + return KeLargestCacheLine; }
-VOID __attribute((noinline)) +VOID +__attribute((noinline)) KiSystemStartup(BOOLEAN BootProcessor) { - DPRINT1("KiSystemStartup(%d)\n", BootProcessor); - if (BootProcessor) - { - } - else - { - KeApplicationProcessorInit(); - } + DPRINT("KiSystemStartup(%d)\n", BootProcessor); + + /* Initialize the Application Processor */ + if (!BootProcessor) KeApplicationProcessorInit(); + + /* Initialize the Processor with HAL */ + HalInitializeProcessor(KeNumberProcessors, (PLOADER_PARAMETER_BLOCK)&KeLoaderBlock);
- HalInitializeProcessor(KeNumberProcessors, (PLOADER_PARAMETER_BLOCK)&KeLoaderBlock); - - if (BootProcessor) - { - ExpInitializeExecutive(); - MiFreeInitMemory(); - /* Never returns */ - PsTerminateSystemThread(STATUS_SUCCESS); - } - else - { - /* Do application processor initialization */ - PsApplicationProcessorInit(); - KeLowerIrql(PASSIVE_LEVEL); - PsIdleThreadMain(NULL); - } - KEBUGCHECK(0); - for(;;); + /* Load the Kernel if this is the Boot CPU, else inialize the App CPU only */ + if (BootProcessor) { + + /* Initialize the Kernel Executive */ + ExpInitializeExecutive(); + + /* Free Initial Memory */ + MiFreeInitMemory(); + + /* Never returns */ + PsTerminateSystemThread(STATUS_SUCCESS); + } else { + + /* Do application processor initialization */ + PsApplicationProcessorInit(); + + /* Lower IRQL and go to Idle Thread */ + KeLowerIrql(PASSIVE_LEVEL); + PsIdleThreadMain(NULL); + } + + /* Bug Check and loop forever if anything failed */ + KEBUGCHECK(0); + for(;;); }
-VOID INIT_FUNCTION -_main (ULONG MultiBootMagic, PLOADER_PARAMETER_BLOCK _LoaderBlock) /* * FUNCTION: Called by the boot loader to start the kernel * ARGUMENTS: @@ -880,173 +128,158 @@ * NOTE: The boot parameters are stored in low memory which will become * invalid after the memory managment is initialized so we make a local copy. */ +VOID +INIT_FUNCTION +_main(ULONG MultiBootMagic, + PLOADER_PARAMETER_BLOCK _LoaderBlock) { - ULONG i; - ULONG size; - ULONG HalBase; - ULONG DriverBase; - ULONG DriverSize; + ULONG i; + ULONG size; + ULONG HalBase; + ULONG DriverBase; + ULONG DriverSize; + PIMAGE_NT_HEADERS NtHeader; + PIMAGE_OPTIONAL_HEADER OptHead; + CHAR* s;
- /* Set up the Stacks */ - trap_stack = PAGE_ROUND_UP(&double_trap_stack); - trap_stack_top = trap_stack + 3 * PAGE_SIZE; - init_stack = PAGE_ROUND_UP(&kernel_stack); - init_stack_top = init_stack + 3 * PAGE_SIZE; + /* Set up the Stacks (Initial Kernel Stack and Double Trap Stack)*/ + trap_stack = PAGE_ROUND_UP(&double_trap_stack); + trap_stack_top = trap_stack + 3 * PAGE_SIZE; + init_stack = PAGE_ROUND_UP(&kernel_stack); + init_stack_top = init_stack + 3 * PAGE_SIZE;
- /* - * Copy the parameters to a local buffer because lowmem will go away - */ - memcpy(&KeLoaderBlock, _LoaderBlock, sizeof(LOADER_PARAMETER_BLOCK)); - memcpy(&KeLoaderModules[1], (PVOID)KeLoaderBlock.ModsAddr, - sizeof(LOADER_MODULE) * KeLoaderBlock.ModsCount); - KeLoaderBlock.ModsCount++; - KeLoaderBlock.ModsAddr = (ULONG)&KeLoaderModules; + /* Copy the Loader Block Data locally since Low-Memory will be wiped */ + memcpy(&KeLoaderBlock, _LoaderBlock, sizeof(LOADER_PARAMETER_BLOCK)); + memcpy(&KeLoaderModules[1], + (PVOID)KeLoaderBlock.ModsAddr, + sizeof(LOADER_MODULE) * KeLoaderBlock.ModsCount); + KeLoaderBlock.ModsCount++; + KeLoaderBlock.ModsAddr = (ULONG)&KeLoaderModules;
- /* Save the Base Address */ - MmSystemRangeStart = (PVOID)KeLoaderBlock.KernelBase; + /* Save the Base Address */ + MmSystemRangeStart = (PVOID)KeLoaderBlock.KernelBase;
- /* - * Convert a path specification in the grub format to one understood by the - * rest of the kernel. - */ - if (((PUCHAR)_LoaderBlock->CommandLine)[0] == '(') - { - ULONG DiskNumber = 0, PartNumber = 0; - PCH p; - CHAR Temp[256]; - PCH options; - PCH s1; - - if (((PUCHAR)_LoaderBlock->CommandLine)[1] == 'h' && - ((PUCHAR)_LoaderBlock->CommandLine)[2] == 'd') - { - DiskNumber = ((PCHAR)_LoaderBlock->CommandLine)[3] - '0'; - PartNumber = ((PCHAR)_LoaderBlock->CommandLine)[5] - '0'; - } - strcpy(Temp, &((PCHAR)_LoaderBlock->CommandLine)[7]); - if ((options = strchr(Temp, ' ')) != NULL) - { - *options = 0; - options++; - } - else - { - options = ""; - } - if ((s1 = strrchr(Temp, '/')) != NULL) - { - *s1 = 0; - if ((s1 = strrchr(Temp, '/')) != NULL) - { - *s1 = 0; - } - } - sprintf(KeLoaderCommandLine, - "multi(0)disk(0)rdisk(%lu)partition(%lu)%s %s", - DiskNumber, PartNumber + 1, Temp, options); - - p = KeLoaderCommandLine; - while (*p != 0 && *p != ' ') - { - if ((*p) == '/') - { - (*p) = '\'; - } - p++; - } - DPRINT1("Command Line: %s\n", KeLoaderCommandLine); - } - else - { - strcpy(KeLoaderCommandLine, (PCHAR)_LoaderBlock->CommandLine); - } - KeLoaderBlock.CommandLine = (ULONG)KeLoaderCommandLine; + /* Set the Command Line */ + strcpy(KeLoaderCommandLine, (PCHAR)_LoaderBlock->CommandLine); + KeLoaderBlock.CommandLine = (ULONG)KeLoaderCommandLine;
- strcpy(KeLoaderModuleStrings[0], "ntoskrnl.exe"); - KeLoaderModules[0].String = (ULONG)KeLoaderModuleStrings[0]; - KeLoaderModules[0].ModStart = KERNEL_BASE; - /* Take this value from the PE... */ - PIMAGE_NT_HEADERS NtHeader = RtlImageNtHeader((PVOID)KeLoaderModules[0].ModStart); - PIMAGE_OPTIONAL_HEADER OptHead = &NtHeader->OptionalHeader; + /* Write the first Module (the Kernel) */ + strcpy(KeLoaderModuleStrings[0], "ntoskrnl.exe"); + KeLoaderModules[0].String = (ULONG)KeLoaderModuleStrings[0]; + KeLoaderModules[0].ModStart = KERNEL_BASE; + + /* Read PE Data */ + NtHeader = RtlImageNtHeader((PVOID)KeLoaderModules[0].ModStart); + OptHead = &NtHeader->OptionalHeader; + + /* Set Kernel Ending */ KeLoaderModules[0].ModEnd = KeLoaderModules[0].ModStart + PAGE_ROUND_UP((ULONG)OptHead->SizeOfImage); - for (i = 1; i < KeLoaderBlock.ModsCount; i++) - { - CHAR* s; - if ((s = strrchr((PCHAR)KeLoaderModules[i].String, '/')) != 0) - { - strcpy(KeLoaderModuleStrings[i], s + 1); - } - else - { - strcpy(KeLoaderModuleStrings[i], (PCHAR)KeLoaderModules[i].String); - } - KeLoaderModules[i].ModStart -= 0x200000; - KeLoaderModules[i].ModStart += KERNEL_BASE; - KeLoaderModules[i].ModEnd -= 0x200000; - KeLoaderModules[i].ModEnd += KERNEL_BASE; - KeLoaderModules[i].String = (ULONG)KeLoaderModuleStrings[i]; + + /* Create a block for each module */ + for (i = 1; i < KeLoaderBlock.ModsCount; i++) { + + /* Check if we have to copy the path or not */ + if ((s = strrchr((PCHAR)KeLoaderModules[i].String, '/')) != 0) { + + strcpy(KeLoaderModuleStrings[i], s + 1); + + } else { + + strcpy(KeLoaderModuleStrings[i], (PCHAR)KeLoaderModules[i].String); + } + + /* Substract the base Address in Physical Memory */ + KeLoaderModules[i].ModStart -= 0x200000; + + /* Add the Kernel Base Address in Virtual Memory */ + KeLoaderModules[i].ModStart += KERNEL_BASE; + + /* Substract the base Address in Physical Memory */ + KeLoaderModules[i].ModEnd -= 0x200000; + + /* Add the Kernel Base Address in Virtual Memory */ + KeLoaderModules[i].ModEnd += KERNEL_BASE; + + /* Select the proper String */ + KeLoaderModules[i].String = (ULONG)KeLoaderModuleStrings[i]; }
- LastKernelAddress = PAGE_ROUND_UP(KeLoaderModules[KeLoaderBlock.ModsCount - 1].ModEnd); + /* Choose last module address as the final kernel address */ + LastKernelAddress = PAGE_ROUND_UP(KeLoaderModules[KeLoaderBlock.ModsCount - 1].ModEnd);
- /* Low level architecture specific initialization */ - KeInit1((PCHAR)KeLoaderBlock.CommandLine, &LastKernelAddress); + /* Low level architecture specific initialization */ + KeInit1((PCHAR)KeLoaderBlock.CommandLine, &LastKernelAddress); + + /* Select the HAL Base */ + HalBase = KeLoaderModules[1].ModStart; + + /* Choose Driver Base */ + DriverBase = LastKernelAddress; + LdrHalBase = (ULONG_PTR)DriverBase; + + /* Initialize Module Management */ + LdrInitModuleManagement(); + + /* Load HAL.DLL with the PE Loader */ + LdrSafePEProcessModule((PVOID)HalBase, + (PVOID)DriverBase, + (PVOID)KERNEL_BASE, + &DriverSize); + + /* Increase the last kernel address with the size of HAL */ + LastKernelAddress += PAGE_ROUND_UP(DriverSize);
- HalBase = KeLoaderModules[1].ModStart; - DriverBase = LastKernelAddress; - LdrHalBase = (ULONG_PTR)DriverBase; + /* Load the Kernel with the PE Loader */ + LdrSafePEProcessModule((PVOID)KERNEL_BASE, + (PVOID)KERNEL_BASE, + (PVOID)DriverBase, + &DriverSize);
- LdrInitModuleManagement(); + /* Now select the final beginning and ending Kernel Addresses */ + FirstKrnlPhysAddr = KeLoaderModules[0].ModStart - KERNEL_BASE + 0x200000; + LastKrnlPhysAddr = LastKernelAddress - KERNEL_BASE + 0x200000;
- /* - * Process hal.dll - */ - LdrSafePEProcessModule((PVOID)HalBase, (PVOID)DriverBase, (PVOID)KERNEL_BASE, &DriverSize); - - LastKernelAddress += PAGE_ROUND_UP(DriverSize); - - /* - * Process ntoskrnl.exe - */ - LdrSafePEProcessModule((PVOID)KERNEL_BASE, (PVOID)KERNEL_BASE, (PVOID)DriverBase, &DriverSize); - - /* Now our imports from HAL are fixed. This is the first */ - /* time in the boot process that we can use HAL */ - - FirstKrnlPhysAddr = KeLoaderModules[0].ModStart - KERNEL_BASE + 0x200000; - LastKrnlPhysAddr = LastKernelAddress - KERNEL_BASE + 0x200000; - - KeMemoryMapRangeCount = 0; - if (KeLoaderBlock.Flags & MB_FLAGS_MMAP_INFO) - { - /* We have a memory map from the nice BIOS */ - size = *((PULONG)(KeLoaderBlock.MmapAddr - sizeof(ULONG))); - i = 0; - while (i < KeLoaderBlock.MmapLength) - { - memcpy (&KeMemoryMap[KeMemoryMapRangeCount], - (PVOID)(KeLoaderBlock.MmapAddr + i), - sizeof(ADDRESS_RANGE)); - KeMemoryMapRangeCount++; - i += size; + KeMemoryMapRangeCount = 0; + if (KeLoaderBlock.Flags & MB_FLAGS_MMAP_INFO) { + + /* We have a memory map from the nice BIOS */ + size = *((PULONG)(KeLoaderBlock.MmapAddr - sizeof(ULONG))); + i = 0; + + /* Map it until we run out of size */ + while (i < KeLoaderBlock.MmapLength) { + + /* Copy into the Kernel Memory Map */ + memcpy (&KeMemoryMap[KeMemoryMapRangeCount], + (PVOID)(KeLoaderBlock.MmapAddr + i), + sizeof(ADDRESS_RANGE)); + + /* Increase Memory Map Count */ + KeMemoryMapRangeCount++; + + /* Increase Size */ + i += size; } - KeLoaderBlock.MmapLength = KeMemoryMapRangeCount * sizeof(ADDRESS_RANGE); - KeLoaderBlock.MmapAddr = (ULONG)KeMemoryMap; + + /* Save data */ + KeLoaderBlock.MmapLength = KeMemoryMapRangeCount * sizeof(ADDRESS_RANGE); + KeLoaderBlock.MmapAddr = (ULONG)KeMemoryMap; + + } else { + + /* Nothing from BIOS */ + KeLoaderBlock.MmapLength = 0; + KeLoaderBlock.MmapAddr = (ULONG)KeMemoryMap; } - else - { - KeLoaderBlock.MmapLength = 0; - KeLoaderBlock.MmapAddr = (ULONG)KeMemoryMap; - } + + /* Initialize the Debugger */ + KdInitSystem (0, (PLOADER_PARAMETER_BLOCK)&KeLoaderBlock); + + /* Initialize HAL */ + HalInitSystem (0, (PLOADER_PARAMETER_BLOCK)&KeLoaderBlock);
- KdInitSystem (0, (PLOADER_PARAMETER_BLOCK)&KeLoaderBlock); - HalInitSystem (0, (PLOADER_PARAMETER_BLOCK)&KeLoaderBlock); - - DPRINT1("_main (%x, %x)\n", MultiBootMagic, _LoaderBlock); - - - KiSystemStartup(1); + /* Do general System Startup */ + KiSystemStartup(1); }
/* EOF */
Index: ntoskrnl/rtl/nls.c =================================================================== --- ntoskrnl/rtl/nls.c (.../trunk/reactos) (revision 13937) +++ ntoskrnl/rtl/nls.c (.../branches/alex_devel_branch/reactos) (revision 13942) @@ -1,5 +1,4 @@ -/* $Id$ - * +/* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel * FILE: ntoskrnl/rtl/nls.c @@ -36,8 +35,33 @@
/* FUNCTIONS *****************************************************************/
+VOID +INIT_FUNCTION +STDCALL +RtlpInitNls(VOID) +{ + ULONG_PTR BaseAddress; + + /* Import NLS Data */ + BaseAddress = CachedModules[AnsiCodepage]->ModStart; + RtlpImportAnsiCodePage((PUSHORT)BaseAddress, + CachedModules[AnsiCodepage]->ModEnd - BaseAddress); + + BaseAddress = CachedModules[OemCodepage]->ModStart; + RtlpImportOemCodePage((PUSHORT)BaseAddress, + CachedModules[OemCodepage]->ModEnd - BaseAddress); + + BaseAddress = CachedModules[UnicodeCasemap]->ModStart; + RtlpImportUnicodeCasemap((PUSHORT)BaseAddress, + CachedModules[UnicodeCasemap]->ModEnd - BaseAddress); + + /* Create initial NLS tables */ + RtlpCreateInitialNlsTables(); + + /* Create the NLS section */ + RtlpCreateNlsSection(); +}
- VOID INIT_FUNCTION RtlpImportAnsiCodePage(PUSHORT TableBase, ULONG Size)