Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenwinldr.c
Go to the documentation of this file.
00001 /* 00002 * FreeLoader 00003 * 00004 * Copyright (C) 1998-2003 Brian Palmer <brianp@sginet.com> 00005 * Copyright (C) 2006 Aleksey Bragin <aleksey@reactos.org> 00006 * 00007 * This program is free software; you can redistribute it and/or modify 00008 * it under the terms of the GNU General Public License as published by 00009 * the Free Software Foundation; either version 2 of the License, or 00010 * (at your option) any later version. 00011 * 00012 * This program is distributed in the hope that it will be useful, 00013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00015 * GNU General Public License for more details. 00016 * 00017 * You should have received a copy of the GNU General Public License along 00018 * with this program; if not, write to the Free Software Foundation, Inc., 00019 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 00020 */ 00021 00022 #include <freeldr.h> 00023 00024 #include <ndk/ldrtypes.h> 00025 #include <debug.h> 00026 00027 DBG_DEFAULT_CHANNEL(WINDOWS); 00028 00029 //FIXME: Do a better way to retrieve Arc disk information 00030 extern ULONG reactos_disk_count; 00031 extern ARC_DISK_SIGNATURE reactos_arc_disk_info[]; 00032 00033 extern BOOLEAN UseRealHeap; 00034 extern ULONG LoaderPagesSpanned; 00035 extern BOOLEAN AcpiPresent; 00036 00037 extern HEADLESS_LOADER_BLOCK LoaderRedirectionInformation; 00038 extern BOOLEAN WinLdrTerminalConnected; 00039 extern void WinLdrSetupEms(IN PCHAR BootOptions); 00040 00041 PLOADER_SYSTEM_BLOCK WinLdrSystemBlock; 00042 00043 // debug stuff 00044 VOID DumpMemoryAllocMap(VOID); 00045 00046 // Init "phase 0" 00047 VOID 00048 AllocateAndInitLPB(PLOADER_PARAMETER_BLOCK *OutLoaderBlock) 00049 { 00050 PLOADER_PARAMETER_BLOCK LoaderBlock; 00051 ULONG SystemBlockSize; 00052 00053 /* Allocate and zero-init the LPB */ 00054 SystemBlockSize = sizeof(LOADER_SYSTEM_BLOCK) + 00055 reactos_disk_count * sizeof(ARC_DISK_SIGNATURE_EX); 00056 WinLdrSystemBlock = MmAllocateMemoryWithType(SystemBlockSize, 00057 LoaderSystemBlock); 00058 if (WinLdrSystemBlock == NULL) 00059 { 00060 UiMessageBox("Failed to allocate memory for system block!"); 00061 return; 00062 } 00063 00064 RtlZeroMemory(WinLdrSystemBlock, sizeof(LOADER_SYSTEM_BLOCK)); 00065 00066 LoaderBlock = &WinLdrSystemBlock->LoaderBlock; 00067 LoaderBlock->NlsData = &WinLdrSystemBlock->NlsDataBlock; 00068 00069 /* Init three critical lists, used right away */ 00070 InitializeListHead(&LoaderBlock->LoadOrderListHead); 00071 InitializeListHead(&LoaderBlock->MemoryDescriptorListHead); 00072 InitializeListHead(&LoaderBlock->BootDriverListHead); 00073 00074 *OutLoaderBlock = LoaderBlock; 00075 } 00076 00077 // Init "phase 1" 00078 VOID 00079 WinLdrInitializePhase1(PLOADER_PARAMETER_BLOCK LoaderBlock, 00080 LPCSTR Options, 00081 LPCSTR SystemRoot, 00082 LPCSTR BootPath, 00083 USHORT VersionToBoot) 00084 { 00085 /* Examples of correct options and paths */ 00086 //CHAR Options[] = "/DEBUGPORT=COM1 /BAUDRATE=115200"; 00087 //CHAR Options[] = "/NODEBUG"; 00088 //CHAR SystemRoot[] = "\\WINNT\\"; 00089 //CHAR ArcBoot[] = "multi(0)disk(0)rdisk(0)partition(1)"; 00090 00091 CHAR HalPath[] = "\\"; 00092 CHAR ArcBoot[256]; 00093 CHAR MiscFiles[256]; 00094 ULONG i; 00095 ULONG_PTR PathSeparator; 00096 PLOADER_PARAMETER_EXTENSION Extension; 00097 00098 /* Construct SystemRoot and ArcBoot from SystemPath */ 00099 PathSeparator = strstr(BootPath, "\\") - BootPath; 00100 strncpy(ArcBoot, BootPath, PathSeparator); 00101 ArcBoot[PathSeparator] = 0; 00102 00103 TRACE("ArcBoot: %s\n", ArcBoot); 00104 TRACE("SystemRoot: %s\n", SystemRoot); 00105 TRACE("Options: %s\n", Options); 00106 00107 /* Fill Arc BootDevice */ 00108 LoaderBlock->ArcBootDeviceName = WinLdrSystemBlock->ArcBootDeviceName; 00109 strncpy(LoaderBlock->ArcBootDeviceName, ArcBoot, MAX_PATH); 00110 LoaderBlock->ArcBootDeviceName = PaToVa(LoaderBlock->ArcBootDeviceName); 00111 00112 /* Fill Arc HalDevice, it matches ArcBoot path */ 00113 LoaderBlock->ArcHalDeviceName = WinLdrSystemBlock->ArcBootDeviceName; 00114 LoaderBlock->ArcHalDeviceName = PaToVa(LoaderBlock->ArcHalDeviceName); 00115 00116 /* Fill SystemRoot */ 00117 LoaderBlock->NtBootPathName = WinLdrSystemBlock->NtBootPathName; 00118 strncpy(LoaderBlock->NtBootPathName, SystemRoot, MAX_PATH); 00119 LoaderBlock->NtBootPathName = PaToVa(LoaderBlock->NtBootPathName); 00120 00121 /* Fill NtHalPathName */ 00122 LoaderBlock->NtHalPathName = WinLdrSystemBlock->NtHalPathName; 00123 strncpy(LoaderBlock->NtHalPathName, HalPath, MAX_PATH); 00124 LoaderBlock->NtHalPathName = PaToVa(LoaderBlock->NtHalPathName); 00125 00126 /* Fill load options */ 00127 LoaderBlock->LoadOptions = WinLdrSystemBlock->LoadOptions; 00128 strncpy(LoaderBlock->LoadOptions, Options, MAX_OPTIONS_LENGTH); 00129 LoaderBlock->LoadOptions = PaToVa(LoaderBlock->LoadOptions); 00130 00131 /* Arc devices */ 00132 LoaderBlock->ArcDiskInformation = &WinLdrSystemBlock->ArcDiskInformation; 00133 InitializeListHead(&LoaderBlock->ArcDiskInformation->DiskSignatureListHead); 00134 00135 /* Convert ARC disk information from freeldr to a correct format */ 00136 for (i = 0; i < reactos_disk_count; i++) 00137 { 00138 PARC_DISK_SIGNATURE ArcDiskSig; 00139 00140 /* Get the ARC structure */ 00141 ArcDiskSig = &WinLdrSystemBlock->ArcDiskSignature[i].DiskSignature; 00142 00143 /* Copy the data over */ 00144 ArcDiskSig->Signature = reactos_arc_disk_info[i].Signature; 00145 ArcDiskSig->CheckSum = reactos_arc_disk_info[i].CheckSum; 00146 00147 /* Copy the ARC Name */ 00148 ArcDiskSig->ArcName = WinLdrSystemBlock->ArcDiskSignature[i].ArcName; 00149 strncpy(ArcDiskSig->ArcName, reactos_arc_disk_info[i].ArcName, MAX_PATH); 00150 ArcDiskSig->ArcName = PaToVa(ArcDiskSig->ArcName); 00151 00152 /* Mark partition table as valid */ 00153 ArcDiskSig->ValidPartitionTable = TRUE; 00154 00155 /* Insert into the list */ 00156 InsertTailList(&LoaderBlock->ArcDiskInformation->DiskSignatureListHead, 00157 &ArcDiskSig->ListEntry); 00158 } 00159 00160 /* Convert all list's to Virtual address */ 00161 00162 /* Convert the ArcDisks list to virtual address */ 00163 List_PaToVa(&LoaderBlock->ArcDiskInformation->DiskSignatureListHead); 00164 LoaderBlock->ArcDiskInformation = PaToVa(LoaderBlock->ArcDiskInformation); 00165 00166 /* Convert configuration entries to VA */ 00167 ConvertConfigToVA(LoaderBlock->ConfigurationRoot); 00168 LoaderBlock->ConfigurationRoot = PaToVa(LoaderBlock->ConfigurationRoot); 00169 00170 /* Convert all DTE into virtual addresses */ 00171 List_PaToVa(&LoaderBlock->LoadOrderListHead); 00172 00173 /* this one will be converted right before switching to 00174 virtual paging mode */ 00175 //List_PaToVa(&LoaderBlock->MemoryDescriptorListHead); 00176 00177 /* Convert list of boot drivers */ 00178 List_PaToVa(&LoaderBlock->BootDriverListHead); 00179 00180 /* Initialize Extension now */ 00181 Extension = &WinLdrSystemBlock->Extension; 00182 Extension->Size = sizeof(LOADER_PARAMETER_EXTENSION); 00183 Extension->MajorVersion = (VersionToBoot & 0xFF00) >> 8; 00184 Extension->MinorVersion = VersionToBoot & 0xFF; 00185 Extension->Profile.Status = 2; 00186 00187 /* Check if ACPI is present */ 00188 if (AcpiPresent) 00189 { 00190 /* See KiRosFrldrLpbToNtLpb for details */ 00191 Extension->AcpiTable = (PVOID)1; 00192 } 00193 00194 #ifdef _M_IX86 00195 /* Set headless block pointer */ 00196 if (WinLdrTerminalConnected) 00197 { 00198 Extension->HeadlessLoaderBlock = &WinLdrSystemBlock->HeadlessLoaderBlock; 00199 RtlCopyMemory(Extension->HeadlessLoaderBlock, 00200 &LoaderRedirectionInformation, 00201 sizeof(HEADLESS_LOADER_BLOCK)); 00202 Extension->HeadlessLoaderBlock = PaToVa(Extension->HeadlessLoaderBlock); 00203 } 00204 #endif 00205 /* Load drivers database */ 00206 strcpy(MiscFiles, BootPath); 00207 strcat(MiscFiles, "AppPatch\\drvmain.sdb"); 00208 Extension->DrvDBImage = PaToVa(WinLdrLoadModule(MiscFiles, 00209 &Extension->DrvDBSize, 00210 LoaderRegistryData)); 00211 00212 /* Convert extension and setup block pointers */ 00213 LoaderBlock->Extension = PaToVa(Extension); 00214 00215 if (LoaderBlock->SetupLdrBlock) 00216 LoaderBlock->SetupLdrBlock = PaToVa(LoaderBlock->SetupLdrBlock); 00217 00218 TRACE("WinLdrInitializePhase1() completed\n"); 00219 } 00220 00221 static BOOLEAN 00222 WinLdrLoadDeviceDriver(PLIST_ENTRY LoadOrderListHead, 00223 LPSTR BootPath, 00224 PUNICODE_STRING FilePath, 00225 ULONG Flags, 00226 PLDR_DATA_TABLE_ENTRY *DriverDTE) 00227 { 00228 CHAR FullPath[1024]; 00229 CHAR DriverPath[1024]; 00230 CHAR DllName[1024]; 00231 PCHAR DriverNamePos; 00232 BOOLEAN Status; 00233 PVOID DriverBase; 00234 00235 // Separate the path to file name and directory path 00236 _snprintf(DriverPath, sizeof(DriverPath), "%wZ", FilePath); 00237 DriverNamePos = strrchr(DriverPath, '\\'); 00238 if (DriverNamePos != NULL) 00239 { 00240 // Copy the name 00241 strcpy(DllName, DriverNamePos+1); 00242 00243 // Cut out the name from the path 00244 *(DriverNamePos+1) = 0; 00245 } 00246 else 00247 { 00248 // There is no directory in the path 00249 strcpy(DllName, DriverPath); 00250 DriverPath[0] = 0; 00251 } 00252 00253 TRACE("DriverPath: %s, DllName: %s, LPB\n", DriverPath, DllName); 00254 00255 00256 // Check if driver is already loaded 00257 Status = WinLdrCheckForLoadedDll(LoadOrderListHead, DllName, DriverDTE); 00258 if (Status) 00259 { 00260 // We've got the pointer to its DTE, just return success 00261 return TRUE; 00262 } 00263 00264 // It's not loaded, we have to load it 00265 _snprintf(FullPath, sizeof(FullPath), "%s%wZ", BootPath, FilePath); 00266 Status = WinLdrLoadImage(FullPath, LoaderBootDriver, &DriverBase); 00267 if (!Status) 00268 return FALSE; 00269 00270 // Allocate a DTE for it 00271 Status = WinLdrAllocateDataTableEntry(LoadOrderListHead, DllName, DllName, DriverBase, DriverDTE); 00272 if (!Status) 00273 { 00274 ERR("WinLdrAllocateDataTableEntry() failed\n"); 00275 return FALSE; 00276 } 00277 00278 // Modify any flags, if needed 00279 (*DriverDTE)->Flags |= Flags; 00280 00281 // Look for any dependencies it may have, and load them too 00282 sprintf(FullPath,"%s%s", BootPath, DriverPath); 00283 Status = WinLdrScanImportDescriptorTable(LoadOrderListHead, FullPath, *DriverDTE); 00284 if (!Status) 00285 { 00286 ERR("WinLdrScanImportDescriptorTable() failed for %s\n", FullPath); 00287 return FALSE; 00288 } 00289 00290 return TRUE; 00291 } 00292 00293 BOOLEAN 00294 WinLdrLoadBootDrivers(PLOADER_PARAMETER_BLOCK LoaderBlock, 00295 LPSTR BootPath) 00296 { 00297 PLIST_ENTRY NextBd; 00298 PBOOT_DRIVER_LIST_ENTRY BootDriver; 00299 BOOLEAN Status; 00300 00301 // Walk through the boot drivers list 00302 NextBd = LoaderBlock->BootDriverListHead.Flink; 00303 00304 while (NextBd != &LoaderBlock->BootDriverListHead) 00305 { 00306 BootDriver = CONTAINING_RECORD(NextBd, BOOT_DRIVER_LIST_ENTRY, Link); 00307 00308 TRACE("BootDriver %wZ DTE %08X RegPath: %wZ\n", &BootDriver->FilePath, 00309 BootDriver->LdrEntry, &BootDriver->RegistryPath); 00310 00311 // Paths are relative (FIXME: Are they always relative?) 00312 00313 // Load it 00314 Status = WinLdrLoadDeviceDriver(&LoaderBlock->LoadOrderListHead, BootPath, &BootDriver->FilePath, 00315 0, &BootDriver->LdrEntry); 00316 00317 // If loading failed - cry loudly 00318 //FIXME: Maybe remove it from the list and try to continue? 00319 if (!Status) 00320 { 00321 UiMessageBox("Can't load boot driver!"); 00322 return FALSE; 00323 } 00324 00325 // Convert the RegistryPath and DTE addresses to VA since we are not going to use it anymore 00326 BootDriver->RegistryPath.Buffer = PaToVa(BootDriver->RegistryPath.Buffer); 00327 BootDriver->FilePath.Buffer = PaToVa(BootDriver->FilePath.Buffer); 00328 BootDriver->LdrEntry = PaToVa(BootDriver->LdrEntry); 00329 00330 NextBd = BootDriver->Link.Flink; 00331 } 00332 00333 return TRUE; 00334 } 00335 00336 PVOID WinLdrLoadModule(PCSTR ModuleName, ULONG *Size, 00337 TYPE_OF_MEMORY MemoryType) 00338 { 00339 ULONG FileId; 00340 PVOID PhysicalBase; 00341 FILEINFORMATION FileInfo; 00342 ULONG FileSize; 00343 ULONG Status; 00344 ULONG BytesRead; 00345 00346 //CHAR ProgressString[256]; 00347 00348 /* Inform user we are loading files */ 00349 //sprintf(ProgressString, "Loading %s...", FileName); 00350 //UiDrawProgressBarCenter(1, 100, ProgressString); 00351 00352 TRACE("Loading module %s\n", ModuleName); 00353 *Size = 0; 00354 00355 /* Open the image file */ 00356 Status = ArcOpen((PCHAR)ModuleName, OpenReadOnly, &FileId); 00357 if (Status != ESUCCESS) 00358 { 00359 /* In case of errors, we just return, without complaining to the user */ 00360 return NULL; 00361 } 00362 00363 /* Get this file's size */ 00364 Status = ArcGetFileInformation(FileId, &FileInfo); 00365 if (Status != ESUCCESS) 00366 { 00367 ArcClose(FileId); 00368 return NULL; 00369 } 00370 FileSize = FileInfo.EndingAddress.LowPart; 00371 *Size = FileSize; 00372 00373 /* Allocate memory */ 00374 PhysicalBase = MmAllocateMemoryWithType(FileSize, MemoryType); 00375 if (PhysicalBase == NULL) 00376 { 00377 ArcClose(FileId); 00378 return NULL; 00379 } 00380 00381 /* Load whole file */ 00382 Status = ArcRead(FileId, PhysicalBase, FileSize, &BytesRead); 00383 ArcClose(FileId); 00384 if (Status != ESUCCESS) 00385 { 00386 return NULL; 00387 } 00388 00389 TRACE("Loaded %s at 0x%x with size 0x%x\n", ModuleName, PhysicalBase, FileSize); 00390 00391 return PhysicalBase; 00392 } 00393 00394 00395 USHORT 00396 WinLdrDetectVersion() 00397 { 00398 LONG rc; 00399 FRLDRHKEY hKey; 00400 00401 rc = RegOpenKey( 00402 NULL, 00403 L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Control\\Terminal Server", 00404 &hKey); 00405 if (rc != ERROR_SUCCESS) 00406 { 00407 // Key doesn't exist; assume NT 4.0 00408 return _WIN32_WINNT_NT4; 00409 } 00410 00411 // We may here want to read the value of ProductVersion 00412 return _WIN32_WINNT_WS03; 00413 } 00414 00415 static 00416 PVOID 00417 LoadModule( 00418 PLOADER_PARAMETER_BLOCK LoaderBlock, 00419 PCCH Path, 00420 PCCH File, 00421 TYPE_OF_MEMORY MemoryType, 00422 PLDR_DATA_TABLE_ENTRY *Dte, 00423 ULONG Percentage) 00424 { 00425 CHAR FullFileName[MAX_PATH]; 00426 CHAR ProgressString[256]; 00427 NTSTATUS Status; 00428 PVOID BaseAdress; 00429 00430 UiDrawBackdrop(); 00431 sprintf(ProgressString, "Loading %s...", File); 00432 UiDrawProgressBarCenter(Percentage, 100, ProgressString); 00433 00434 strcpy(FullFileName, Path); 00435 strcat(FullFileName, "SYSTEM32\\"); 00436 strcat(FullFileName, File); 00437 00438 Status = WinLdrLoadImage(FullFileName, MemoryType, &BaseAdress); 00439 TRACE("%s loaded with status %d at %p\n", 00440 File, Status, BaseAdress); 00441 00442 strcpy(FullFileName, "WINDOWS\\SYSTEM32\\"); 00443 strcat(FullFileName, File); 00444 WinLdrAllocateDataTableEntry(&LoaderBlock->LoadOrderListHead, File, 00445 FullFileName, BaseAdress, Dte); 00446 00447 return BaseAdress; 00448 } 00449 00450 VOID 00451 LoadAndBootWindows(PCSTR OperatingSystemName, 00452 PSTR SettingsValue, 00453 USHORT OperatingSystemVersion) 00454 { 00455 BOOLEAN HasSection; 00456 char BootPath[MAX_PATH]; 00457 CHAR FileName[MAX_PATH]; 00458 CHAR BootOptions[256]; 00459 PCHAR File; 00460 BOOLEAN Status; 00461 ULONG_PTR SectionId; 00462 PLOADER_PARAMETER_BLOCK LoaderBlock; 00463 00464 // Open the operating system section 00465 // specified in the .ini file 00466 HasSection = IniOpenSection(OperatingSystemName, &SectionId); 00467 00468 UiDrawBackdrop(); 00469 UiDrawProgressBarCenter(1, 100, "Loading NT..."); 00470 00471 /* Read the system path is set in the .ini file */ 00472 if (!HasSection || 00473 !IniReadSettingByName(SectionId, "SystemPath", BootPath, sizeof(BootPath))) 00474 { 00475 strcpy(BootPath, OperatingSystemName); 00476 } 00477 00478 /* Special case for LiveCD */ 00479 if (!_strnicmp(BootPath, "LiveCD", strlen("LiveCD"))) 00480 { 00481 strcpy(FileName, BootPath + strlen("LiveCD")); 00482 MachDiskGetBootPath(BootPath, sizeof(BootPath)); 00483 strcat(BootPath, FileName); 00484 } 00485 00486 /* append a backslash */ 00487 if ((strlen(BootPath)==0) || BootPath[strlen(BootPath)] != '\\') 00488 strcat(BootPath, "\\"); 00489 00490 /* Read booting options */ 00491 if (!HasSection || !IniReadSettingByName(SectionId, "Options", BootOptions, sizeof(BootOptions))) 00492 { 00493 /* Get options after the title */ 00494 const CHAR*p = SettingsValue; 00495 while (*p == ' ' || *p == '"') 00496 p++; 00497 while (*p != '\0' && *p != '"') 00498 p++; 00499 strcpy(BootOptions, p); 00500 TRACE("BootOptions: '%s'\n", BootOptions); 00501 } 00502 00503 /* Append boot-time options */ 00504 AppendBootTimeOptions(BootOptions); 00505 00506 /* Check if a ramdisk file was given */ 00507 File = strstr(BootOptions, "/RDPATH="); 00508 if (File) 00509 { 00510 /* Copy the file name and everything else after it */ 00511 strcpy(FileName, File + 8); 00512 00513 /* Null-terminate */ 00514 *strstr(FileName, " ") = ANSI_NULL; 00515 00516 /* Load the ramdisk */ 00517 RamDiskLoadVirtualFile(FileName); 00518 } 00519 00520 /* Let user know we started loading */ 00521 //UiDrawStatusText("Loading..."); 00522 00523 TRACE("BootPath: '%s'\n", BootPath); 00524 00525 /* Allocate and minimalistic-initialize LPB */ 00526 AllocateAndInitLPB(&LoaderBlock); 00527 00528 #ifdef _M_IX86 00529 /* Setup redirection support */ 00530 WinLdrSetupEms(BootOptions); 00531 #endif 00532 00533 /* Load Hive */ 00534 UiDrawBackdrop(); 00535 UiDrawProgressBarCenter(15, 100, "Loading system hive..."); 00536 Status = WinLdrInitSystemHive(LoaderBlock, BootPath); 00537 TRACE("SYSTEM hive loaded with status %d\n", Status); 00538 00539 /* Load NLS data, OEM font, and prepare boot drivers list */ 00540 Status = WinLdrScanSystemHive(LoaderBlock, BootPath); 00541 TRACE("SYSTEM hive scanned with status %d\n", Status); 00542 00543 00544 LoadAndBootWindowsCommon(OperatingSystemVersion, 00545 LoaderBlock, 00546 BootOptions, 00547 BootPath, 00548 0); 00549 } 00550 00551 VOID 00552 LoadAndBootWindowsCommon( 00553 USHORT OperatingSystemVersion, 00554 PLOADER_PARAMETER_BLOCK LoaderBlock, 00555 LPCSTR BootOptions, 00556 LPCSTR BootPath, 00557 BOOLEAN Setup) 00558 { 00559 PLOADER_PARAMETER_BLOCK LoaderBlockVA; 00560 BOOLEAN Status; 00561 CHAR FileName[MAX_PATH]; 00562 PLDR_DATA_TABLE_ENTRY KernelDTE, HalDTE, KdComDTE = NULL; 00563 KERNEL_ENTRY_POINT KiSystemStartup; 00564 LPCSTR SystemRoot; 00565 TRACE("LoadAndBootWindowsCommon()\n"); 00566 00567 /* Convert BootPath to SystemRoot */ 00568 SystemRoot = strstr(BootPath, "\\"); 00569 00570 /* Detect hardware */ 00571 UseRealHeap = TRUE; 00572 LoaderBlock->ConfigurationRoot = MachHwDetect(); 00573 00574 if (OperatingSystemVersion == 0) 00575 OperatingSystemVersion = WinLdrDetectVersion(); 00576 00577 /* Load kernel */ 00578 LoadModule(LoaderBlock, BootPath, "NTOSKRNL.EXE", LoaderSystemCode, &KernelDTE, 30); 00579 00580 /* Load HAL */ 00581 LoadModule(LoaderBlock, BootPath, "HAL.DLL", LoaderHalCode, &HalDTE, 45); 00582 00583 /* Load kernel-debugger support dll */ 00584 if (OperatingSystemVersion > _WIN32_WINNT_WIN2K) 00585 { 00586 LoadModule(LoaderBlock, BootPath, "KDCOM.DLL", LoaderSystemCode, &KdComDTE, 60); 00587 } 00588 00589 /* Load all referenced DLLs for kernel, HAL and kdcom.dll */ 00590 strcpy(FileName, BootPath); 00591 strcat(FileName, "system32\\"); 00592 Status = WinLdrScanImportDescriptorTable(&LoaderBlock->LoadOrderListHead, FileName, KernelDTE); 00593 Status &= WinLdrScanImportDescriptorTable(&LoaderBlock->LoadOrderListHead, FileName, HalDTE); 00594 if (KdComDTE) 00595 Status &= WinLdrScanImportDescriptorTable(&LoaderBlock->LoadOrderListHead, FileName, KdComDTE); 00596 00597 if (!Status) 00598 { 00599 UiMessageBox("Error loading imported dll."); 00600 return; 00601 } 00602 00603 /* Load boot drivers */ 00604 UiDrawBackdrop(); 00605 UiDrawProgressBarCenter(100, 100, "Loading boot drivers..."); 00606 Status = WinLdrLoadBootDrivers(LoaderBlock, (PCHAR)BootPath); 00607 TRACE("Boot drivers loaded with status %d\n", Status); 00608 00609 /* Initialize Phase 1 - no drivers loading anymore */ 00610 WinLdrInitializePhase1(LoaderBlock, BootOptions, SystemRoot, BootPath, OperatingSystemVersion); 00611 00612 /* Save entry-point pointer and Loader block VAs */ 00613 KiSystemStartup = (KERNEL_ENTRY_POINT)KernelDTE->EntryPoint; 00614 LoaderBlockVA = PaToVa(LoaderBlock); 00615 00616 /* "Stop all motors", change videomode */ 00617 MachPrepareForReactOS(Setup); 00618 00619 /* Debugging... */ 00620 //DumpMemoryAllocMap(); 00621 00622 /* Do the machine specific initialization */ 00623 WinLdrSetupMachineDependent(LoaderBlock); 00624 00625 /* Map pages and create memory descriptors */ 00626 WinLdrSetupMemoryLayout(LoaderBlock); 00627 00628 /* Set processor context */ 00629 WinLdrSetProcessorContext(); 00630 00631 /* Save final value of LoaderPagesSpanned */ 00632 LoaderBlock->Extension->LoaderPagesSpanned = LoaderPagesSpanned; 00633 00634 TRACE("Hello from paged mode, KiSystemStartup %p, LoaderBlockVA %p!\n", 00635 KiSystemStartup, LoaderBlockVA); 00636 00637 // Zero KI_USER_SHARED_DATA page 00638 memset((PVOID)KI_USER_SHARED_DATA, 0, MM_PAGE_SIZE); 00639 00640 WinLdrpDumpMemoryDescriptors(LoaderBlockVA); 00641 WinLdrpDumpBootDriver(LoaderBlockVA); 00642 WinLdrpDumpArcDisks(LoaderBlockVA); 00643 00644 //FIXME: If I substitute this debugging checkpoint, GCC will "optimize away" the code below 00645 //while (1) {}; 00646 /*asm(".intel_syntax noprefix\n"); 00647 asm("test1:\n"); 00648 asm("jmp test1\n"); 00649 asm(".att_syntax\n");*/ 00650 00651 /* Pass control */ 00652 (*KiSystemStartup)(LoaderBlockVA); 00653 } 00654 00655 VOID 00656 WinLdrpDumpMemoryDescriptors(PLOADER_PARAMETER_BLOCK LoaderBlock) 00657 { 00658 PLIST_ENTRY NextMd; 00659 PMEMORY_ALLOCATION_DESCRIPTOR MemoryDescriptor; 00660 00661 NextMd = LoaderBlock->MemoryDescriptorListHead.Flink; 00662 00663 while (NextMd != &LoaderBlock->MemoryDescriptorListHead) 00664 { 00665 MemoryDescriptor = CONTAINING_RECORD(NextMd, MEMORY_ALLOCATION_DESCRIPTOR, ListEntry); 00666 00667 TRACE("BP %08X PC %04X MT %d\n", MemoryDescriptor->BasePage, 00668 MemoryDescriptor->PageCount, MemoryDescriptor->MemoryType); 00669 00670 NextMd = MemoryDescriptor->ListEntry.Flink; 00671 } 00672 } 00673 00674 VOID 00675 WinLdrpDumpBootDriver(PLOADER_PARAMETER_BLOCK LoaderBlock) 00676 { 00677 PLIST_ENTRY NextBd; 00678 PBOOT_DRIVER_LIST_ENTRY BootDriver; 00679 00680 NextBd = LoaderBlock->BootDriverListHead.Flink; 00681 00682 while (NextBd != &LoaderBlock->BootDriverListHead) 00683 { 00684 BootDriver = CONTAINING_RECORD(NextBd, BOOT_DRIVER_LIST_ENTRY, Link); 00685 00686 TRACE("BootDriver %wZ DTE %08X RegPath: %wZ\n", &BootDriver->FilePath, 00687 BootDriver->LdrEntry, &BootDriver->RegistryPath); 00688 00689 NextBd = BootDriver->Link.Flink; 00690 } 00691 } 00692 00693 VOID 00694 WinLdrpDumpArcDisks(PLOADER_PARAMETER_BLOCK LoaderBlock) 00695 { 00696 PLIST_ENTRY NextBd; 00697 PARC_DISK_SIGNATURE ArcDisk; 00698 00699 NextBd = LoaderBlock->ArcDiskInformation->DiskSignatureListHead.Flink; 00700 00701 while (NextBd != &LoaderBlock->ArcDiskInformation->DiskSignatureListHead) 00702 { 00703 ArcDisk = CONTAINING_RECORD(NextBd, ARC_DISK_SIGNATURE, ListEntry); 00704 00705 TRACE("ArcDisk %s checksum: 0x%X, signature: 0x%X\n", 00706 ArcDisk->ArcName, ArcDisk->CheckSum, ArcDisk->Signature); 00707 00708 NextBd = ArcDisk->ListEntry.Flink; 00709 } 00710 } 00711 00712 Generated on Sun May 27 2012 04:19:07 for ReactOS by
1.7.6.1
|