ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

winldr.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.