diff --git a/reactos/lib/ntdll/ldr/utils.c b/reactos/lib/ntdll/ldr/utils.c index aae4079612f..6ccecc12771 100644 --- a/reactos/lib/ntdll/ldr/utils.c +++ b/reactos/lib/ntdll/ldr/utils.c @@ -237,6 +237,7 @@ LdrpInitializeTlsForProccess(VOID) PLDR_DATA_TABLE_ENTRY Module; PIMAGE_TLS_DIRECTORY TlsDirectory; PTLS_DATA TlsData; + ULONG Size; DPRINT("LdrpInitializeTlsForProccess() called for %wZ\n", &ExeModule->BaseDllName); @@ -263,7 +264,7 @@ LdrpInitializeTlsForProccess(VOID) RtlImageDirectoryEntryToData(Module->DllBase, TRUE, IMAGE_DIRECTORY_ENTRY_TLS, - NULL); + &Size); ASSERT(Module->TlsIndex < LdrpTlsCount); TlsData = &LdrpTlsArray[Module->TlsIndex]; TlsData->StartAddressOfRawData = (PVOID)TlsDirectory->StartAddressOfRawData; @@ -1476,6 +1477,7 @@ LdrpProcessImportDirectory( NTSTATUS Status; PIMAGE_IMPORT_DESCRIPTOR ImportModuleDirectory; PCHAR Name; + ULONG Size; DPRINT("LdrpProcessImportDirectory(%x '%wZ', '%s')\n", Module, &Module->BaseDllName, ImportedName); @@ -1485,7 +1487,7 @@ LdrpProcessImportDirectory( RtlImageDirectoryEntryToData(Module->DllBase, TRUE, IMAGE_DIRECTORY_ENTRY_IMPORT, - NULL); + &Size); if (ImportModuleDirectory == NULL) { return STATUS_UNSUCCESSFUL; @@ -1529,6 +1531,7 @@ LdrpAdjustImportDirectory(PLDR_DATA_TABLE_ENTRY Module, ULONG IATSize; PIMAGE_NT_HEADERS NTHeaders; PCHAR Name; + ULONG Size; DPRINT("LdrpAdjustImportDirectory(Module %x '%wZ', %x '%wZ', %x '%s')\n", Module, &Module->BaseDllName, ImportedModule, &ImportedModule->BaseDllName, ImportedName); @@ -1537,7 +1540,7 @@ LdrpAdjustImportDirectory(PLDR_DATA_TABLE_ENTRY Module, RtlImageDirectoryEntryToData(Module->DllBase, TRUE, IMAGE_DIRECTORY_ENTRY_IMPORT, - NULL); + &Size); if (ImportModuleDirectory == NULL) { return STATUS_UNSUCCESSFUL; @@ -1647,6 +1650,7 @@ LdrFixupImports(IN PWSTR SearchPath OPTIONAL, NTSTATUS Status; PLDR_DATA_TABLE_ENTRY ImportedModule; PCHAR ImportedName; + ULONG Size; DPRINT("LdrFixupImports(SearchPath %x, Module %x)\n", SearchPath, Module); @@ -1655,7 +1659,7 @@ LdrFixupImports(IN PWSTR SearchPath OPTIONAL, RtlImageDirectoryEntryToData(Module->DllBase, TRUE, IMAGE_DIRECTORY_ENTRY_TLS, - NULL); + &Size); if (TlsDirectory) { TlsSize = TlsDirectory->EndAddressOfRawData @@ -1676,13 +1680,13 @@ LdrFixupImports(IN PWSTR SearchPath OPTIONAL, RtlImageDirectoryEntryToData(Module->DllBase, TRUE, IMAGE_DIRECTORY_ENTRY_IMPORT, - NULL); + &Size); BoundImportDescriptor = (PIMAGE_BOUND_IMPORT_DESCRIPTOR) RtlImageDirectoryEntryToData(Module->DllBase, TRUE, IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT, - NULL); + &Size); if (BoundImportDescriptor != NULL && ImportModuleDirectory == NULL) { @@ -2142,7 +2146,7 @@ LdrpUnloadModule(PLDR_DATA_TABLE_ENTRY Module, PLDR_DATA_TABLE_ENTRY ImportedModule; NTSTATUS Status; LONG LoadCount; - + ULONG Size; if (Unload) { @@ -2163,7 +2167,7 @@ LdrpUnloadModule(PLDR_DATA_TABLE_ENTRY Module, RtlImageDirectoryEntryToData(Module->DllBase, TRUE, IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT, - NULL); + &Size); if (BoundImportDescriptor) { /* dereferencing all imported modules, use the bound import descriptor */ @@ -2197,7 +2201,7 @@ LdrpUnloadModule(PLDR_DATA_TABLE_ENTRY Module, RtlImageDirectoryEntryToData(Module->DllBase, TRUE, IMAGE_DIRECTORY_ENTRY_IMPORT, - NULL); + &Size); if (ImportModuleDirectory) { /* dereferencing all imported modules, use the import descriptor */ diff --git a/reactos/lib/rtl/image.c b/reactos/lib/rtl/image.c index 8c76db098bc..3c7ea4a6426 100644 --- a/reactos/lib/rtl/image.c +++ b/reactos/lib/rtl/image.c @@ -49,7 +49,7 @@ PVOID STDCALL RtlImageDirectoryEntryToData ( PVOID BaseAddress, - BOOLEAN bFlag, + BOOLEAN bMappedAsImage, ULONG Directory, PULONG Size ) @@ -59,7 +59,11 @@ RtlImageDirectoryEntryToData ( /* Magic flag for non-mapped images. */ if ((ULONG_PTR)BaseAddress & 1) - BaseAddress = (PVOID)((ULONG_PTR)BaseAddress & ~1); + { + BaseAddress = (PVOID)((ULONG_PTR)BaseAddress & ~1); + bMappedAsImage = FALSE; + } + NtHeader = RtlImageNtHeader (BaseAddress); if (NtHeader == NULL) @@ -72,10 +76,9 @@ RtlImageDirectoryEntryToData ( if (Va == 0) return NULL; - if (Size) - *Size = NtHeader->OptionalHeader.DataDirectory[Directory].Size; + *Size = NtHeader->OptionalHeader.DataDirectory[Directory].Size; - if (bFlag) + if (bMappedAsImage || Va < NtHeader->OptionalHeader.SizeOfHeaders) return (PVOID)((ULONG_PTR)BaseAddress + Va); /* image mapped as ordinary file, we must find raw pointer */ diff --git a/reactos/ntoskrnl/ldr/loader.c b/reactos/ntoskrnl/ldr/loader.c index 79977473b32..5c329dedf6a 100644 --- a/reactos/ntoskrnl/ldr/loader.c +++ b/reactos/ntoskrnl/ldr/loader.c @@ -161,8 +161,8 @@ LdrpLoadImage ( if (ModuleBase) *ModuleBase = ModuleObject->DllBase; - //if (SectionPointer) - // *SectionPointer = ModuleObject-> + if (SectionPointer) + *SectionPointer = ModuleObject; if (EntryPoint) *EntryPoint = ModuleObject->EntryPoint; @@ -204,7 +204,7 @@ LdrpLoadAndCallImage ( PUNICODE_STRING ModuleName ) DriverEntry = (PDRIVER_INITIALIZE)ModuleObject->EntryPoint; RtlZeroMemory(&DriverObject, sizeof(DriverObject)); - DriverObject.DriverStart = ModuleObject->DllBase; +// DriverObject.DriverStart = ModuleObject->DllBase; Status = DriverEntry(&DriverObject, NULL); if (!NT_SUCCESS(Status)) @@ -768,6 +768,7 @@ LdrPEProcessModule( } RtlCopyUnicodeString(&CreatedModuleObject->FullDllName, FileName); + CreatedModuleObject->FullDllName.Buffer[FileName->Length / sizeof(WCHAR)] = 0; LdrpBuildModuleBaseName(&CreatedModuleObject->BaseDllName, &CreatedModuleObject->FullDllName); @@ -1482,13 +1483,14 @@ LdrPEFixupImports ( PLDR_DATA_TABLE_ENTRY Module ) PCHAR ImportedName; PLDR_DATA_TABLE_ENTRY ImportedModule; NTSTATUS Status; + ULONG Size; /* Process each import module */ ImportModuleDirectory = (PIMAGE_IMPORT_DESCRIPTOR) RtlImageDirectoryEntryToData(Module->DllBase, TRUE, IMAGE_DIRECTORY_ENTRY_IMPORT, - NULL); + &Size); DPRINT("Processeing import directory at %p\n", ImportModuleDirectory); while (ImportModuleDirectory->Name) {