Skip to content

Commit ac72131

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

File tree

5 files changed

+207
-1
lines changed

5 files changed

+207
-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: 83 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->TpmBootEntropyResult.ResultStatus = STATUS_NOT_IMPLEMENTED;
119+
Extension_WIN7->TpmBootEntropyResult.ResultCode = TpmBootEntropyNoTpmFound;
120+
Extension_WIN7->Size = sizeof(LOADER_PARAMETER_EXTENSION_WIN7);
121+
110122
*OutLoaderBlock = LoaderBlock;
111123
}
112124

@@ -263,6 +275,9 @@ WinLdrInitializePhase1(PLOADER_PARAMETER_BLOCK LoaderBlock,
263275
List_PaToVa(&Extension->BootApplicationPersistentData);
264276
}
265277

278+
InitializeListHead(&LoaderBlock->NT6_1.Extension->AttachedHives);
279+
List_PaToVa(&LoaderBlock->NT6_1.Extension->AttachedHives);
280+
266281
#ifdef _M_IX86
267282
/* Set headless block pointer */
268283
if (WinLdrTerminalConnected)
@@ -281,8 +296,12 @@ WinLdrInitializePhase1(PLOADER_PARAMETER_BLOCK LoaderBlock,
281296
&Extension->DrvDBSize,
282297
LoaderRegistryData));
283298

299+
if (LoaderBlock->NT6_1.Extension->BgContext)
300+
LoaderBlock->NT6_1.Extension->BgContext = PaToVa(LoaderBlock->NT6_1.Extension->BgContext);
301+
284302
/* Convert the extension block pointer */
285303
LoaderBlock->Extension = PaToVa(LoaderBlock->Extension);
304+
LoaderBlock->NT6_1.Extension = PaToVa(LoaderBlock->NT6_1.Extension);
286305

