Skip to content

Commit 4cc6c38

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

File tree

5 files changed

+212
-1
lines changed

5 files changed

+212
-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: 125 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,86 @@ 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+
#include <pshpack1.h>
398+
399+
typedef struct _TPM_BOOT_ENTROPY_LDR_RESULT
400+
{
401+
ULONGLONG Policy;
402+
TPM_BOOT_ENTROPY_RESULT_CODE ResultCode;
403+
ULONG ResultStatus;
404+
ULONGLONG Time;
405+
ULONG EntropyLength;
406+
UCHAR EntropyData[40];
407+
ULONG Padding;
408+
} TPM_BOOT_ENTROPY_LDR_RESULT, *PTPM_BOOT_ENTROPY_LDR_RESULT;
409+
410+
#include <poppack.h>
411+
412+
typedef struct _LOADER_PARAMETER_EXTENSION_WIN7
413+
{
414+
ULONG Size;
415+
PROFILE_PARAMETER_BLOCK Profile;
416+
PVOID EmInfFileImage;
417+
ULONG EmInfFileSize;
418+
PVOID TriageDumpBlock;
419+
//
420+
// NT 5.1
421+
//
422+
ULONG_PTR LoaderPagesSpanned; /* Not anymore present starting NT 6.2 */
423+
PHEADLESS_LOADER_BLOCK HeadlessLoaderBlock;
424+
PSMBIOS_TABLE_HEADER SMBiosEPSHeader;
425+
PVOID DrvDBImage;
426+
ULONG DrvDBSize;
427+
PNETWORK_LOADER_BLOCK NetworkLoaderBlock;
428+
//
429+
// NT 5.2+
430+
//
431+
#ifdef _X86_
432+
PUCHAR HalpIRQLToTPR;
433+
PUCHAR HalpVectorToIRQL;
434+
#endif
435+
LIST_ENTRY FirmwareDescriptorListHead;
436+
PVOID AcpiTable;
437+
ULONG AcpiTableSize;
438+
//
439+
// NT 5.2 SP1+
440+
//
441+
/** NT-version-dependent flags **/
442+
ULONG BootViaWinload:1;
443+
ULONG BootViaEFI:1;
444+
ULONG Reserved:30;
445+
/********************************/
446+
PLOADER_PERFORMANCE_DATA LoaderPerformanceData;
447+
LIST_ENTRY BootApplicationPersistentData;
448+
PVOID WmdTestResult;
449+
GUID BootIdentifier;
450+
//
451+
// NT 6
452+
//
453+
ULONG ResumePages;
454+
PVOID DumpHeader;
455+
//
456+
// NT 6.1
457+
//
458+
PVOID BgContext;
459+
PVOID NumaLocalityInfo;
460+
PVOID NumaGroupAssignment;
461+
LIST_ENTRY AttachedHives;
462+
ULONG MemoryCachingRequirementsCount;
463+
PVOID MemoryCachingRequirements;
464+
TPM_BOOT_ENTROPY_LDR_RESULT TpmBootEntropyResult;
465+
ULONGLONG ProcessorCounterFrequency;
466+
} LOADER_PARAMETER_EXTENSION_WIN7, *PLOADER_PARAMETER_EXTENSION_WIN7;
467+
385468
//
386469
// Extended Loader Parameter Block
387470
//
@@ -433,6 +516,10 @@ typedef struct _LOADER_PARAMETER_EXTENSION
433516
//
434517
ULONG ResumePages;
435518
PVOID DumpHeader;
519+
//
520+
// NT 6.1
521+
//
522+
LOADER_PARAMETER_EXTENSION_WIN7 NT6_1;
436523
} LOADER_PARAMETER_EXTENSION, *PLOADER_PARAMETER_EXTENSION;
437524

438525
//
@@ -529,6 +616,42 @@ typedef struct _FIRMWARE_INFORMATION_LOADER_BLOCK
529616
} u;
530617
} FIRMWARE_INFORMATION_LOADER_BLOCK, *PFIRMWARE_INFORMATION_LOADER_BLOCK;
531618

619+
typedef struct _LOADER_PARAMETER_BLOCK_WIN7
620+
{
621+
ULONG OsMajorVersion;
622+
ULONG OsMinorVersion;
623+
ULONG Size;
624+
ULONG Reserved;
625+
LIST_ENTRY LoadOrderListHead;
626+
LIST_ENTRY MemoryDescriptorListHead;
627+
LIST_ENTRY BootDriverListHead;
628+
ULONG_PTR KernelStack;
629+
ULONG_PTR Prcb;
630+
ULONG_PTR Process;
631+
ULONG_PTR Thread;
632+
ULONG RegistryLength;
633+
PVOID RegistryBase;
634+
PCONFIGURATION_COMPONENT_DATA ConfigurationRoot;
635+
PSTR ArcBootDeviceName;
636+
PSTR ArcHalDeviceName;
637+
PSTR NtBootPathName;
638+
PSTR NtHalPathName;
639+
PSTR LoadOptions;
640+
PNLS_DATA_BLOCK NlsData;
641+
PARC_DISK_INFORMATION ArcDiskInformation;
642+
PVOID OemFontFile;
643+
PLOADER_PARAMETER_EXTENSION_WIN7 Extension;
644+
union
645+
{
646+
I386_LOADER_BLOCK I386;
647+
ALPHA_LOADER_BLOCK Alpha;
648+
IA64_LOADER_BLOCK IA64;
649+
PPC_LOADER_BLOCK PowerPC;
650+
ARM_LOADER_BLOCK Arm;
651+
} u;
652+
FIRMWARE_INFORMATION_LOADER_BLOCK FirmwareInformation;
653+
} LOADER_PARAMETER_BLOCK_WIN7, *PLOADER_PARAMETER_BLOCK_WIN7;
654+
532655
//
533656
// Loader Parameter Block
534657
//
@@ -566,6 +689,8 @@ typedef struct _LOADER_PARAMETER_BLOCK
566689
ARM_LOADER_BLOCK Arm;
567690
} u;
568691
FIRMWARE_INFORMATION_LOADER_BLOCK FirmwareInformation;
692+
693+
LOADER_PARAMETER_BLOCK_WIN7 NT6_1;
569694
} LOADER_PARAMETER_BLOCK, *PLOADER_PARAMETER_BLOCK;
570695

571696
typedef int CONFIGTYPE;

0 commit comments

Comments
 (0)