Skip to content

Commit cdb5251

Browse files
committed
[FREELDR] Add Windows 7 Boot
1 parent 947c03e commit cdb5251

File tree

6 files changed

+257
-1
lines changed

6 files changed

+257
-1
lines changed

boot/freeldr/freeldr/arch/archwsup.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ AddReactOSArcDiskInfo(
8484

8585
/* Fill out the ARC disk block */
8686

87+
reactos_arc_disk_info[reactos_disk_count].DiskSignature.Unknown = (PVOID)0;
8788
reactos_arc_disk_info[reactos_disk_count].DiskSignature.Signature = Signature;
8889
reactos_arc_disk_info[reactos_disk_count].DiskSignature.CheckSum = Checksum;
8990
reactos_arc_disk_info[reactos_disk_count].DiskSignature.ValidPartitionTable = ValidPartitionTable;

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: 116 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ AllocateAndInitLPB(
8080
{
8181
PLOADER_PARAMETER_BLOCK LoaderBlock;
8282
PLOADER_PARAMETER_EXTENSION Extension;
83+
PLOADER_PARAMETER_BLOCK_WIN7 LoaderBlock_WIN7;
84+
PLOADER_PARAMETER_EXTENSION_WIN7 Extension_WIN7;
8385

8486
/* Allocate and zero-init the Loader Parameter Block */
8587
WinLdrSystemBlock = MmAllocateMemoryWithType(sizeof(LOADER_SYSTEM_BLOCK),
@@ -107,6 +109,16 @@ AllocateAndInitLPB(
107109
InitializeListHead(&LoaderBlock->MemoryDescriptorListHead);
108110
InitializeListHead(&LoaderBlock->BootDriverListHead);
109111

112+
LoaderBlock_WIN7 = &WinLdrSystemBlock->LoaderBlock.NT6_1;
113+
Extension_WIN7 = &WinLdrSystemBlock->Extension.NT6_1;
114+
115+
LoaderBlock_WIN7->Size = sizeof(LOADER_PARAMETER_BLOCK_WIN7);
116+
LoaderBlock_WIN7->Extension = Extension_WIN7;
117+
118+
Extension_WIN7->Extension2.TpmBootEntropyResult.ResultStatus = STATUS_NOT_IMPLEMENTED;
119+
Extension_WIN7->Extension2.TpmBootEntropyResult.ResultCode = TpmBootEntropyNoTpmFound;
120+
Extension_WIN7->Extension1.Size = sizeof(LOADER_PARAMETER_EXTENSION_WIN7);
121+
110122
*OutLoaderBlock = LoaderBlock;
111123
}
112124

@@ -133,6 +145,7 @@ WinLdrInitializePhase1(PLOADER_PARAMETER_BLOCK LoaderBlock,
133145
ULONG i;
134146
ULONG_PTR PathSeparator;
135147
PLOADER_PARAMETER_EXTENSION Extension;
148+
PLOADER_PARAMETER_EXTENSION_WIN7 Extension_WIN7;
136149

137150
/* Construct SystemRoot and ArcBoot from SystemPath */
138151
PathSeparator = strstr(BootPath, "\\") - BootPath;
@@ -242,6 +255,7 @@ WinLdrInitializePhase1(PLOADER_PARAMETER_BLOCK LoaderBlock,
242255
List_PaToVa(&LoaderBlock->BootDriverListHead);
243256

244257
Extension = LoaderBlock->Extension;
258+
Extension_WIN7 = LoaderBlock->NT6_1.Extension;
245259

246260
/* FIXME! HACK value for docking profile */
247261
Extension->Profile.Status = 2;
@@ -263,6 +277,9 @@ WinLdrInitializePhase1(PLOADER_PARAMETER_BLOCK LoaderBlock,
263277
List_PaToVa(&Extension->BootApplicationPersistentData);
264278
}
265279

280+
InitializeListHead(&Extension_WIN7->Extension2.AttachedHives);
281+
List_PaToVa(&Extension_WIN7->Extension2.AttachedHives);
282+
266283
#ifdef _M_IX86
267284
/* Set headless block pointer */
268285
if (WinLdrTerminalConnected)
@@ -281,8 +298,12 @@ WinLdrInitializePhase1(PLOADER_PARAMETER_BLOCK LoaderBlock,
281298
&Extension->DrvDBSize,
282299
LoaderRegistryData));
283300

301+
if (Extension_WIN7->Extension2.BgContext)
302+
Extension_WIN7->Extension2.BgContext = PaToVa(Extension_WIN7->Extension2.BgContext);
303+
284304
/* Convert the extension block pointer */
285305
LoaderBlock->Extension = PaToVa(LoaderBlock->Extension);
306+
LoaderBlock->NT6_1.Extension = PaToVa(LoaderBlock->NT6_1.Extension);
286307

287308
TRACE("WinLdrInitializePhase1() completed\n");
288309
}
@@ -1015,6 +1036,10 @@ LoadAndBootWindows(
10151036
{
10161037
OperatingSystemVersion = _WIN32_WINNT_VISTA;
10171038
}
1039+
else if (_stricmp(ArgValue, "Windows7") == 0)
1040+
{
1041+
OperatingSystemVersion = _WIN32_WINNT_WIN7;
1042+
}
10181043
else
10191044
{
10201045
ERR("Unknown 'BootType' value '%s', aborting!\n", ArgValue);
@@ -1175,6 +1200,7 @@ LoadAndBootWindowsCommon(
11751200
IN PCSTR BootOptions,
11761201
IN PCSTR BootPath)
11771202
{
1203+
PLOADER_PARAMETER_EXTENSION Extension = LoaderBlock->Extension;
11781204
PLOADER_PARAMETER_BLOCK LoaderBlockVA;
11791205
BOOLEAN Success;
11801206
PLDR_DATA_TABLE_ENTRY KernelDTE;
@@ -1260,15 +1286,99 @@ LoadAndBootWindowsCommon(
12601286
/* Map pages and create memory descriptors */
12611287
WinLdrSetupMemoryLayout(LoaderBlock);
12621288

1289+
if (OperatingSystemVersion >= _WIN32_WINNT_WIN7)
1290+
{
1291+
PLOADER_PARAMETER_BLOCK_WIN7 LoaderBlock_WIN7 = &LoaderBlock->NT6_1;
1292+
PLOADER_PARAMETER_EXTENSION_WIN7 Extension_WIN7 = &Extension->NT6_1;
1293+
1294+
LoaderBlock_WIN7->OsMajorVersion = Extension->MajorVersion;
1295+
LoaderBlock_WIN7->OsMinorVersion = Extension->MinorVersion;
1296+
LoaderBlock_WIN7->LoadOrderListHead = LoaderBlock->LoadOrderListHead;
1297+
LoaderBlock_WIN7->MemoryDescriptorListHead = LoaderBlock->MemoryDescriptorListHead;
1298+
LoaderBlock_WIN7->BootDriverListHead = LoaderBlock->BootDriverListHead;
1299+
LoaderBlock_WIN7->KernelStack = LoaderBlock->KernelStack;
1300+
LoaderBlock_WIN7->Prcb = LoaderBlock->Prcb;
1301+
LoaderBlock_WIN7->Process = LoaderBlock->Process;
1302+
LoaderBlock_WIN7->Thread = LoaderBlock->Thread;
1303+
LoaderBlock_WIN7->RegistryLength = LoaderBlock->RegistryLength;
1304+
LoaderBlock_WIN7->RegistryBase = LoaderBlock->RegistryBase;
1305+
LoaderBlock_WIN7->ConfigurationRoot = LoaderBlock->ConfigurationRoot;
1306+
LoaderBlock_WIN7->ArcBootDeviceName = LoaderBlock->ArcBootDeviceName;
1307+
LoaderBlock_WIN7->ArcHalDeviceName = LoaderBlock->ArcHalDeviceName;
1308+
LoaderBlock_WIN7->NtBootPathName = LoaderBlock->NtBootPathName;
1309+
LoaderBlock_WIN7->NtHalPathName = LoaderBlock->NtHalPathName;
1310+
LoaderBlock_WIN7->LoadOptions = LoaderBlock->LoadOptions;
1311+
LoaderBlock_WIN7->NlsData = LoaderBlock->NlsData;
1312+
LoaderBlock_WIN7->ArcDiskInformation = LoaderBlock->ArcDiskInformation;
1313+
LoaderBlock_WIN7->OemFontFile = LoaderBlock->OemFontFile;
1314+
RtlCopyMemory(&LoaderBlock_WIN7->u, &LoaderBlock->u, sizeof(LoaderBlock->u));
1315+
RtlCopyMemory(&LoaderBlock_WIN7->FirmwareInformation, &LoaderBlock->FirmwareInformation, sizeof(LoaderBlock->FirmwareInformation));
1316+
1317+
RtlCopyMemory(&Extension_WIN7->Extension1.Profile, &Extension->Profile, sizeof(Extension->Profile));
1318+
Extension_WIN7->Extension2.EmInfFileImage = Extension->EmInfFileImage;
1319+
Extension_WIN7->Extension2.EmInfFileSize = Extension->EmInfFileSize;
1320+
Extension_WIN7->Extension2.TriageDumpBlock = Extension->TriageDumpBlock;
1321+
Extension_WIN7->Extension2.LoaderPagesSpanned = Extension->LoaderPagesSpanned;
1322+
Extension_WIN7->Extension2.HeadlessLoaderBlock = Extension->HeadlessLoaderBlock;
1323+
Extension_WIN7->Extension2.SMBiosEPSHeader = Extension->SMBiosEPSHeader;
1324+
Extension_WIN7->Extension2.DrvDBImage = Extension->DrvDBImage;
1325+
Extension_WIN7->Extension2.DrvDBSize = Extension->DrvDBSize;
1326+
Extension_WIN7->Extension2.NetworkLoaderBlock = Extension->NetworkLoaderBlock;
1327+
#ifdef _X86_
1328+
Extension_WIN7->Extension2.HalpIRQLToTPR = Extension->HalpIRQLToTPR;
1329+
Extension_WIN7->Extension2.HalpVectorToIRQL = Extension->HalpVectorToIRQL;
1330+
#endif
1331+
Extension_WIN7->Extension2.FirmwareDescriptorListHead = Extension->FirmwareDescriptorListHead;
1332+
Extension_WIN7->Extension2.AcpiTable = Extension->AcpiTable;
1333+
Extension_WIN7->Extension2.AcpiTableSize = Extension->AcpiTableSize;
1334+
Extension_WIN7->Extension2.BootViaWinload = Extension->BootViaWinload;
1335+
Extension_WIN7->Extension2.BootViaEFI = Extension->BootViaEFI;
1336+
Extension_WIN7->Extension2.Reserved = Extension->Reserved;
1337+
Extension_WIN7->Extension2.LoaderPerformanceData = Extension->LoaderPerformanceData;
1338+
Extension_WIN7->Extension2.BootApplicationPersistentData = Extension->BootApplicationPersistentData;
1339+
Extension_WIN7->Extension2.WmdTestResult = Extension->WmdTestResult;
1340+
Extension_WIN7->Extension2.BootIdentifier = Extension->BootIdentifier;
1341+
Extension_WIN7->Extension2.ResumePages = Extension->ResumePages;
1342+
Extension_WIN7->Extension2.DumpHeader = Extension->DumpHeader;
1343+
}
1344+
12631345
/* Set processor context */
12641346
WinLdrSetProcessorContext(OperatingSystemVersion);
12651347

12661348
/* Save final value of LoaderPagesSpanned */
1267-
LoaderBlock->Extension->LoaderPagesSpanned = MmGetLoaderPagesSpanned();
1349+
LoaderBlockVA->Extension->LoaderPagesSpanned = MmGetLoaderPagesSpanned();
1350+
LoaderBlockVA->NT6_1.Extension->Extension2.LoaderPagesSpanned = LoaderBlockVA->Extension->LoaderPagesSpanned;
12681351

12691352
TRACE("Hello from paged mode, KiSystemStartup %p, LoaderBlockVA %p!\n",
12701353
KiSystemStartup, LoaderBlockVA);
12711354

1355+
PCHAR LoaderBlockByte = (PCHAR)&LoaderBlockVA->NT6_1;
1356+
PCHAR ExtensionByte = (PCHAR)LoaderBlockVA->NT6_1.Extension;
1357+
1358+
if (sizeof(LOADER_PARAMETER_BLOCK_WIN7) != 0x88)
1359+
{
1360+
TRACE("Warning LOADER_PARAMETER_BLOCK_WIN7 is not 0x88\n");
1361+
while(TRUE);
1362+
}
1363+
1364+
if (sizeof(LOADER_PARAMETER_EXTENSION_WIN7) != 0xE8)
1365+
{
1366+
TRACE("Warning LOADER_PARAMETER_EXTENSION_WIN7 is not 0xE8\n");
1367+
while(TRUE);
1368+
}
1369+
1370+
TRACE("LOADER_PARAMETER_BLOCK_WIN7:\n");
1371+
for (ULONG i = 0; i < sizeof(LOADER_PARAMETER_BLOCK_WIN7); i++){
1372+
TRACE("0x%02X, ", (ULONG)LoaderBlockByte[i]);
1373+
}
1374+
TRACE("\n");
1375+
1376+
TRACE("LOADER_PARAMETER_EXTENSION_WIN7:\n");
1377+
for (ULONG i = 0; i < sizeof(LOADER_PARAMETER_EXTENSION_WIN7); i++){
1378+
TRACE("0x%02X, ", (ULONG)ExtensionByte[i]);
1379+
}
1380+
TRACE("\n");
1381+
12721382
/* Zero KI_USER_SHARED_DATA page */
12731383
RtlZeroMemory((PVOID)KI_USER_SHARED_DATA, MM_PAGE_SIZE);
12741384

@@ -1278,6 +1388,11 @@ LoadAndBootWindowsCommon(
12781388
WinLdrpDumpArcDisks(LoaderBlockVA);
12791389
#endif
12801390

1391+
if (OperatingSystemVersion >= _WIN32_WINNT_WIN7)
1392+
LoaderBlockVA = (PLOADER_PARAMETER_BLOCK)&LoaderBlockVA->NT6_1;
1393+
1394+
TRACE("Bye Freeldr!\n");
1395+
12811396
/* Pass control */
12821397
(*KiSystemStartup)(LoaderBlockVA);
12831398

boot/freeldr/freeldr/ntldr/wlregistry.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -760,6 +760,8 @@ WinLdrAddDriverToList(
760760
RtlInitEmptyUnicodeString(&GroupString, NULL, 0);
761761
}
762762

763+
DriverEntry->Status = STATUS_SUCCESS;
764+
763765
/* Set or replace the driver node's file path */
764766
if (DriverEntry->FilePath.Buffer)
765767
{

ntoskrnl/include/internal/cmboot.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ typedef struct _BOOT_DRIVER_NODE
1717
UNICODE_STRING Name;
1818
ULONG Tag;
1919
ULONG ErrorControl;
20+
PVOID Unknown1;
21+
PVOID Unknown2;
2022
} BOOT_DRIVER_NODE, *PBOOT_DRIVER_NODE;
2123

2224

0 commit comments

Comments
 (0)