287306
TRACE("WinLdrInitializePhase1() completed\n");
288307
}
@@ -1015,6 +1034,10 @@ LoadAndBootWindows(
10151034
{
10161035
OperatingSystemVersion = _WIN32_WINNT_VISTA;
10171036
}
1037+
else if (_stricmp(ArgValue, "Windows7") == 0)
1038+
{
1039+
OperatingSystemVersion = _WIN32_WINNT_WIN7;
1040+
}
10181041
else
10191042
{
10201043
ERR("Unknown 'BootType' value '%s', aborting!\n", ArgValue);
@@ -1175,6 +1198,7 @@ LoadAndBootWindowsCommon(
11751198
IN PCSTR BootOptions,
11761199
IN PCSTR BootPath)
11771200
{
1201+
PLOADER_PARAMETER_EXTENSION ExtensionVA = PaToVa(LoaderBlock->Extension);
11781202
PLOADER_PARAMETER_BLOCK LoaderBlockVA;
11791203
BOOLEAN Success;
11801204
PLDR_DATA_TABLE_ENTRY KernelDTE;
@@ -1264,7 +1288,60 @@ LoadAndBootWindowsCommon(
12641288
WinLdrSetProcessorContext(OperatingSystemVersion);
12651289

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

12691346
TRACE("Hello from paged mode, KiSystemStartup %p, LoaderBlockVA %p!\n",
12701347
KiSystemStartup, LoaderBlockVA);
@@ -1278,6 +1355,11 @@ LoadAndBootWindowsCommon(
12781355
WinLdrpDumpArcDisks(LoaderBlockVA);
12791356
#endif
12801357

1358+
if (OperatingSystemVersion >= _WIN32_WINNT_WIN7)
1359+
LoaderBlockVA = (PLOADER_PARAMETER_BLOCK)&LoaderBlockVA->NT6_1;
1360+
1361+
TRACE("Bye Freeldr!\n");
1362+
12811363
/* Pass control */
12821364
(*KiSystemStartup)(LoaderBlockVA);
12831365

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
{

sdk/include/reactos/arc/arc.h

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,8 @@ typedef struct _BOOT_DRIVER_LIST_ENTRY
248248
UNICODE_STRING FilePath;
249249
UNICODE_STRING RegistryPath;
250250
struct _LDR_DATA_TABLE_ENTRY *LdrEntry;
251+
ULONG Status;
252+
ULONG Unknown;
251253
} BOOT_DRIVER_LIST_ENTRY, *PBOOT_DRIVER_LIST_ENTRY;
252254

253255
typedef struct _ARC_DISK_SIGNATURE
@@ -261,6 +263,7 @@ typedef struct _ARC_DISK_SIGNATURE
261263
BOOLEAN IsGpt;
262264
BOOLEAN Reserved;
263265
CHAR GptSignature[16];
266+
PVOID Unknown;
264267
} ARC_DISK_SIGNATURE, *PARC_DISK_SIGNATURE;
265268

266269
typedef struct _ARC_DISK_INFORMATION
@@ -382,6 +385,81 @@ typedef struct _LOADER_PERFORMANCE_DATA
382385
ULONGLONG EndTime;
383386
} LOADER_PERFORMANCE_DATA, *PLOADER_PERFORMANCE_DATA;
384387

388+
typedef enum _TPM_BOOT_ENTROPY_RESULT_CODE
389+
{
390+
TpmBootEntropyStructureUninitialized = 0,
391+
TpmBootEntropyDisabledByPolicy = 1,
392+
TpmBootEntropyNoTpmFound = 2,
393+
TpmBootEntropyTpmError = 3,
394+
TpmBootEntropySuccess = 4
395+
} TPM_BOOT_ENTROPY_RESULT_CODE;
396+
397+
typedef struct _TPM_BOOT_ENTROPY_LDR_RESULT
398+
{
399+
ULONGLONG Policy;
400+
TPM_BOOT_ENTROPY_RESULT_CODE ResultCode;
401+
ULONG ResultStatus;
402+
ULONGLONG Time;
403+
ULONG EntropyLength;
404+
UCHAR EntropyData[40];
405+
} TPM_BOOT_ENTROPY_LDR_RESULT, *PTPM_BOOT_ENTROPY_LDR_RESULT;
406+
407+
typedef struct _LOADER_PARAMETER_EXTENSION_WIN7
408+
{
409+
ULONG Size;
410+
PROFILE_PARAMETER_BLOCK Profile;
411+
PVOID EmInfFileImage;
412+
ULONG EmInfFileSize;
413+
PVOID TriageDumpBlock;
414+
//
415+
// NT 5.1
416+
//
417+
ULONG_PTR LoaderPagesSpanned; /* Not anymore present starting NT 6.2 */
418+
PHEADLESS_LOADER_BLOCK HeadlessLoaderBlock;
419+
PSMBIOS_TABLE_HEADER SMBiosEPSHeader;
420+
PVOID DrvDBImage;
421+
ULONG DrvDBSize;
422+
PNETWORK_LOADER_BLOCK NetworkLoaderBlock;
423+
//
424+
// NT 5.2+
425+
//
426+
#ifdef _X86_
427+
PUCHAR HalpIRQLToTPR;
428+
PUCHAR HalpVectorToIRQL;
429+
#endif
430+
LIST_ENTRY FirmwareDescriptorListHead;
431+
PVOID AcpiTable;
432+
ULONG AcpiTableSize;
433+
//
434+
// NT 5.2 SP1+
435+
//
436+
/** NT-version-dependent flags **/
437+
ULONG BootViaWinload:1;
438+
ULONG BootViaEFI:1;
439+
ULONG Reserved:30;
440+
/********************************/
441+
PLOADER_PERFORMANCE_DATA LoaderPerformanceData;
442+
LIST_ENTRY BootApplicationPersistentData;
443+
PVOID WmdTestResult;
444+
GUID BootIdentifier;
445+
//
446+
// NT 6
447+
//
448+
ULONG ResumePages;
449+
PVOID DumpHeader;
450+
//
451+
// NT 6.1
452+
//
453+
PVOID BgContext;
454+
PVOID NumaLocalityInfo;
455+
PVOID NumaGroupAssignment;
456+
LIST_ENTRY AttachedHives;
457+
ULONG MemoryCachingRequirementsCount;
458+
PVOID MemoryCachingRequirements;
459+
TPM_BOOT_ENTROPY_LDR_RESULT TpmBootEntropyResult;
460+
ULONGLONG ProcessorCounterFrequency;
461+
} LOADER_PARAMETER_EXTENSION_WIN7, *PLOADER_PARAMETER_EXTENSION_WIN7;
462+
385463
//
386464
// Extended Loader Parameter Block
387465
//
@@ -433,6 +511,10 @@ typedef struct _LOADER_PARAMETER_EXTENSION
433511
//
434512
ULONG ResumePages;
435513
PVOID DumpHeader;
514+
//
515+
// NT 6.1
516+
//
517+
LOADER_PARAMETER_EXTENSION_WIN7 NT6_1;
436518
} LOADER_PARAMETER_EXTENSION, *PLOADER_PARAMETER_EXTENSION;
437519

438520
//
@@ -529,6 +611,42 @@ typedef struct _FIRMWARE_INFORMATION_LOADER_BLOCK
529611
} u;
530612
} FIRMWARE_INFORMATION_LOADER_BLOCK, *PFIRMWARE_INFORMATION_LOADER_BLOCK;
531613

