Author: tkreuzer
Date: Mon Oct 3 08:14:00 2011
New Revision: 53947
URL:
http://svn.reactos.org/svn/reactos?rev=53947&view=rev
Log:
[FREELDR]
- Pass the module list head to a number of pe loader functions instead of the loader
block.
- use static for some functions
- remove unneeded prototypes
Modified:
trunk/reactos/boot/freeldr/freeldr/disk/scsiport.c
trunk/reactos/boot/freeldr/freeldr/include/winldr.h
trunk/reactos/boot/freeldr/freeldr/windows/peloader.c
trunk/reactos/boot/freeldr/freeldr/windows/winldr.c
trunk/reactos/boot/freeldr/freeldr/windows/wlregistry.c
Modified: trunk/reactos/boot/freeldr/freeldr/disk/scsiport.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/disk/…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/disk/scsiport.c [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/disk/scsiport.c [iso-8859-1] Mon Oct 3 08:14:00
2011
@@ -1563,7 +1563,7 @@
LoadBootDeviceDriver(VOID)
{
PIMAGE_NT_HEADERS NtHeaders;
- LOADER_PARAMETER_BLOCK LoaderBlock;
+ LIST_ENTRY ModuleListHead;
PIMAGE_IMPORT_DESCRIPTOR ImportTable;
ULONG ImportTableSize;
PLDR_DATA_TABLE_ENTRY BootDdDTE, FreeldrDTE;
@@ -1572,9 +1572,8 @@
ULONG (NTAPI *EntryPoint)(IN PVOID DriverObject, IN PVOID RegistryPath);
BOOLEAN Status;
- /* Some initialization of our temporary loader block */
- RtlZeroMemory(&LoaderBlock, sizeof(LOADER_PARAMETER_BLOCK));
- InitializeListHead(&LoaderBlock.LoadOrderListHead);
+ /* Initialize the loaded module list */
+ InitializeListHead(&ModuleListHead);
/* Create full ntbootdd.sys path */
MachDiskGetBootPath(NtBootDdPath, sizeof(NtBootDdPath));
@@ -1589,14 +1588,14 @@
}
/* Allocate a DTE for ntbootdd */
- Status = WinLdrAllocateDataTableEntry(&LoaderBlock, "ntbootdd.sys",
+ Status = WinLdrAllocateDataTableEntry(&ModuleListHead, "ntbootdd.sys",
"NTBOOTDD.SYS", ImageBase, &BootDdDTE);
if (!Status)
return EIO;
/* 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",
+ Status = WinLdrAllocateDataTableEntry(&ModuleListHead, "scsiport.sys",
"FREELDR.SYS", &__ImageBase, &FreeldrDTE);
if (!Status)
{
@@ -1605,7 +1604,7 @@
}
/* Fix imports */
- Status = WinLdrScanImportDescriptorTable(&LoaderBlock, "", BootDdDTE);
+ Status = WinLdrScanImportDescriptorTable(&ModuleListHead, "",
BootDdDTE);
/* Now unlinkt the DTEs, they won't be valid later */
RemoveEntryList(&BootDdDTE->InLoadOrderLinks);
Modified: trunk/reactos/boot/freeldr/freeldr/include/winldr.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/inclu…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/include/winldr.h [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/include/winldr.h [iso-8859-1] Mon Oct 3 08:14:00
2011
@@ -107,14 +107,14 @@
BOOLEAN
-WinLdrAllocateDataTableEntry(IN OUT PLOADER_PARAMETER_BLOCK WinLdrBlock,
+WinLdrAllocateDataTableEntry(IN OUT PLIST_ENTRY ModuleListHead,
IN PCCH BaseDllName,
IN PCCH FullDllName,
IN PVOID BasePA,
OUT PLDR_DATA_TABLE_ENTRY *NewEntry);
BOOLEAN
-WinLdrScanImportDescriptorTable(IN OUT PLOADER_PARAMETER_BLOCK WinLdrBlock,
+WinLdrScanImportDescriptorTable(IN OUT PLIST_ENTRY ModuleListHead,
IN PCCH DirectoryPath,
IN PLDR_DATA_TABLE_ENTRY ScanDTE);
@@ -135,12 +135,9 @@
BOOLEAN
-WinLdrCheckForLoadedDll(IN OUT PLOADER_PARAMETER_BLOCK WinLdrBlock,
+WinLdrCheckForLoadedDll(IN OUT PLIST_ENTRY ModuleListHead,
IN PCH DllName,
OUT PLDR_DATA_TABLE_ENTRY *LoadedEntry);
-
-BOOLEAN
-WinLdrLoadBootDrivers(PLOADER_PARAMETER_BLOCK LoaderBlock, LPSTR BootPath);
VOID
WinLdrInitializePhase1(PLOADER_PARAMETER_BLOCK LoaderBlock,
Modified: trunk/reactos/boot/freeldr/freeldr/windows/peloader.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/windo…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/windows/peloader.c [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/windows/peloader.c [iso-8859-1] Mon Oct 3 08:14:00
2011
@@ -19,12 +19,12 @@
DBG_DEFAULT_CHANNEL(PELOADER);
-BOOLEAN
+static BOOLEAN
WinLdrpCompareDllName(IN PCH DllName,
IN PUNICODE_STRING UnicodeName);
-BOOLEAN
-WinLdrpBindImportName(IN OUT PLOADER_PARAMETER_BLOCK WinLdrBlock,
+static BOOLEAN
+WinLdrpBindImportName(IN OUT PLIST_ENTRY ModuleListHead,
IN PVOID DllBase,
IN PVOID ImageBase,
IN PIMAGE_THUNK_DATA ThunkData,
@@ -32,14 +32,14 @@
IN ULONG ExportSize,
IN BOOLEAN ProcessForwards);
-BOOLEAN
-WinLdrpLoadAndScanReferencedDll(PLOADER_PARAMETER_BLOCK WinLdrBlock,
+static BOOLEAN
+WinLdrpLoadAndScanReferencedDll(PLIST_ENTRY ModuleListHead,
PCCH DirectoryPath,
PCH ImportName,
PLDR_DATA_TABLE_ENTRY *DataTableEntry);
-BOOLEAN
-WinLdrpScanImportAddressTable(IN OUT PLOADER_PARAMETER_BLOCK WinLdrBlock,
+static BOOLEAN
+WinLdrpScanImportAddressTable(IN OUT PLIST_ENTRY ModuleListHead,
IN PVOID DllBase,
IN PVOID ImageBase,
IN PIMAGE_THUNK_DATA ThunkData);
@@ -50,7 +50,7 @@
/* Returns TRUE if DLL has already been loaded - looks in LoadOrderList in LPB */
BOOLEAN
-WinLdrCheckForLoadedDll(IN OUT PLOADER_PARAMETER_BLOCK WinLdrBlock,
+WinLdrCheckForLoadedDll(IN OUT PLIST_ENTRY ModuleListHead,
IN PCH DllName,
OUT PLDR_DATA_TABLE_ENTRY *LoadedEntry)
{
@@ -62,16 +62,17 @@
/* Just go through each entry in the LoadOrderList and compare loaded module's
name with a given name */
- ModuleEntry = WinLdrBlock->LoadOrderListHead.Flink;
- while (ModuleEntry != &WinLdrBlock->LoadOrderListHead)
+ ModuleEntry = ModuleListHead->Flink;
+ while (ModuleEntry != ModuleListHead)
{
/* Get pointer to the current DTE */
DataTableEntry = CONTAINING_RECORD(ModuleEntry,
LDR_DATA_TABLE_ENTRY,
InLoadOrderLinks);
- TRACE("WinLdrCheckForLoadedDll: DTE %p, EP %p\n",
- DataTableEntry, DataTableEntry->EntryPoint);
+ TRACE("WinLdrCheckForLoadedDll: DTE %p, EP %p, base %p name
'%ws'\n",
+ DataTableEntry, DataTableEntry->EntryPoint, DataTableEntry->DllBase,
+ VaToPa(DataTableEntry->BaseDllName.Buffer));
/* Compare names */
if (WinLdrpCompareDllName(DllName, &DataTableEntry->BaseDllName))
@@ -93,7 +94,7 @@
}
BOOLEAN
-WinLdrScanImportDescriptorTable(IN OUT PLOADER_PARAMETER_BLOCK WinLdrBlock,
+WinLdrScanImportDescriptorTable(IN OUT PLIST_ENTRY ModuleListHead,
IN PCCH DirectoryPath,
IN PLDR_DATA_TABLE_ENTRY ScanDTE)
{
@@ -132,9 +133,9 @@
continue;
/* Load the DLL if it is not already loaded */
- if (!WinLdrCheckForLoadedDll(WinLdrBlock, ImportName, &DataTableEntry))
- {
- Status = WinLdrpLoadAndScanReferencedDll(WinLdrBlock,
+ if (!WinLdrCheckForLoadedDll(ModuleListHead, ImportName, &DataTableEntry))
+ {
+ Status = WinLdrpLoadAndScanReferencedDll(ModuleListHead,
DirectoryPath,
ImportName,
&DataTableEntry);
@@ -148,7 +149,7 @@
/* Scan its import address table */
Status = WinLdrpScanImportAddressTable(
- WinLdrBlock,
+ ModuleListHead,
DataTableEntry->DllBase,
ScanDTE->DllBase,
(PIMAGE_THUNK_DATA)RVA(ScanDTE->DllBase, ImportTable->FirstThunk));
@@ -164,7 +165,7 @@
}
BOOLEAN
-WinLdrAllocateDataTableEntry(IN OUT PLOADER_PARAMETER_BLOCK WinLdrBlock,
+WinLdrAllocateDataTableEntry(IN OUT PLIST_ENTRY ModuleListHead,
IN PCCH BaseDllName,
IN PCCH FullDllName,
IN PVOID BasePA,
@@ -175,6 +176,8 @@
PLDR_DATA_TABLE_ENTRY DataTableEntry;
PIMAGE_NT_HEADERS NtHeaders;
USHORT Length;
+ TRACE("WinLdrAllocateDataTableEntry(, '%s', '%s', %p)\n",
+ BaseDllName, FullDllName, BasePA);
/* Allocate memory for a data table entry, zero-initialize it */
DataTableEntry = (PLDR_DATA_TABLE_ENTRY)MmHeapAlloc(sizeof(LDR_DATA_TABLE_ENTRY));
@@ -236,7 +239,9 @@
DataTableEntry->LoadCount = 1;
/* Insert this DTE to a list in the LPB */
- InsertTailList(&WinLdrBlock->LoadOrderListHead,
&DataTableEntry->InLoadOrderLinks);
+ InsertTailList(ModuleListHead, &DataTableEntry->InLoadOrderLinks);
+ TRACE("Inserting DTE %p, name='%S' DllBase=%p \n", DataTableEntry,
+ DataTableEntry->BaseDllName.Buffer, DataTableEntry->DllBase);
/* Save pointer to a newly allocated and initialized entry */
*NewEntry = DataTableEntry;
@@ -442,7 +447,7 @@
/* PRIVATE FUNCTIONS *******************************************************/
/* DllName - physical, UnicodeString->Buffer - virtual */
-BOOLEAN
+static BOOLEAN
WinLdrpCompareDllName(IN PCH DllName,
IN PUNICODE_STRING UnicodeName)
{
@@ -488,8 +493,8 @@
return FALSE;
}
-BOOLEAN
-WinLdrpBindImportName(IN OUT PLOADER_PARAMETER_BLOCK WinLdrBlock,
+static BOOLEAN
+WinLdrpBindImportName(IN OUT PLIST_ENTRY ModuleListHead,
IN PVOID DllBase,
IN PVOID ImageBase,
IN PIMAGE_THUNK_DATA ThunkData,
@@ -651,7 +656,7 @@
*strchr(ForwardDllName,'.') = '\0';
TRACE("WinLdrpBindImportName(): ForwardDllName %s\n", ForwardDllName);
- if (!WinLdrCheckForLoadedDll(WinLdrBlock, ForwardDllName, &DataTableEntry))
+ if (!WinLdrCheckForLoadedDll(ModuleListHead, ForwardDllName, &DataTableEntry))
{
/* We can't continue if DLL couldn't be loaded, so bomb out with an error */
//Print(L"Error loading DLL!\n");
@@ -692,7 +697,7 @@
/* And recursively call ourselves */
Status = WinLdrpBindImportName(
- WinLdrBlock,
+ ModuleListHead,
DataTableEntry->DllBase,
ImageBase,
&RefThunkData,
@@ -717,8 +722,8 @@
return TRUE;
}
-BOOLEAN
-WinLdrpLoadAndScanReferencedDll(PLOADER_PARAMETER_BLOCK WinLdrBlock,
+static BOOLEAN
+WinLdrpLoadAndScanReferencedDll(PLIST_ENTRY ModuleListHead,
PCCH DirectoryPath,
PCH ImportName,
PLDR_DATA_TABLE_ENTRY *DataTableEntry)
@@ -744,7 +749,7 @@
}
/* Allocate DTE for newly loaded DLL */
- Status = WinLdrAllocateDataTableEntry(WinLdrBlock,
+ Status = WinLdrAllocateDataTableEntry(ModuleListHead,
ImportName,
FullDllName,
BasePA,
@@ -759,7 +764,7 @@
/* Scan its dependencies too */
TRACE("WinLdrScanImportDescriptorTable() calling ourselves for %S\n",
VaToPa((*DataTableEntry)->BaseDllName.Buffer));
- Status = WinLdrScanImportDescriptorTable(WinLdrBlock, DirectoryPath, *DataTableEntry);
+ Status = WinLdrScanImportDescriptorTable(ModuleListHead, DirectoryPath,
*DataTableEntry);
if (!Status)
{
@@ -770,8 +775,8 @@
return TRUE;
}
-BOOLEAN
-WinLdrpScanImportAddressTable(IN OUT PLOADER_PARAMETER_BLOCK WinLdrBlock,
+static BOOLEAN
+WinLdrpScanImportAddressTable(IN OUT PLIST_ENTRY ModuleListHead,
IN PVOID DllBase,
IN PVOID ImageBase,
IN PIMAGE_THUNK_DATA ThunkData)
@@ -786,7 +791,7 @@
/* Obtain the export table from the DLL's base */
if (DllBase == NULL)
{
- //Print(L"Error, DllBase == NULL!\n");
+ ERR("Error, DllBase == NULL!\n");
return FALSE;
}
else
@@ -802,14 +807,17 @@
/* If pointer to Export Directory is */
if (ExportDirectory == NULL)
- return FALSE;
+ {
+ ERR("DllBase=%p(%p)\n", DllBase, VaToPa(DllBase));
+ return FALSE;
+ }
/* Go through each entry in the thunk table and bind it */
while (((PIMAGE_THUNK_DATA)VaToPa(ThunkData))->u1.AddressOfData != 0)
{
/* Bind it */
Status = WinLdrpBindImportName(
- WinLdrBlock,
+ ModuleListHead,
DllBase,
ImageBase,
ThunkData,
Modified: trunk/reactos/boot/freeldr/freeldr/windows/winldr.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/windo…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/windows/winldr.c [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/windows/winldr.c [iso-8859-1] Mon Oct 3 08:14:00
2011
@@ -214,6 +214,7 @@
if (LoaderBlock->SetupLdrBlock)
LoaderBlock->SetupLdrBlock = PaToVa(LoaderBlock->SetupLdrBlock);
+ TRACE("WinLdrInitializePhase1() completed\n");
}
BOOLEAN
@@ -252,7 +253,7 @@
// Check if driver is already loaded
- Status = WinLdrCheckForLoadedDll(LoaderBlock, DllName, DriverDTE);
+ Status = WinLdrCheckForLoadedDll(&LoaderBlock->LoadOrderListHead, DllName,
DriverDTE);
if (Status)
{
// We've got the pointer to its DTE, just return success
@@ -266,7 +267,7 @@
return FALSE;
// Allocate a DTE for it
- Status = WinLdrAllocateDataTableEntry(LoaderBlock, DllName, DllName, DriverBase,
DriverDTE);
+ Status = WinLdrAllocateDataTableEntry(&LoaderBlock->LoadOrderListHead, DllName,
DllName, DriverBase, DriverDTE);
if (!Status)
{
ERR("WinLdrAllocateDataTableEntry() failed\n");
@@ -278,7 +279,7 @@
// Look for any dependencies it may have, and load them too
sprintf(FullPath,"%s%s", BootPath, DriverPath);
- Status = WinLdrScanImportDescriptorTable(LoaderBlock, FullPath, *DriverDTE);
+ Status = WinLdrScanImportDescriptorTable(&LoaderBlock->LoadOrderListHead,
FullPath, *DriverDTE);
if (!Status)
{
ERR("WinLdrScanImportDescriptorTable() failed for %s\n", FullPath);
@@ -439,7 +440,7 @@
strcpy(FullFileName, "WINDOWS\\SYSTEM32\\");
strcat(FullFileName, File);
- WinLdrAllocateDataTableEntry(LoaderBlock, File,
+ WinLdrAllocateDataTableEntry(&LoaderBlock->LoadOrderListHead, File,
FullFileName, BaseAdress, Dte);
return BaseAdress;
@@ -587,10 +588,10 @@
/* Load all referenced DLLs for kernel, HAL and kdcom.dll */
strcpy(FileName, BootPath);
strcat(FileName, "system32\\");
- Status = WinLdrScanImportDescriptorTable(LoaderBlock, FileName, KernelDTE);
- Status &= WinLdrScanImportDescriptorTable(LoaderBlock, FileName, HalDTE);
+ Status = WinLdrScanImportDescriptorTable(&LoaderBlock->LoadOrderListHead,
FileName, KernelDTE);
+ Status &= WinLdrScanImportDescriptorTable(&LoaderBlock->LoadOrderListHead,
FileName, HalDTE);
if (KdComDTE)
- Status &= WinLdrScanImportDescriptorTable(LoaderBlock, FileName, KdComDTE);
+ Status &= WinLdrScanImportDescriptorTable(&LoaderBlock->LoadOrderListHead,
FileName, KdComDTE);
if (!Status)
{
Modified: trunk/reactos/boot/freeldr/freeldr/windows/wlregistry.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/windo…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/windows/wlregistry.c [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/windows/wlregistry.c [iso-8859-1] Mon Oct 3
08:14:00 2011
@@ -16,26 +16,15 @@
// The only global var here, used to mark mem pages as NLS in WinLdrSetupMemoryLayout()
ULONG TotalNLSSize = 0;
-BOOLEAN WinLdrGetNLSNames(LPSTR AnsiName,
- LPSTR OemName,
- LPSTR LangName);
-
-BOOLEAN
-WinLdrLoadNLSData(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock,
- IN LPCSTR DirectoryPath,
- IN LPCSTR AnsiFileName,
- IN LPCSTR OemFileName,
- IN LPCSTR LanguageFileName);
-
-VOID
-WinLdrScanRegistry(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock,
+static BOOLEAN
+WinLdrGetNLSNames(LPSTR AnsiName,
+ LPSTR OemName,
+ LPSTR LangName);
+
+static VOID
+WinLdrScanRegistry(IN OUT PLIST_ENTRY BootDriverListHead,
IN LPCSTR DirectoryPath);
-BOOLEAN
-WinLdrAddDriverToList(LIST_ENTRY *BootDriverListHead,
- LPWSTR RegistryPath,
- LPWSTR ImagePath,
- LPWSTR ServiceName);
/* FUNCTIONS **************************************************************/
@@ -173,7 +162,7 @@
BOOLEAN Status;
// Scan registry and prepare boot drivers list
- WinLdrScanRegistry(LoaderBlock, DirectoryPath);
+ WinLdrScanRegistry(&LoaderBlock->BootDriverListHead, DirectoryPath);
// Get names of NLS files
Status = WinLdrGetNLSNames(AnsiName, OemName, LangName);
@@ -201,9 +190,10 @@
/* PRIVATE FUNCTIONS ******************************************************/
// Queries registry for those three file names
-BOOLEAN WinLdrGetNLSNames(LPSTR AnsiName,
- LPSTR OemName,
- LPSTR LangName)
+static BOOLEAN
+WinLdrGetNLSNames(LPSTR AnsiName,
+ LPSTR OemName,
+ LPSTR LangName)
{
LONG rc = ERROR_SUCCESS;
FRLDRHKEY hKey;
@@ -459,8 +449,8 @@
return FALSE;
}
-VOID
-WinLdrScanRegistry(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock,
+static VOID
+WinLdrScanRegistry(IN OUT PLIST_ENTRY BootDriverListHead,
IN LPCSTR DirectoryPath)
{
LONG rc = 0;
@@ -602,7 +592,7 @@
TRACE("Adding boot driver: '%s'\n", ImagePath);
- Status = WinLdrAddDriverToList(&LoaderBlock->BootDriverListHead,
+ Status = WinLdrAddDriverToList(BootDriverListHead,
L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\",
TempImagePath,
ServiceName);
@@ -680,7 +670,7 @@
}
TRACE(" Adding boot driver: '%s'\n", ImagePath);
- Status = WinLdrAddDriverToList(&LoaderBlock->BootDriverListHead,
+ Status = WinLdrAddDriverToList(BootDriverListHead,
L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\",
TempImagePath,
ServiceName);