Skip to content

Commit 3b0cb19

Browse files
committed
[FREELDR] Fix tcpip.sys issue
1 parent 87242db commit 3b0cb19

File tree

4 files changed

+54
-25
lines changed

4 files changed

+54
-25
lines changed

boot/freeldr/freeldr/include/peloader.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ BOOLEAN
5959
PeLdrScanImportDescriptorTable(
6060
IN OUT PLIST_ENTRY ModuleListHead,
6161
IN PCCH DirectoryPath,
62+
IN PCCH ArcPath,
6263
IN PLDR_DATA_TABLE_ENTRY ScanDTE);
6364

6465
BOOLEAN

boot/freeldr/freeldr/lib/peloader.c

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ static BOOLEAN
130130
PeLdrpLoadAndScanReferencedDll(
131131
IN OUT PLIST_ENTRY ModuleListHead,
132132
IN PCCH DirectoryPath,
133+
IN PCCH ArcPath,
133134
IN PCH ImportName,
134135
IN PLIST_ENTRY Parent OPTIONAL,
135136
OUT PLDR_DATA_TABLE_ENTRY *DataTableEntry);
@@ -145,6 +146,7 @@ PeLdrpBindImportName(
145146
_In_ ULONG ExportSize,
146147
_In_ BOOLEAN ProcessForwards,
147148
_In_ PCSTR DirectoryPath,
149+
_In_ PCSTR ArcPath,
148150
_In_ PLIST_ENTRY Parent)
149151
{
150152
ULONG Ordinal;
@@ -316,6 +318,7 @@ PeLdrpBindImportName(
316318
/* Now let's try to load it! */
317319
Success = PeLdrpLoadAndScanReferencedDll(ModuleListHead,
318320
DirectoryPath,
321+
ArcPath,
319322
ForwardDllName,
320323
Parent,
321324
&DataTableEntry);
@@ -366,6 +369,7 @@ PeLdrpBindImportName(
366369
RefExportSize,
367370
TRUE,
368371
DirectoryPath,
372+
ArcPath,
369373
Parent);
370374

371375
/* Fill out the ThunkData with data from RefThunkData */
@@ -389,28 +393,33 @@ static BOOLEAN
389393
PeLdrpLoadAndScanReferencedDll(
390394
IN OUT PLIST_ENTRY ModuleListHead,
391395
IN PCCH DirectoryPath,
396+
IN PCCH ArcPath,
392397
IN PCH ImportName,
393398
IN PLIST_ENTRY Parent OPTIONAL,
394399
OUT PLDR_DATA_TABLE_ENTRY *DataTableEntry)
395400
{
396401
CHAR FullDllName[256];
402+
CHAR ArcFullDllName[256];
397403
BOOLEAN Success;
398404
PVOID BasePA = NULL;
399405

400406
/* Prepare the full path to the file to be loaded */
401407
RtlStringCbCopyA(FullDllName, sizeof(FullDllName), DirectoryPath);
402408
RtlStringCbCatA(FullDllName, sizeof(FullDllName), ImportName);
403409

410+
RtlStringCbCopyA(ArcFullDllName, sizeof(ArcFullDllName), ArcPath);
411+
RtlStringCbCatA(ArcFullDllName, sizeof(ArcFullDllName), ImportName);
412+
404413
TRACE("Loading referenced DLL: %s\n", FullDllName);
405414

406415
if (PeLdrImportDllLoadCallback)
407416
PeLdrImportDllLoadCallback(FullDllName);
408417

409418
/* Load the image */
410-
Success = PeLdrLoadImage(FullDllName, LoaderBootDriver, &BasePA);
419+
Success = PeLdrLoadImage(ArcFullDllName, LoaderBootDriver, &BasePA);
411420
if (!Success)
412421
{
413-
ERR("PeLdrLoadImage('%s') failed\n", FullDllName);
422+
ERR("PeLdrLoadImage('%s') failed\n", ArcFullDllName);
414423
return Success;
415424
}
416425

@@ -437,7 +446,7 @@ PeLdrpLoadAndScanReferencedDll(
437446
TRACE("PeLdrScanImportDescriptorTable() calling ourselves for '%.*S'\n",
438447
(*DataTableEntry)->BaseDllName.Length / sizeof(WCHAR),
439448
VaToPa((*DataTableEntry)->BaseDllName.Buffer));
440-
Success = PeLdrScanImportDescriptorTable(ModuleListHead, DirectoryPath, *DataTableEntry);
449+
Success = PeLdrScanImportDescriptorTable(ModuleListHead, DirectoryPath, ArcPath, *DataTableEntry);
441450
if (!Success)
442451
{
443452
/* Cleanup and bail out */
@@ -458,6 +467,7 @@ PeLdrpScanImportAddressTable(
458467
_In_ PIMAGE_THUNK_DATA ThunkName,
459468
_Inout_ PIMAGE_THUNK_DATA ThunkData,
460469
_In_ PCSTR DirectoryPath,
470+
_In_ PCSTR ArcPath,
461471
_In_ PLIST_ENTRY Parent)
462472
{
463473
PIMAGE_EXPORT_DIRECTORY ExportDirectory = NULL;
@@ -504,6 +514,7 @@ PeLdrpScanImportAddressTable(
504514
ExportSize,
505515
FALSE,
506516
DirectoryPath,
517+
ArcPath,
507518
Parent);
508519
/* Fail if binding was unsuccessful */
509520
if (!Success)
@@ -629,6 +640,7 @@ BOOLEAN
629640
PeLdrScanImportDescriptorTable(
630641
IN OUT PLIST_ENTRY ModuleListHead,
631642
IN PCCH DirectoryPath,
643+
IN PCCH ArcPath,
632644
IN PLDR_DATA_TABLE_ENTRY ScanDTE)
633645
{
634646
PLDR_DATA_TABLE_ENTRY DataTableEntry;
@@ -675,6 +687,7 @@ PeLdrScanImportDescriptorTable(
675687
{
676688
Success = PeLdrpLoadAndScanReferencedDll(ModuleListHead,
677689
DirectoryPath,
690+
ArcPath,
678691
ImportName,
679692
&ScanDTE->InLoadOrderLinks,
680693
&DataTableEntry);
@@ -692,6 +705,7 @@ PeLdrScanImportDescriptorTable(
692705
ThunkName,
693706
ThunkData,
694707
DirectoryPath,
708+
ArcPath,
695709
&ScanDTE->InLoadOrderLinks);
696710

697711
if (!Success)
@@ -1083,7 +1097,7 @@ PeLdrLoadBootImage(
10831097
}
10841098

10851099
/* Resolve imports */
1086-
Success = PeLdrScanImportDescriptorTable(&FrLdrModuleList, "", *DataTableEntry);
1100+
Success = PeLdrScanImportDescriptorTable(&FrLdrModuleList, "", "", *DataTableEntry);
10871101
if (!Success)
10881102
{
10891103
/* Cleanup and bail out */

boot/freeldr/freeldr/ntldr/winldr.c

Lines changed: 34 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@ NtLdrOutputLoadMsg(
7575
VOID WinLdrSetOperatingSystemVersion(
7676
IN ULONG VersionToBoot)
7777
{
78+
WinLdrSystemBlock->OsVersion = VersionToBoot;
79+
7880
if (VersionToBoot >= _WIN32_WINNT_WIN7)
7981
{
8082
WinLdrSystemBlock->LoaderBlockWin7.OsMajorVersion = (VersionToBoot & 0xFF00) >> 8;
@@ -121,7 +123,7 @@ AllocateAndInitLPB(
121123
RtlZeroMemory(WinLdrSystemBlock, sizeof(LOADER_SYSTEM_BLOCK));
122124

123125
LoaderBlock = (PCHAR)&WinLdrSystemBlock->LoaderBlockVista;
124-
*(PULONG)LoaderBlock = VersionToBoot;
126+
WinLdrSystemBlock->OsVersion = VersionToBoot;
125127

126128
if (VersionToBoot >= _WIN32_WINNT_WIN7)
127129
{
@@ -378,6 +380,8 @@ WinLdrLoadDeviceDriver(PLIST_ENTRY LoadOrderListHead,
378380
PLDR_DATA_TABLE_ENTRY *DriverDTE)
379381
{
380382
CHAR FullPath[1024];
383+
CHAR FullFileName[1024];
384+
CHAR ArcPath[1024];
381385
CHAR DriverPath[1024];
382386
CHAR DllName[1024];
383387
PCHAR DriverNamePos;
@@ -413,20 +417,21 @@ WinLdrLoadDeviceDriver(PLIST_ENTRY LoadOrderListHead,
413417
}
414418

415419
// It's not loaded, we have to load it
416-
RtlStringCbPrintfA(FullPath, sizeof(FullPath), "%s%wZ", BootPath, FilePath);
420+
RtlStringCbPrintfA(ArcPath, sizeof(ArcPath), "%s%wZ", BootPath, FilePath);
417421

418-
NtLdrOutputLoadMsg(FullPath, NULL);
419-
Success = PeLdrLoadImage(FullPath, LoaderBootDriver, &DriverBase);
422+
NtLdrOutputLoadMsg(ArcPath, NULL);
423+
Success = PeLdrLoadImage(ArcPath, LoaderBootDriver, &DriverBase);
420424
if (!Success)
421425
{
422426
ERR("PeLdrLoadImage('%s') failed\n", DllName);
423427
return FALSE;
424428
}
425429

426430
// Allocate a DTE for it
431+
RtlStringCbPrintfA(FullFileName, sizeof(FullFileName), "\\SystemRoot\\%s%s", DriverPath, DllName);
427432
Success = PeLdrAllocateDataTableEntry(LoadOrderListHead,
428433
DllName,
429-
DllName,
434+
FullFileName,
430435
PaToVa(DriverBase),
431436
DriverDTE);
432437
if (!Success)
@@ -444,8 +449,9 @@ WinLdrLoadDeviceDriver(PLIST_ENTRY LoadOrderListHead,
444449
(*DriverDTE)->Flags |= Flags;
445450

446451
// Look for any dependencies it may have, and load them too
447-
RtlStringCbPrintfA(FullPath, sizeof(FullPath), "%s%s", BootPath, DriverPath);
448-
Success = PeLdrScanImportDescriptorTable(LoadOrderListHead, FullPath, *DriverDTE);
452+
RtlStringCbPrintfA(ArcPath, sizeof(ArcPath), "%s%s", BootPath, DriverPath);
453+
RtlStringCbPrintfA(FullPath, sizeof(FullPath), "\\SystemRoot\\%s", DriverPath);
454+
Success = PeLdrScanImportDescriptorTable(LoadOrderListHead, FullPath, ArcPath, *DriverDTE);
449455
if (!Success)
450456
{
451457
/* Cleanup and bail out */
@@ -599,6 +605,7 @@ PVOID
599605
LoadModule(
600606
IN OUT PLOADER_PARAMETER_BLOCK1 LoaderBlock1,
601607
IN PCCH Path,
608+
IN PCCH ArcPath,
602609
IN PCCH File,
603610
IN PCCH ImportName, // BaseDllName
604611
IN TYPE_OF_MEMORY MemoryType,
@@ -607,6 +614,7 @@ LoadModule(
607614
{
608615
BOOLEAN Success;
609616
CHAR FullFileName[MAX_PATH];
617+
CHAR ArcFileName[MAX_PATH];
610618
CHAR ProgressString[256];
611619
PVOID BaseAddress;
612620

@@ -616,8 +624,11 @@ LoadModule(
616624
RtlStringCbCopyA(FullFileName, sizeof(FullFileName), Path);
617625
RtlStringCbCatA(FullFileName, sizeof(FullFileName), File);
618626

619-
NtLdrOutputLoadMsg(FullFileName, NULL);
620-
Success = PeLdrLoadImage(FullFileName, MemoryType, &BaseAddress);
627+
RtlStringCbCopyA(ArcFileName, sizeof(ArcFileName), ArcPath);
628+
RtlStringCbCatA(ArcFileName, sizeof(ArcFileName), File);
629+
630+
NtLdrOutputLoadMsg(ArcFileName, NULL);
631+
Success = PeLdrLoadImage(ArcFileName, MemoryType, &BaseAddress);
621632
if (!Success)
622633
{
623634
ERR("PeLdrLoadImage('%s') failed\n", File);
@@ -633,7 +644,7 @@ LoadModule(
633644
if (!Success)
634645
{
635646
/* Cleanup and bail out */
636-
ERR("PeLdrAllocateDataTableEntry('%s') failed\n", FullFileName);
647+
ERR("PeLdrAllocateDataTableEntry('%s') failed\n", ArcFileName);
637648
MmFreeMemory(BaseAddress);
638649
return NULL;
639650
}
@@ -712,6 +723,7 @@ LoadWindowsCore(IN USHORT OperatingSystemVersion,
712723
ULONG OptionLength;
713724
PVOID KernelBase, HalBase, KdDllBase = NULL;
714725
PLDR_DATA_TABLE_ENTRY HalDTE, KdDllDTE = NULL;
726+
CHAR ArcPath[MAX_PATH];
715727
CHAR DirPath[MAX_PATH];
716728
CHAR HalFileName[MAX_PATH];
717729
CHAR KernelFileName[MAX_PATH];
@@ -720,8 +732,11 @@ LoadWindowsCore(IN USHORT OperatingSystemVersion,
720732
if (!KernelDTE) return FALSE;
721733

722734
/* Initialize SystemRoot\System32 path */
723-
RtlStringCbCopyA(DirPath, sizeof(DirPath), BootPath);
724-
RtlStringCbCatA(DirPath, sizeof(DirPath), "system32\\");
735+
RtlStringCbCopyA(DirPath, sizeof(DirPath), "\\SystemRoot\\system32\\");
736+
737+
/* Initialize SystemRoot\System32 arc path */
738+
RtlStringCbCopyA(ArcPath, sizeof(ArcPath), BootPath);
739+
RtlStringCbCatA(ArcPath, sizeof(ArcPath), "system32\\");
725740

726741
/* Parse the boot options */
727742
TRACE("LoadWindowsCore: BootOptions '%s'\n", BootOptions);
@@ -844,7 +859,7 @@ LoadWindowsCore(IN USHORT OperatingSystemVersion,
844859
*/
845860

846861
/* Load the Kernel */
847-
KernelBase = LoadModule(LoaderBlock1, DirPath, KernelFileName,
862+
KernelBase = LoadModule(LoaderBlock1, DirPath, ArcPath, KernelFileName,
848863
"ntoskrnl.exe", LoaderSystemCode, KernelDTE, 30);
849864
if (!KernelBase)
850865
{
@@ -854,7 +869,7 @@ LoadWindowsCore(IN USHORT OperatingSystemVersion,
854869
}
855870

856871
/* Load the HAL */
857-
HalBase = LoadModule(LoaderBlock1, DirPath, HalFileName,
872+
HalBase = LoadModule(LoaderBlock1, DirPath, ArcPath, HalFileName,
858873
"hal.dll", LoaderHalCode, &HalDTE, 35);
859874
if (!HalBase)
860875
{
@@ -929,7 +944,7 @@ LoadWindowsCore(IN USHORT OperatingSystemVersion,
929944
_strlwr(KdDllName);
930945

931946
/* Load the KD DLL. Override its base DLL name to the default "KDCOM.DLL". */
932-
KdDllBase = LoadModule(LoaderBlock1, DirPath, KdDllName,
947+
KdDllBase = LoadModule(LoaderBlock1, DirPath, ArcPath, KdDllName,
933948
"kdcom.dll", LoaderSystemCode, &KdDllDTE, 40);
934949
if (!KdDllBase)
935950
{
@@ -942,7 +957,7 @@ LoadWindowsCore(IN USHORT OperatingSystemVersion,
942957
IsCustomKdDll = FALSE;
943958
RtlStringCbCopyA(KdDllName, sizeof(KdDllName), "kdcom.dll");
944959

945-
KdDllBase = LoadModule(LoaderBlock1, DirPath, KdDllName,
960+
KdDllBase = LoadModule(LoaderBlock1, DirPath, ArcPath, KdDllName,
946961
"kdcom.dll", LoaderSystemCode, &KdDllDTE, 40);
947962
}
948963

@@ -956,21 +971,21 @@ LoadWindowsCore(IN USHORT OperatingSystemVersion,
956971
}
957972

958973
/* Load all referenced DLLs for Kernel, HAL and Kernel Debugger Transport DLL */
959-
Success = PeLdrScanImportDescriptorTable(&LoaderBlock1->LoadOrderListHead, DirPath, *KernelDTE);
974+
Success = PeLdrScanImportDescriptorTable(&LoaderBlock1->LoadOrderListHead, DirPath, ArcPath, *KernelDTE);
960975
if (!Success)
961976
{
962977
UiMessageBox("Could not load %s", KernelFileName);
963978
goto Quit;
964979
}
965-
Success = PeLdrScanImportDescriptorTable(&LoaderBlock1->LoadOrderListHead, DirPath, HalDTE);
980+
Success = PeLdrScanImportDescriptorTable(&LoaderBlock1->LoadOrderListHead, DirPath, ArcPath, HalDTE);
966981
if (!Success)
967982
{
968983
UiMessageBox("Could not load %s", HalFileName);
969984
goto Quit;
970985
}
971986
if (KdDllDTE)
972987
{
973-
Success = PeLdrScanImportDescriptorTable(&LoaderBlock1->LoadOrderListHead, DirPath, KdDllDTE);
988+
Success = PeLdrScanImportDescriptorTable(&LoaderBlock1->LoadOrderListHead, DirPath, ArcPath, KdDllDTE);
974989
if (!Success)
975990
{
976991
UiMessageBox("Could not load %s", KdDllName);

boot/freeldr/freeldr/ntldr/winldr.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,15 +81,13 @@ typedef struct _LOADER_PARAMETER_BLOCK2
8181

8282
typedef struct _LOADER_PARAMETER_BLOCK_VISTA
8383
{
84-
ULONG OsVersion;
8584
LOADER_PARAMETER_BLOCK1 Block1;
8685
PSETUP_LOADER_BLOCK SetupLdrBlock;
8786
LOADER_PARAMETER_BLOCK2 Block2;
8887
} LOADER_PARAMETER_BLOCK_VISTA, *PLOADER_PARAMETER_BLOCK_VISTA;
8988

9089
typedef struct _LOADER_PARAMETER_BLOCK_WIN7
9190
{
92-
ULONG OsVersion;
9391
ULONG OsMajorVersion;
9492
ULONG OsMinorVersion;
9593
ULONG Size;
@@ -186,6 +184,7 @@ typedef struct _LOADER_SYSTEM_BLOCK
186184
LOADER_PARAMETER_EXTENSION_VISTA ExtensionVista;
187185
LOADER_PARAMETER_EXTENSION_WIN7 ExtensionWin7;
188186
};
187+
ULONG OsVersion;
189188
PLOADER_PARAMETER_BLOCK1 LoaderBlock1;
190189
PLOADER_PARAMETER_BLOCK2 LoaderBlock2;
191190
PLOADER_PARAMETER_EXTENSION1 Extension1;

0 commit comments

Comments
 (0)