@@ -92,6 +92,17 @@ AllocateAndInitLPB(
9292
9393 RtlZeroMemory (WinLdrSystemBlock , sizeof (LOADER_SYSTEM_BLOCK ));
9494
95+ WinLdrSystemBlock -> LoaderVersions = MmAllocateMemoryWithType (sizeof (* WinLdrSystemBlock -> LoaderVersions ),
96+ LoaderSystemBlock );
97+ if (WinLdrSystemBlock -> LoaderVersions == NULL )
98+ {
99+ UiMessageBox ("Failed to allocate memory for system block versions!" );
100+ MmFreeMemory (WinLdrSystemBlock -> LoaderVersions );
101+ return ;
102+ }
103+
104+ RtlZeroMemory (WinLdrSystemBlock -> LoaderVersions , sizeof (* WinLdrSystemBlock -> LoaderVersions ));
105+
95106 LoaderBlock = & WinLdrSystemBlock -> LoaderBlock ;
96107 LoaderBlock -> NlsData = & WinLdrSystemBlock -> NlsDataBlock ;
97108
@@ -110,6 +121,17 @@ AllocateAndInitLPB(
110121 * OutLoaderBlock = LoaderBlock ;
111122}
112123
124+ VOID RelocateList (PLIST_ENTRY Destination , PLIST_ENTRY Source )
125+ {
126+ PLIST_ENTRY First = Source -> Flink ;
127+ PLIST_ENTRY Last = Source -> Blink ;
128+
129+ First -> Blink = Destination ;
130+ Last -> Flink = Destination ;
131+
132+ * Destination = * Source ;
133+ }
134+
113135// Init "phase 1"
114136VOID
115137WinLdrInitializePhase1 (PLOADER_PARAMETER_BLOCK LoaderBlock ,
@@ -263,6 +285,24 @@ WinLdrInitializePhase1(PLOADER_PARAMETER_BLOCK LoaderBlock,
263285 List_PaToVa (& Extension -> BootApplicationPersistentData );
264286 }
265287
288+ if (VersionToBoot == _WIN32_WINNT_WIN7 )
289+ {
290+ InitializeListHead (& WinLdrSystemBlock -> LoaderVersions -> ExtensionWin7 .AttachedHives );
291+ List_PaToVa (& WinLdrSystemBlock -> LoaderVersions -> ExtensionWin7 .AttachedHives );
292+
293+ WinLdrSystemBlock -> LoaderVersions -> ExtensionWin7 .TpmBootEntropyResult .ResultCode = TpmBootEntropyNoTpmFound ;
294+ WinLdrSystemBlock -> LoaderVersions -> ExtensionWin7 .TpmBootEntropyResult .ResultStatus = STATUS_NOT_IMPLEMENTED ;
295+
296+ WinLdrSystemBlock -> LoaderVersions -> LoaderBlockWin7 .Extension =
297+ PaToVa (& WinLdrSystemBlock -> LoaderVersions -> ExtensionWin7 );
298+
299+ WinLdrSystemBlock -> LoaderVersions -> LoaderBlockWin7 .OsMajorVersion = (VersionToBoot & 0xFF00 ) >> 8 ;
300+ WinLdrSystemBlock -> LoaderVersions -> LoaderBlockWin7 .OsMinorVersion = VersionToBoot & 0xFF ;
301+
302+ WinLdrSystemBlock -> LoaderVersions -> LoaderBlockWin7 .Size = sizeof (LOADER_PARAMETER_BLOCK_WIN7 );
303+ WinLdrSystemBlock -> LoaderVersions -> ExtensionWin7 .Size = sizeof (LOADER_PARAMETER_EXTENSION_WIN7 );
304+ }
305+
266306#ifdef _M_IX86
267307 /* Set headless block pointer */
268308 if (WinLdrTerminalConnected )
@@ -1028,6 +1068,10 @@ LoadAndBootWindows(
10281068 {
10291069 OperatingSystemVersion = _WIN32_WINNT_VISTA ;
10301070 }
1071+ else if (_stricmp (ArgValue , "Windows7" ) == 0 )
1072+ {
1073+ OperatingSystemVersion = _WIN32_WINNT_WIN7 ;
1074+ }
10311075 else
10321076 {
10331077 ERR ("Unknown 'BootType' value '%s', aborting!\n" , ArgValue );
@@ -1188,6 +1232,7 @@ LoadAndBootWindowsCommon(
11881232 IN PCSTR BootOptions ,
11891233 IN PCSTR BootPath )
11901234{
1235+ PVOID KernelLoaderBlock ;
11911236 PLOADER_PARAMETER_BLOCK LoaderBlockVA ;
11921237 BOOLEAN Success ;
11931238 PLDR_DATA_TABLE_ENTRY KernelDTE ;
@@ -1259,7 +1304,7 @@ LoadAndBootWindowsCommon(
12591304
12601305 /* Save entry-point pointer and Loader block VAs */
12611306 KiSystemStartup = (KERNEL_ENTRY_POINT )KernelDTE -> EntryPoint ;
1262- LoaderBlockVA = PaToVa (LoaderBlock );
1307+ KernelLoaderBlock = LoaderBlockVA = PaToVa (LoaderBlock );
12631308
12641309 /* "Stop all motors", change videomode */
12651310 MachPrepareForReactOS ();
@@ -1306,8 +1351,67 @@ LoadAndBootWindowsCommon(
13061351 /* Save final value of LoaderPagesSpanned */
13071352 LoaderBlock -> Extension -> LoaderPagesSpanned = MmGetLoaderPagesSpanned ();
13081353
1309- TRACE ("Hello from paged mode, KiSystemStartup %p, LoaderBlockVA %p!\n" ,
1310- KiSystemStartup , LoaderBlockVA );
1354+ if (OperatingSystemVersion == _WIN32_WINNT_WIN7 )
1355+ {
1356+ PLOADER_PARAMETER_BLOCK_WIN7 LoaderBlockWin7 = PaToVa (& WinLdrSystemBlock -> LoaderVersions -> LoaderBlockWin7 );
1357+ PLOADER_PARAMETER_EXTENSION_WIN7 ExtensionWin7 = PaToVa (& WinLdrSystemBlock -> LoaderVersions -> ExtensionWin7 );
1358+
1359+ /* LoaderBlock */
1360+ RelocateList (& LoaderBlockWin7 -> LoadOrderListHead , & LoaderBlockVA -> LoadOrderListHead );
1361+ RelocateList (& LoaderBlockWin7 -> MemoryDescriptorListHead , & LoaderBlockVA -> MemoryDescriptorListHead );
1362+ RelocateList (& LoaderBlockWin7 -> BootDriverListHead , & LoaderBlockVA -> BootDriverListHead );
1363+
1364+ LoaderBlockWin7 -> KernelStack = LoaderBlockVA -> KernelStack ;
1365+ LoaderBlockWin7 -> Prcb = LoaderBlockVA -> Prcb ;
1366+ LoaderBlockWin7 -> Process = LoaderBlockVA -> Process ;
1367+ LoaderBlockWin7 -> Thread = LoaderBlockVA -> Thread ;
1368+
1369+ LoaderBlockWin7 -> RegistryLength = LoaderBlockVA -> RegistryLength ;
1370+ LoaderBlockWin7 -> RegistryBase = LoaderBlockVA -> RegistryBase ;
1371+
1372+ LoaderBlockWin7 -> ConfigurationRoot = LoaderBlockVA -> ConfigurationRoot ;
1373+
1374+ LoaderBlockWin7 -> ArcBootDeviceName = LoaderBlockVA -> ArcBootDeviceName ;
1375+ LoaderBlockWin7 -> ArcHalDeviceName = LoaderBlockVA -> ArcHalDeviceName ;
1376+ LoaderBlockWin7 -> NtBootPathName = LoaderBlockVA -> NtBootPathName ;
1377+ LoaderBlockWin7 -> NtHalPathName = LoaderBlockVA -> NtHalPathName ;
1378+ LoaderBlockWin7 -> LoadOptions = LoaderBlockVA -> LoadOptions ;
1379+
1380+ LoaderBlockWin7 -> NlsData = LoaderBlockVA -> NlsData ;
1381+ LoaderBlockWin7 -> ArcDiskInformation = LoaderBlockVA -> ArcDiskInformation ;
1382+
1383+ LoaderBlockWin7 -> OemFontFile = LoaderBlockVA -> OemFontFile ;
1384+
1385+ LoaderBlockWin7 -> u = LoaderBlockVA -> u ;
1386+ LoaderBlockWin7 -> FirmwareInformation = LoaderBlockVA -> FirmwareInformation ;
1387+
1388+ /* LoaderExtension */
1389+ ExtensionWin7 -> Profile = LoaderBlockVA -> Extension -> Profile ;
1390+
1391+ ExtensionWin7 -> EmInfFileImage = LoaderBlockVA -> Extension -> EmInfFileImage ;
1392+ ExtensionWin7 -> EmInfFileSize = LoaderBlockVA -> Extension -> EmInfFileSize ;
1393+
1394+ ExtensionWin7 -> LoaderPagesSpanned = LoaderBlockVA -> Extension -> LoaderPagesSpanned ;
1395+
1396+ ExtensionWin7 -> HeadlessLoaderBlock = LoaderBlockVA -> Extension -> HeadlessLoaderBlock ;
1397+
1398+ ExtensionWin7 -> DrvDBImage = LoaderBlockVA -> Extension -> DrvDBImage ;
1399+ ExtensionWin7 -> DrvDBSize = LoaderBlockVA -> Extension -> DrvDBSize ;
1400+
1401+ ExtensionWin7 -> AcpiTable = LoaderBlockVA -> Extension -> AcpiTable ;
1402+ ExtensionWin7 -> AcpiTableSize = LoaderBlockVA -> Extension -> AcpiTableSize ;
1403+
1404+ ExtensionWin7 -> LastBootSucceeded = 1 ;
1405+
1406+ ExtensionWin7 -> LoaderPerformanceData = LoaderBlockVA -> Extension -> LoaderPerformanceData ;
1407+
1408+ RelocateList (& ExtensionWin7 -> BootApplicationPersistentData , & LoaderBlockVA -> Extension -> BootApplicationPersistentData );
1409+
1410+ KernelLoaderBlock = LoaderBlockWin7 ;
1411+ }
1412+
1413+ TRACE ("Hello from paged mode, KiSystemStartup %p, KernelLoaderBlock %p!\n" ,
1414+ KiSystemStartup , KernelLoaderBlock );
13111415
13121416 /* Zero KI_USER_SHARED_DATA page */
13131417 RtlZeroMemory ((PVOID )KI_USER_SHARED_DATA , MM_PAGE_SIZE );
@@ -1319,20 +1423,21 @@ LoadAndBootWindowsCommon(
13191423#endif
13201424
13211425 /* Pass control */
1322- (* KiSystemStartup )(LoaderBlockVA );
1426+ (* KiSystemStartup )(KernelLoaderBlock );
13231427
13241428 UNREACHABLE ; // return ESUCCESS;
13251429}
13261430
13271431VOID
13281432WinLdrpDumpMemoryDescriptors (PLOADER_PARAMETER_BLOCK LoaderBlock )
13291433{
1330- PLIST_ENTRY NextMd ;
1434+ PLIST_ENTRY NextMd , EndList ;
13311435 PMEMORY_ALLOCATION_DESCRIPTOR MemoryDescriptor ;
13321436
13331437 NextMd = LoaderBlock -> MemoryDescriptorListHead .Flink ;
1438+ EndList = LoaderBlock -> MemoryDescriptorListHead .Blink -> Flink ;
13341439
1335- while (NextMd != & LoaderBlock -> MemoryDescriptorListHead )
1440+ while (NextMd != EndList )
13361441 {
13371442 MemoryDescriptor = CONTAINING_RECORD (NextMd , MEMORY_ALLOCATION_DESCRIPTOR , ListEntry );
13381443
@@ -1346,12 +1451,13 @@ WinLdrpDumpMemoryDescriptors(PLOADER_PARAMETER_BLOCK LoaderBlock)
13461451VOID
13471452WinLdrpDumpBootDriver (PLOADER_PARAMETER_BLOCK LoaderBlock )
13481453{
1349- PLIST_ENTRY NextBd ;
1454+ PLIST_ENTRY NextBd , EndList ;
13501455 PBOOT_DRIVER_LIST_ENTRY BootDriver ;
13511456
13521457 NextBd = LoaderBlock -> BootDriverListHead .Flink ;
1458+ EndList = LoaderBlock -> BootDriverListHead .Blink -> Flink ;
13531459
1354- while (NextBd != & LoaderBlock -> BootDriverListHead )
1460+ while (NextBd != EndList )
13551461 {
13561462 BootDriver = CONTAINING_RECORD (NextBd , BOOT_DRIVER_LIST_ENTRY , Link );
13571463
@@ -1365,12 +1471,13 @@ WinLdrpDumpBootDriver(PLOADER_PARAMETER_BLOCK LoaderBlock)
13651471VOID
13661472WinLdrpDumpArcDisks (PLOADER_PARAMETER_BLOCK LoaderBlock )
13671473{
1368- PLIST_ENTRY NextBd ;
1474+ PLIST_ENTRY NextBd , EndList ;
13691475 PARC_DISK_SIGNATURE ArcDisk ;
13701476
13711477 NextBd = LoaderBlock -> ArcDiskInformation -> DiskSignatureListHead .Flink ;
1478+ EndList = LoaderBlock -> ArcDiskInformation -> DiskSignatureListHead .Blink -> Flink ;
13721479
1373- while (NextBd != & LoaderBlock -> ArcDiskInformation -> DiskSignatureListHead )
1480+ while (NextBd != EndList )
13741481 {
13751482 ArcDisk = CONTAINING_RECORD (NextBd , ARC_DISK_SIGNATURE , ListEntry );
13761483
0 commit comments