Skip to content

Commit b21b9d7

Browse files
committed
[FREELDR] Fix tcpip.sys issue
1 parent 4cc6c38 commit b21b9d7

File tree

4 files changed

+58
-40
lines changed

4 files changed

+58
-40
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/fs/ntfs.c

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -525,19 +525,9 @@ static BOOLEAN NtfsCompareFileName(PCHAR FileName, PNTFS_INDEX_ENTRY IndexEntry)
525525
if (strlen(FileName) != EntryFileNameLength)
526526
return FALSE;
527527

528-
/* Do case-sensitive compares for Posix file names. */
529-
if (IndexEntry->FileName.FileNameType == NTFS_FILE_NAME_POSIX)
530-
{
531-
for (i = 0; i < EntryFileNameLength; i++)
532-
if (EntryFileName[i] != FileName[i])
533-
return FALSE;
534-
}
535-
else
536-
{
537-
for (i = 0; i < EntryFileNameLength; i++)
538-
if (tolower(EntryFileName[i]) != tolower(FileName[i]))
539-
return FALSE;
540-
}
528+
for (i = 0; i < EntryFileNameLength; i++)
529+
if (tolower(EntryFileName[i]) != tolower(FileName[i]))
530+
return FALSE;
541531

542532
return TRUE;
543533
}

boot/freeldr/freeldr/lib/peloader.c

