[ros-diffs] [tkreuzer] 53915: [FREELDR] Replace the fake export table with the real export table of freeldr, when loading ntbootdd.sys

tkreuzer at svn.reactos.org tkreuzer at svn.reactos.org
Sat Oct 1 12:50:33 UTC 2011


Author: tkreuzer
Date: Sat Oct  1 12:50:33 2011
New Revision: 53915

URL: http://svn.reactos.org/svn/reactos?rev=53915&view=rev
Log:
[FREELDR]
Replace the fake export table with the real export table of freeldr, when loading ntbootdd.sys

Modified:
    trunk/reactos/boot/freeldr/freeldr/disk/scsiport.c

Modified: trunk/reactos/boot/freeldr/freeldr/disk/scsiport.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/disk/scsiport.c?rev=53915&r1=53914&r2=53915&view=diff
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/disk/scsiport.c [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/disk/scsiport.c [iso-8859-1] Sat Oct  1 12:50:33 2011
@@ -1557,68 +1557,11 @@
     WRITE_REGISTER_USHORT(Register, Value);
 }
 
+extern char __ImageBase;
+
 ULONG
 LoadBootDeviceDriver(VOID)
 {
-    struct
-    {
-        CHAR* Name;
-        PVOID Function;
-    } ExportTable[] =
-    {
-        { "ScsiDebugPrint", ScsiDebugPrint },
-        { "ScsiPortCompleteRequest", ScsiPortCompleteRequest },
-        { "ScsiPortConvertPhysicalAddressToUlong", ScsiPortConvertPhysicalAddressToUlong },
-        { "ScsiPortConvertUlongToPhysicalAddress", ScsiPortConvertUlongToPhysicalAddress },
-        { "ScsiPortFlushDma", ScsiPortFlushDma },
-        { "ScsiPortFreeDeviceBase", ScsiPortFreeDeviceBase },
-        { "ScsiPortGetBusData", ScsiPortGetBusData },
-        { "ScsiPortGetDeviceBase", ScsiPortGetDeviceBase },
-        { "ScsiPortGetLogicalUnit", ScsiPortGetLogicalUnit },
-        { "ScsiPortGetPhysicalAddress", ScsiPortGetPhysicalAddress },
-        { "ScsiPortGetSrb", ScsiPortGetSrb },
-        { "ScsiPortGetUncachedExtension", ScsiPortGetUncachedExtension },
-        { "ScsiPortGetVirtualAddress", ScsiPortGetVirtualAddress },
-        { "ScsiPortInitialize", ScsiPortInitialize },
-        { "ScsiPortIoMapTransfer", ScsiPortIoMapTransfer },
-        { "ScsiPortLogError", ScsiPortLogError },
-        { "ScsiPortMoveMemory", ScsiPortMoveMemory },
-        { "ScsiPortNotification", ScsiPortNotification },
-        { "ScsiPortReadPortBufferUchar", ScsiPortReadPortBufferUchar },
-        { "ScsiPortReadPortBufferUlong", ScsiPortReadPortBufferUlong },
-        { "ScsiPortReadPortBufferUshort", ScsiPortReadPortBufferUshort },
-        { "ScsiPortReadPortUchar", ScsiPortReadPortUchar },
-        { "ScsiPortReadPortUlong", ScsiPortReadPortUlong },
-        { "ScsiPortReadPortUshort", ScsiPortReadPortUshort },
-        { "ScsiPortReadRegisterBufferUchar", ScsiPortReadRegisterBufferUchar },
-        { "ScsiPortReadRegisterBufferUlong", ScsiPortReadRegisterBufferUlong },
-        { "ScsiPortReadRegisterBufferUshort", ScsiPortReadRegisterBufferUshort },
-        { "ScsiPortReadRegisterUchar", ScsiPortReadRegisterUchar },
-        { "ScsiPortReadRegisterUlong", ScsiPortReadRegisterUlong },
-        { "ScsiPortReadRegisterUshort", ScsiPortReadRegisterUshort },
-        { "ScsiPortSetBusDataByOffset", ScsiPortSetBusDataByOffset },
-        { "ScsiPortStallExecution", ScsiPortStallExecution },
-        { "ScsiPortValidateRange", ScsiPortValidateRange },
-        { "ScsiPortWritePortBufferUchar", ScsiPortWritePortBufferUchar },
-        { "ScsiPortWritePortBufferUlong", ScsiPortWritePortBufferUlong },
-        { "ScsiPortWritePortBufferUshort", ScsiPortWritePortBufferUshort },
-        { "ScsiPortWritePortUchar", ScsiPortWritePortUchar },
-        { "ScsiPortWritePortUlong", ScsiPortWritePortUlong },
-        { "ScsiPortWritePortUshort", ScsiPortWritePortUshort },
-        { "ScsiPortWriteRegisterBufferUchar", ScsiPortWriteRegisterBufferUchar },
-        { "ScsiPortWriteRegisterBufferUlong", ScsiPortWriteRegisterBufferUlong },
-        { "ScsiPortWriteRegisterBufferUshort", ScsiPortWriteRegisterBufferUshort },
-        { "ScsiPortWriteRegisterUchar", ScsiPortWriteRegisterUchar },
-        { "ScsiPortWriteRegisterUlong", ScsiPortWriteRegisterUlong },
-        { "ScsiPortWriteRegisterUshort", ScsiPortWriteRegisterUshort },
-    };
-    IMAGE_DOS_HEADER ImageDosHeader;
-    IMAGE_NT_HEADERS ImageNtHeaders;
-    IMAGE_EXPORT_DIRECTORY ImageExportDirectory;
-    CHAR* TableName[sizeof(ExportTable) / sizeof(ExportTable[0])];
-    USHORT OrdinalTable[sizeof(ExportTable) / sizeof(ExportTable[0])];
-    ULONG FunctionTable[sizeof(ExportTable) / sizeof(ExportTable[0])];
-
     PIMAGE_NT_HEADERS NtHeaders;
     LOADER_PARAMETER_BLOCK LoaderBlock;
     PIMAGE_IMPORT_DESCRIPTOR ImportTable;
@@ -1627,37 +1570,11 @@
     CHAR NtBootDdPath[MAX_PATH];
     PVOID ImageBase;
     ULONG (NTAPI *EntryPoint)(IN PVOID DriverObject, IN PVOID RegistryPath);
-    USHORT i;
     BOOLEAN Status;
 
     /* Some initialization of our temporary loader block */
     RtlZeroMemory(&LoaderBlock, sizeof(LOADER_PARAMETER_BLOCK));
     InitializeListHead(&LoaderBlock.LoadOrderListHead);
-
-    /* Create our fake executable header for freeldr.sys */
-    RtlZeroMemory(&ImageDosHeader, sizeof(IMAGE_DOS_HEADER));
-    RtlZeroMemory(&ImageNtHeaders, sizeof(IMAGE_NT_HEADERS));
-    RtlZeroMemory(&ImageExportDirectory, sizeof(IMAGE_EXPORT_DIRECTORY));
-    ImageDosHeader.e_magic = SWAPW(IMAGE_DOS_SIGNATURE);
-    ImageDosHeader.e_lfanew = SWAPD((ULONG_PTR)&ImageNtHeaders - (ULONG_PTR)&ImageDosHeader);
-    ImageNtHeaders.Signature = IMAGE_NT_SIGNATURE;
-    ImageNtHeaders.OptionalHeader.NumberOfRvaAndSizes = SWAPD(IMAGE_DIRECTORY_ENTRY_EXPORT + 1);
-    ImageNtHeaders.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress =
-        SWAPW((ULONG_PTR)&ImageExportDirectory - (ULONG_PTR)&ImageDosHeader);
-    ImageNtHeaders.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size = 1;
-    ImageExportDirectory.NumberOfNames = sizeof(ExportTable) / sizeof(ExportTable[0]);
-    ImageExportDirectory.AddressOfNames = (ULONG_PTR)TableName - (ULONG_PTR)&ImageDosHeader;
-    ImageExportDirectory.AddressOfNameOrdinals = (ULONG_PTR)OrdinalTable - (ULONG_PTR)&ImageDosHeader;
-    ImageExportDirectory.NumberOfFunctions = sizeof(ExportTable) / sizeof(ExportTable[0]);
-    ImageExportDirectory.AddressOfFunctions = (ULONG_PTR)FunctionTable - (ULONG_PTR)&ImageDosHeader;
-
-    /* Fill freeldr.sys export table */
-    for (i = 0; i < sizeof(ExportTable) / sizeof(ExportTable[0]); i++)
-    {
-        TableName[i] = PaToVa((PVOID)((ULONG_PTR)ExportTable[i].Name - (ULONG_PTR)&ImageDosHeader));
-        OrdinalTable[i] = i;
-        FunctionTable[i] = (ULONG)((ULONG_PTR)ExportTable[i].Function - (ULONG_PTR)&ImageDosHeader);
-    }
 
     /* Create full ntbootdd.sys path */
     MachDiskGetBootPath(NtBootDdPath, sizeof(NtBootDdPath));
@@ -1677,9 +1594,10 @@
     if (!Status)
         return EIO;
 
-    /* Add freeldr.sys to list of loaded executables, it repaces scsiport.sys */
+    /* Add the PE part of freeldr.sys to the list of loaded executables, it
+       contains Scsiport* exports, imported by ntbootdd.sys */
     Status = WinLdrAllocateDataTableEntry(&LoaderBlock, "scsiport.sys",
-        "FREELDR.SYS", &ImageDosHeader, &FreeldrDTE);
+        "FREELDR.SYS", &__ImageBase, &FreeldrDTE);
     if (!Status)
     {
         RemoveEntryList(&BootDdDTE->InLoadOrderLinks);




More information about the Ros-diffs mailing list