614+
typedef struct _LOADER_PARAMETER_BLOCK_WIN7
615+
{
616+
ULONG OsMajorVersion;
617+
ULONG OsMinorVersion;
618+
ULONG Size;
619+
ULONG Reserved;
620+
LIST_ENTRY LoadOrderListHead;
621+
LIST_ENTRY MemoryDescriptorListHead;
622+
LIST_ENTRY BootDriverListHead;
623+
ULONG_PTR KernelStack;
624+
ULONG_PTR Prcb;
625+
ULONG_PTR Process;
626+
ULONG_PTR Thread;
627+
ULONG RegistryLength;
628+
PVOID RegistryBase;
629+
PCONFIGURATION_COMPONENT_DATA ConfigurationRoot;
630+
PSTR ArcBootDeviceName;
631+
PSTR ArcHalDeviceName;
632+
PSTR NtBootPathName;
633+
PSTR NtHalPathName;
634+
PSTR LoadOptions;
635+
PNLS_DATA_BLOCK NlsData;
636+
PARC_DISK_INFORMATION ArcDiskInformation;
637+
PVOID OemFontFile;
638+
PLOADER_PARAMETER_EXTENSION_WIN7 Extension;
639+
union
640+
{
641+
I386_LOADER_BLOCK I386;
642+
ALPHA_LOADER_BLOCK Alpha;
643+
IA64_LOADER_BLOCK IA64;
644+
PPC_LOADER_BLOCK PowerPC;
645+
ARM_LOADER_BLOCK Arm;
646+
} u;
647+
FIRMWARE_INFORMATION_LOADER_BLOCK FirmwareInformation;
648+
} LOADER_PARAMETER_BLOCK_WIN7, *PLOADER_PARAMETER_BLOCK_WIN7;
649+
532650
//
533651
// Loader Parameter Block
534652
//
@@ -566,6 +684,8 @@ typedef struct _LOADER_PARAMETER_BLOCK
566684
ARM_LOADER_BLOCK Arm;
567685
} u;
568686
FIRMWARE_INFORMATION_LOADER_BLOCK FirmwareInformation;
687+
688+
LOADER_PARAMETER_BLOCK_WIN7 NT6_1;
569689
} LOADER_PARAMETER_BLOCK, *PLOADER_PARAMETER_BLOCK;
570690

571691
typedef int CONFIGTYPE;

0 commit comments

Comments
 (0)