Lines changed: 22 additions & 8 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,31 +393,36 @@ 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
{
401+
CHAR ArcDllName[256];
396402
CHAR FullDllName[256];
397403
BOOLEAN Success;
398404
PVOID BasePA = NULL;
399405

400406
/* Prepare the full path to the file to be loaded */
401-
RtlStringCbCopyA(FullDllName, sizeof(FullDllName), DirectoryPath);
402-
RtlStringCbCatA(FullDllName, sizeof(FullDllName), ImportName);
407+
RtlStringCbCopyA(ArcDllName, sizeof(ArcDllName), ArcPath);
408+
RtlStringCbCatA(ArcDllName, sizeof(ArcDllName), ImportName);
403409

404-
TRACE("Loading referenced DLL: %s\n", FullDllName);
410+
TRACE("Loading referenced DLL: %s\n", ArcDllName);
405411

406412
if (PeLdrImportDllLoadCallback)
407-
PeLdrImportDllLoadCallback(FullDllName);
413+
PeLdrImportDllLoadCallback(ArcDllName);
408414

409415
/* Load the image */
410-
Success = PeLdrLoadImage(FullDllName, LoaderBootDriver, &BasePA);
416+
Success = PeLdrLoadImage(ArcDllName, LoaderBootDriver, &BasePA);
411417
if (!Success)
412418
{
413-
ERR("PeLdrLoadImage('%s') failed\n", FullDllName);
419+
ERR("PeLdrLoadImage('%s') failed\n", ArcDllName);
414420
return Success;
415421
}
416422

423+
RtlStringCbCopyA(FullDllName, sizeof(FullDllName), DirectoryPath);
424+
RtlStringCbCatA(FullDllName, sizeof(FullDllName), ImportName);
425+
417426
/* Allocate DTE for newly loaded DLL */
418427
Success = PeLdrAllocateDataTableEntry(Parent ? Parent->Blink : ModuleListHead,
419428
ImportName,
@@ -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: 32 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,8 @@ WinLdrLoadDeviceDriver(PLIST_ENTRY LoadOrderListHead,
314314
PLDR_DATA_TABLE_ENTRY *DriverDTE)
315315
{
316316
CHAR FullPath[1024];
317+
CHAR FullFileName[1024];
318+
CHAR ArcPath[1024];
317319
CHAR DriverPath[1024];
318320
CHAR DllName[1024];
319321
PCHAR DriverNamePos;
@@ -349,10 +351,11 @@ WinLdrLoadDeviceDriver(PLIST_ENTRY LoadOrderListHead,
349351
}
350352

351353
// It's not loaded, we have to load it
352-
RtlStringCbPrintfA(FullPath, sizeof(FullPath), "%s%wZ", BootPath, FilePath);
354+
RtlStringCbPrintfA(ArcPath, sizeof(ArcPath), "%s%wZ", BootPath, FilePath);
355+
RtlStringCbPrintfA(FullFileName, sizeof(FullFileName), "\\SystemRoot\\%s%s", DriverPath, DllName);
353356

354-
NtLdrOutputLoadMsg(FullPath, NULL);
355-
Success = PeLdrLoadImage(FullPath, LoaderBootDriver, &DriverBase);
357+
NtLdrOutputLoadMsg(ArcPath, NULL);
358+
Success = PeLdrLoadImage(ArcPath, LoaderBootDriver, &DriverBase);
356359
if (!Success)
357360
{
358361
ERR("PeLdrLoadImage('%s') failed\n", DllName);
@@ -361,9 +364,9 @@ WinLdrLoadDeviceDriver(PLIST_ENTRY LoadOrderListHead,
361364

362365
// Allocate a DTE for it
363366
Success = PeLdrAllocateDataTableEntry(LoadOrderListHead,
364-
DllName,
365-
DllName,
366-
PaToVa(DriverBase),
367+
DllName,
368+
FullFileName,
369+
PaToVa(DriverBase),
367370
DriverDTE);
368371
if (!Success)
369372
{
@@ -380,8 +383,10 @@ WinLdrLoadDeviceDriver(PLIST_ENTRY LoadOrderListHead,
380383
(*DriverDTE)->Flags |= Flags;
381384

382385
// Look for any dependencies it may have, and load them too
383-
RtlStringCbPrintfA(FullPath, sizeof(FullPath), "%s%s", BootPath, DriverPath);
384-
Success = PeLdrScanImportDescriptorTable(LoadOrderListHead, FullPath, *DriverDTE);
386+
RtlStringCbPrintfA(ArcPath, sizeof(ArcPath), "%s%s", BootPath, DriverPath);
387+
RtlStringCbPrintfA(FullPath, sizeof(FullPath), "\\SystemRoot\\%s", DriverPath);
388+
389+
Success = PeLdrScanImportDescriptorTable(LoadOrderListHead, FullPath, ArcPath, *DriverDTE);
385390
if (!Success)
386391
{
387392
/* Cleanup and bail out */
@@ -535,6 +540,7 @@ PVOID
535540
LoadModule(
536541
IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock,
537542
IN PCCH Path,
543+
IN PCCH ArcPath,
538544
IN PCCH File,
539545
IN PCCH ImportName, // BaseDllName
540546
IN TYPE_OF_MEMORY MemoryType,
@@ -543,6 +549,7 @@ LoadModule(
543549
{
544550
BOOLEAN Success;
545551
CHAR FullFileName[MAX_PATH];
552+
CHAR ArcFileName[MAX_PATH];
546553
CHAR ProgressString[256];
547554
PVOID BaseAddress;
548555

@@ -552,8 +559,11 @@ LoadModule(
552559
RtlStringCbCopyA(FullFileName, sizeof(FullFileName), Path);
553560
RtlStringCbCatA(FullFileName, sizeof(FullFileName), File);
554561

555-
NtLdrOutputLoadMsg(FullFileName, NULL);
556-
Success = PeLdrLoadImage(FullFileName, MemoryType, &BaseAddress);
562+
RtlStringCbCopyA(ArcFileName, sizeof(ArcFileName), ArcPath);
563+
RtlStringCbCatA(ArcFileName, sizeof(ArcFileName), File);
564+
565+
NtLdrOutputLoadMsg(ArcFileName, NULL);
566+
Success = PeLdrLoadImage(ArcFileName, MemoryType, &BaseAddress);
557567
if (!Success)
558568
{
559569
ERR("PeLdrLoadImage('%s') failed\n", File);
@@ -649,15 +659,18 @@ LoadWindowsCore(IN USHORT OperatingSystemVersion,
649659
PVOID KernelBase, HalBase, KdDllBase = NULL;
650660
PLDR_DATA_TABLE_ENTRY HalDTE, KdDllDTE = NULL;
651661
CHAR DirPath[MAX_PATH];
662+
CHAR ArcPath[MAX_PATH];
652663
CHAR HalFileName[MAX_PATH];
653664
CHAR KernelFileName[MAX_PATH];
654665
CHAR KdDllName[MAX_PATH];
655666

656667
if (!KernelDTE) return FALSE;
657668

658669
/* Initialize SystemRoot\System32 path */
659-
RtlStringCbCopyA(DirPath, sizeof(DirPath), BootPath);
660-
RtlStringCbCatA(DirPath, sizeof(DirPath), "system32\\");
670+
RtlStringCbCopyA(DirPath, sizeof(DirPath), "\\SystemRoot\\system32\\");
671+
672+
RtlStringCbCopyA(ArcPath, sizeof(ArcPath), BootPath);
673+
RtlStringCbCatA(ArcPath, sizeof(ArcPath), "system32\\");
661674

662675
/* Parse the boot options */
663676
TRACE("LoadWindowsCore: BootOptions '%s'\n", BootOptions);
@@ -780,7 +793,7 @@ LoadWindowsCore(IN USHORT OperatingSystemVersion,
780793
*/
781794

782795
/* Load the Kernel */
783-
KernelBase = LoadModule(LoaderBlock, DirPath, KernelFileName,
796+
KernelBase = LoadModule(LoaderBlock, DirPath, ArcPath, KernelFileName,
784797
"ntoskrnl.exe", LoaderSystemCode, KernelDTE, 30);
785798
if (!KernelBase)
786799
{
@@ -790,7 +803,7 @@ LoadWindowsCore(IN USHORT OperatingSystemVersion,
790803
}
791804

792805
/* Load the HAL */
793-
HalBase = LoadModule(LoaderBlock, DirPath, HalFileName,
806+
HalBase = LoadModule(LoaderBlock, DirPath, ArcPath, HalFileName,
794807
"hal.dll", LoaderHalCode, &HalDTE, 35);
795808
if (!HalBase)
796809
{
@@ -865,7 +878,7 @@ LoadWindowsCore(IN USHORT OperatingSystemVersion,
865878
_strlwr(KdDllName);
866879

867880
/* Load the KD DLL. Override its base DLL name to the default "KDCOM.DLL". */
868-
KdDllBase = LoadModule(LoaderBlock, DirPath, KdDllName,
881+
KdDllBase = LoadModule(LoaderBlock, DirPath, ArcPath, KdDllName,
869882
"kdcom.dll", LoaderSystemCode, &KdDllDTE, 40);
870883
if (!KdDllBase)
871884
{
@@ -878,7 +891,7 @@ LoadWindowsCore(IN USHORT OperatingSystemVersion,
878891
IsCustomKdDll = FALSE;
879892
RtlStringCbCopyA(KdDllName, sizeof(KdDllName), "kdcom.dll");
880893

881-
KdDllBase = LoadModule(LoaderBlock, DirPath, KdDllName,
894+
KdDllBase = LoadModule(LoaderBlock, DirPath, ArcPath, KdDllName,
882895
"kdcom.dll", LoaderSystemCode, &KdDllDTE, 40);
883896
}
884897

@@ -892,21 +905,21 @@ LoadWindowsCore(IN USHORT OperatingSystemVersion,
892905
}
893906

894907
/* Load all referenced DLLs for Kernel, HAL and Kernel Debugger Transport DLL */
895-
Success = PeLdrScanImportDescriptorTable(&LoaderBlock->LoadOrderListHead, DirPath, *KernelDTE);
908+
Success = PeLdrScanImportDescriptorTable(&LoaderBlock->LoadOrderListHead, DirPath, ArcPath, *KernelDTE);
896909
if (!Success)
897910
{
898911
UiMessageBox("Could not load %s", KernelFileName);
899912
goto Quit;
900913
}
901-
Success = PeLdrScanImportDescriptorTable(&LoaderBlock->LoadOrderListHead, DirPath, HalDTE);
914+
Success = PeLdrScanImportDescriptorTable(&LoaderBlock->LoadOrderListHead, DirPath, ArcPath, HalDTE);
902915
if (!Success)
903916
{
904917
UiMessageBox("Could not load %s", HalFileName);
905918
goto Quit;
906919
}
907920
if (KdDllDTE)
908921
{
909-
Success = PeLdrScanImportDescriptorTable(&LoaderBlock->LoadOrderListHead, DirPath, KdDllDTE);
922+
Success = PeLdrScanImportDescriptorTable(&LoaderBlock->LoadOrderListHead, DirPath, ArcPath, KdDllDTE);
910923
if (!Success)
911924
{
912925
UiMessageBox("Could not load %s", KdDllName);

0 commit comments

Comments
 (0)