Skip to content

Commit 0d1d49f

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

File tree

5 files changed

+255
-1
lines changed

5 files changed

+255
-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
{

sdk/include/reactos/arc/arc.h

Lines changed: 135 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,96 @@ 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_EXTENSION1
408+
{
409+
ULONG Size;
410+
PROFILE_PARAMETER_BLOCK Profile;
411+
} LOADER_PARAMETER_EXTENSION1, *PLOADER_PARAMETER_EXTENSION1;
412+
413+
#include <pshpack1.h>
414+
415+
typedef struct _LOADER_PARAMETER_EXTENSION2_WIN7
416+
{
417+
PVOID EmInfFileImage;
418+
ULONG EmInfFileSize;
419+
PVOID TriageDumpBlock;
420+
//
421+
// NT 5.1
422+
//
423+
ULONG_PTR LoaderPagesSpanned; /* Not anymore present starting NT 6.2 */
424+
PHEADLESS_LOADER_BLOCK HeadlessLoaderBlock;
425+
PSMBIOS_TABLE_HEADER SMBiosEPSHeader;
426+
PVOID DrvDBImage;
427+
ULONG DrvDBSize;
428+
PNETWORK_LOADER_BLOCK NetworkLoaderBlock;
429+
//
430+
// NT 5.2+
431+
//
432+
#ifdef _X86_
433+
PUCHAR HalpIRQLToTPR;
434+
PUCHAR HalpVectorToIRQL;
435+
#endif
436+
LIST_ENTRY FirmwareDescriptorListHead;
437+
PVOID AcpiTable;
438+
ULONG AcpiTableSize;
439+
//
440+
// NT 5.2 SP1+
441+
//
442+
/** NT-version-dependent flags **/
443+
ULONG BootViaWinload:1;
444+
ULONG BootViaEFI:1;
445+
ULONG Reserved:30;
446+
/********************************/
447+
PLOADER_PERFORMANCE_DATA LoaderPerformanceData;
448+
LIST_ENTRY BootApplicationPersistentData;
449+
PVOID WmdTestResult;
450+
GUID BootIdentifier;
451+
//
452+
// NT 6
453+
//
454+
ULONG ResumePages;
455+
PVOID DumpHeader;
456+
//
457+
// NT 6.1
458+
//
459+
PVOID BgContext;
460+
PVOID NumaLocalityInfo;
461+
PVOID NumaGroupAssignment;
462+
LIST_ENTRY AttachedHives;
463+
ULONG MemoryCachingRequirementsCount;
464+
PVOID MemoryCachingRequirements;
465+
TPM_BOOT_ENTROPY_LDR_RESULT TpmBootEntropyResult;
466+
ULONG Padding;
467+
ULONGLONG ProcessorCounterFrequency;
468+
} LOADER_PARAMETER_EXTENSION2_WIN7, *PLOADER_PARAMETER_EXTENSION2_WIN7;
469+
470+
typedef struct _LOADER_PARAMETER_EXTENSION_WIN7
471+
{
472+
LOADER_PARAMETER_EXTENSION1 Extension1;
473+
LOADER_PARAMETER_EXTENSION2_WIN7 Extension2;
474+
} LOADER_PARAMETER_EXTENSION_WIN7, *PLOADER_PARAMETER_EXTENSION_WIN7;
475+
476+
#include <poppack.h>
477+
385478
//
386479
// Extended Loader Parameter Block
387480
//
@@ -433,6 +526,10 @@ typedef struct _LOADER_PARAMETER_EXTENSION
433526
//
434527
ULONG ResumePages;
435528
PVOID DumpHeader;
529+
//
530+
// NT 6.1
531+
//
532+
LOADER_PARAMETER_EXTENSION_WIN7 NT6_1;
436533
} LOADER_PARAMETER_EXTENSION, *PLOADER_PARAMETER_EXTENSION;
437534

438535
//
@@ -529,6 +626,42 @@ typedef struct _FIRMWARE_INFORMATION_LOADER_BLOCK
529626
} u;
530627
} FIRMWARE_INFORMATION_LOADER_BLOCK, *PFIRMWARE_INFORMATION_LOADER_BLOCK;
531628

629+
typedef struct _LOADER_PARAMETER_BLOCK_WIN7
630+
{
631+
ULONG OsMajorVersion;
632+
ULONG OsMinorVersion;
633+
ULONG Size;
634+
ULONG Reserved;
635+
LIST_ENTRY LoadOrderListHead;
636+
LIST_ENTRY MemoryDescriptorListHead;
637+
LIST_ENTRY BootDriverListHead;
638+
ULONG_PTR KernelStack;
639+
ULONG_PTR Prcb;
640+
ULONG_PTR Process;
641+
ULONG_PTR Thread;
642+
ULONG RegistryLength;
643+
PVOID RegistryBase;
644+
PCONFIGURATION_COMPONENT_DATA ConfigurationRoot;
645+
PSTR ArcBootDeviceName;
646+
PSTR ArcHalDeviceName;
647+
PSTR NtBootPathName;
648+
PSTR NtHalPathName;
649+
PSTR LoadOptions;
650+
PNLS_DATA_BLOCK NlsData;
651+
PARC_DISK_INFORMATION ArcDiskInformation;
652+
PVOID OemFontFile;
653+
PLOADER_PARAMETER_EXTENSION_WIN7 Extension;
654+
union
655+
{
656+
I386_LOADER_BLOCK I386;
657+
ALPHA_LOADER_BLOCK Alpha;
658+
IA64_LOADER_BLOCK IA64;
659+
PPC_LOADER_BLOCK PowerPC;
660+
ARM_LOADER_BLOCK Arm;
661+
} u;
662+
FIRMWARE_INFORMATION_LOADER_BLOCK FirmwareInformation;
663+
} LOADER_PARAMETER_BLOCK_WIN7, *PLOADER_PARAMETER_BLOCK_WIN7;
664+
532665
//
533666
// Loader Parameter Block
534667
//
@@ -566,6 +699,8 @@ typedef struct _LOADER_PARAMETER_BLOCK
566699
ARM_LOADER_BLOCK Arm;
567700
} u;
568701
FIRMWARE_INFORMATION_LOADER_BLOCK FirmwareInformation;
702+
703+
LOADER_PARAMETER_BLOCK_WIN7 NT6_1;
569704
} LOADER_PARAMETER_BLOCK, *PLOADER_PARAMETER_BLOCK;
570705

571706
typedef int CONFIGTYPE;

0 commit comments

Comments
 (0)