Skip to content

Commit c91684d

Browse files
committed
[FREELDR] Add Windows 7 boot support
1 parent 1a55bee commit c91684d

File tree

5 files changed

+236
-19
lines changed

5 files changed

+236
-19
lines changed

boot/freeldr/freeldr/arch/archwsup.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ PCONFIGURATION_COMPONENT_DATA FldrArcHwTreeRoot;
6666

6767
// ARC Disk Information
6868
ULONG reactos_disk_count = 0;
69-
ARC_DISK_SIGNATURE_EX reactos_arc_disk_info[32];
69+
ARC_DISK_SIGNATURE_EX reactos_arc_disk_info[32] = {0};
7070

7171
/* FUNCTIONS ******************************************************************/
7272

boot/freeldr/freeldr/bootmgr.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ OSLoadingMethods[] =
6868
{"Windows" , EditCustomBootNTOS, LoadAndBootWindows},
6969
{"Windows2003" , EditCustomBootNTOS, LoadAndBootWindows},
7070
{"WindowsVista", EditCustomBootNTOS, LoadAndBootWindows},
71+
{"Windows7", EditCustomBootNTOS, LoadAndBootWindows},
7172
};
7273

7374
/* FUNCTIONS ******************************************************************/

boot/freeldr/freeldr/ntldr/winldr.c

Lines changed: 115 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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"
114136
VOID
115137
WinLdrInitializePhase1(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,65 @@ 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->LoaderPerformanceData = LoaderBlockVA->Extension->LoaderPerformanceData;
1405+
1406+
RelocateList(&ExtensionWin7->BootApplicationPersistentData, &LoaderBlockVA->Extension->BootApplicationPersistentData);
1407+
1408+
KernelLoaderBlock = LoaderBlockWin7;
1409+
}
1410+
1411+
TRACE("Hello from paged mode, KiSystemStartup %p, KernelLoaderBlock %p!\n",
1412+
KiSystemStartup, KernelLoaderBlock);
13111413

13121414
/* Zero KI_USER_SHARED_DATA page */
13131415
RtlZeroMemory((PVOID)KI_USER_SHARED_DATA, MM_PAGE_SIZE);
@@ -1319,20 +1421,21 @@ LoadAndBootWindowsCommon(
13191421
#endif
13201422

13211423
/* Pass control */
1322-
(*KiSystemStartup)(LoaderBlockVA);
1424+
(*KiSystemStartup)(KernelLoaderBlock);
13231425

13241426
UNREACHABLE; // return ESUCCESS;
13251427
}
13261428

13271429
VOID
13281430
WinLdrpDumpMemoryDescriptors(PLOADER_PARAMETER_BLOCK LoaderBlock)
13291431
{
1330-
PLIST_ENTRY NextMd;
1432+
PLIST_ENTRY NextMd, EndList;
13311433
PMEMORY_ALLOCATION_DESCRIPTOR MemoryDescriptor;
13321434

13331435
NextMd = LoaderBlock->MemoryDescriptorListHead.Flink;
1436+
EndList = LoaderBlock->MemoryDescriptorListHead.Blink->Flink;
13341437

1335-
while (NextMd != &LoaderBlock->MemoryDescriptorListHead)
1438+
while (NextMd != EndList)
13361439
{
13371440
MemoryDescriptor = CONTAINING_RECORD(NextMd, MEMORY_ALLOCATION_DESCRIPTOR, ListEntry);
13381441

@@ -1346,12 +1449,13 @@ WinLdrpDumpMemoryDescriptors(PLOADER_PARAMETER_BLOCK LoaderBlock)
13461449
VOID
13471450
WinLdrpDumpBootDriver(PLOADER_PARAMETER_BLOCK LoaderBlock)
13481451
{
1349-
PLIST_ENTRY NextBd;
1452+
PLIST_ENTRY NextBd, EndList;
13501453
PBOOT_DRIVER_LIST_ENTRY BootDriver;
13511454

13521455
NextBd = LoaderBlock->BootDriverListHead.Flink;
1456+
EndList = LoaderBlock->BootDriverListHead.Blink->Flink;
13531457

1354-
while (NextBd != &LoaderBlock->BootDriverListHead)
1458+
while (NextBd != EndList)
13551459
{
13561460
BootDriver = CONTAINING_RECORD(NextBd, BOOT_DRIVER_LIST_ENTRY, Link);
13571461

@@ -1365,12 +1469,13 @@ WinLdrpDumpBootDriver(PLOADER_PARAMETER_BLOCK LoaderBlock)
13651469
VOID
13661470
WinLdrpDumpArcDisks(PLOADER_PARAMETER_BLOCK LoaderBlock)
13671471
{
1368-
PLIST_ENTRY NextBd;
1472+
PLIST_ENTRY NextBd, EndList;
13691473
PARC_DISK_SIGNATURE ArcDisk;
13701474

13711475
NextBd = LoaderBlock->ArcDiskInformation->DiskSignatureListHead.Flink;
1476+
EndList = LoaderBlock->ArcDiskInformation->DiskSignatureListHead.Blink->Flink;
13721477

1373-
while (NextBd != &LoaderBlock->ArcDiskInformation->DiskSignatureListHead)
1478+
while (NextBd != EndList)
13741479
{
13751480
ArcDisk = CONTAINING_RECORD(NextBd, ARC_DISK_SIGNATURE, ListEntry);
13761481

boot/freeldr/freeldr/ntldr/winldr.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,10 @@ typedef struct _LOADER_SYSTEM_BLOCK
5959
CHAR NtHalPathName[MAX_PATH+1];
6060
ARC_DISK_INFORMATION ArcDiskInformation;
6161
LOADER_PERFORMANCE_DATA LoaderPerformanceData;
62+
struct {
63+
LOADER_PARAMETER_BLOCK_WIN7 LoaderBlockWin7;
64+
LOADER_PARAMETER_EXTENSION_WIN7 ExtensionWin7;
65+
} *LoaderVersions;
6266
} LOADER_SYSTEM_BLOCK, *PLOADER_SYSTEM_BLOCK;
6367

6468
extern PLOADER_SYSTEM_BLOCK WinLdrSystemBlock;

0 commit comments

Comments
 (0)