#define NDEBUG
#include <internal/debug.h>
+#if defined (ALLOC_PRAGMA)
+#pragma alloc_text(INIT, LdrInit1)
+#pragma alloc_text(INIT, LdrInitModuleManagement)
+#pragma alloc_text(INIT, LdrSafePEProcessModule)
+#endif
+
/* GLOBALS *******************************************************************/
LIST_ENTRY ModuleListHead;
/* FUNCTIONS *****************************************************************/
VOID
+NTAPI
LdrInitDebug ( PLOADER_MODULE Module, PWCH Name )
{
}
-VOID INIT_FUNCTION
+VOID
+INIT_FUNCTION
+NTAPI
LdrInit1 ( VOID )
{
/* Hook for KDB on initialization of the loader. */
KDB_LOADERINIT_HOOK(&NtoskrnlModuleObject, &HalModuleObject);
}
-VOID INIT_FUNCTION
+VOID
+INIT_FUNCTION
+NTAPI
LdrInitModuleManagement ( VOID )
{
PIMAGE_NT_HEADERS NtHeader;
}
NTSTATUS
+NTAPI
LdrpLoadImage (
PUNICODE_STRING DriverName,
PVOID *ModuleBase,
NTSTATUS
+NTAPI
LdrpUnloadImage ( PVOID ModuleBase )
{
return(STATUS_NOT_IMPLEMENTED);
NTSTATUS
+NTAPI
LdrpLoadAndCallImage ( PUNICODE_STRING ModuleName )
{
PDRIVER_INITIALIZE DriverEntry;
NTSTATUS
+NTAPI
LdrLoadModule(
PUNICODE_STRING Filename,
PLDR_DATA_TABLE_ENTRY *ModuleObject )
CHECKPOINT;
if (!NT_SUCCESS(Status))
{
- CPRINT("Could not open module file: %wZ\n", Filename);
+ CPRINT("Could not open module file: %wZ (Status 0x%08lx)\n", Filename, Status);
return(Status);
}
CHECKPOINT;
NTSTATUS
+NTAPI
LdrUnloadModule ( PLDR_DATA_TABLE_ENTRY ModuleObject )
{
KIRQL Irql;
}
NTSTATUS
+NTAPI
LdrpQueryModuleInformation (
PVOID Buffer,
ULONG Size,
}
PLDR_DATA_TABLE_ENTRY
+NTAPI
LdrGetModuleObject ( PUNICODE_STRING ModuleName )
{
PLDR_DATA_TABLE_ENTRY Module;
Module = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InLoadOrderModuleList);
DPRINT("Comparing %wZ and %wZ\n",
- &Module->BaseName,
+ &Module->BaseDllName,
ModuleName);
if (!LdrpCompareModuleNames(&Module->BaseDllName, ModuleName))
}
-PVOID INIT_FUNCTION
+PVOID
+INIT_FUNCTION
+NTAPI
LdrSafePEProcessModule (
PVOID ModuleLoadBase,
PVOID DriverBase,
/*
* Don't relocate within the relocation section itself.
- * GCC/LD generates sometimes relocation records for the relecotion section.
+ * GCC/LD generates sometimes relocation records for the relocation section.
* This is a bug in GCC/LD.
*/
if ((ULONG_PTR)ShortPtr < (ULONG_PTR)RelocationDir ||
PDWORD * ExFunctions;
PDWORD * ExNames;
USHORT * ExOrdinals;
- ULONG i;
PVOID ExName;
ULONG Ordinal;
PVOID Function;
- LONG minn, maxn;
+ LONG minn, maxn, mid, res;
ULONG ExportDirSize;
DPRINT("LdrPEGetExportByName %x %s %hu\n", BaseAddress, SymbolName, Hint);
}
/*
- * Try a binary search first
+ * Binary search
*/
minn = 0;
maxn = ExportDir->NumberOfNames - 1;
while (minn <= maxn)
{
- LONG mid;
- LONG res;
-
mid = (minn + maxn) / 2;
ExName = RVA(BaseAddress, ExNames[mid]);
return Function;
}
}
- else if (minn == maxn)
- {
- DPRINT("LdrPEGetExportByName(): binary search failed\n");
- break;
- }
else if (res > 0)
{
maxn = mid - 1;
}
}
- /*
- * Fall back on a linear search
- */
- DPRINT("LdrPEGetExportByName(): Falling back on a linear search of export table\n");
- for (i = 0; i < ExportDir->NumberOfNames; i++)
- {
- ExName = RVA(BaseAddress, ExNames[i]);
- if (strcmp(ExName, (PCHAR)SymbolName) == 0)
- {
- Ordinal = ExOrdinals[i];
- Function = RVA(BaseAddress, ExFunctions[Ordinal]);
- DPRINT("%x %x %x\n", Function, ExportDir, ExportDir + ExportDirSize);
- if ((ULONG_PTR)Function >= (ULONG_PTR)ExportDir &&
- (ULONG_PTR)Function < (ULONG_PTR)ExportDir + ExportDirSize)
- {
- DPRINT("Forward: %s\n", (PCHAR)Function);
- Function = LdrPEFixupForward((PCHAR)Function);
- }
- if (Function == NULL)
- {
- break;
- }
- return Function;
- }
- }
+ ExName = RVA(BaseAddress, ExNames[mid]);
DPRINT1("LdrPEGetExportByName(): failed to find %s\n",SymbolName);
return (PVOID)NULL;
}
? RVA(BaseAddress, ExFunctions[Ordinal - ExportDir->Base] )
: NULL;
- if (((ULONG)Function >= (ULONG)ExportDir) &&
- ((ULONG)Function < (ULONG)ExportDir + (ULONG)ExportDirSize))
+ if (((ULONG_PTR)Function >= (ULONG_PTR)ExportDir) &&
+ ((ULONG_PTR)Function < (ULONG_PTR)ExportDir + ExportDirSize))
{
DPRINT("Forward: %s\n", (PCHAR)Function);
Function = LdrPEFixupForward((PCHAR)Function);