-/* $Id: utils.c,v 1.90 2004/06/20 10:36:17 gvg Exp $
+/* $Id: utils.c,v 1.91 2004/06/25 18:50:48 ekohl Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
NTSTATUS Status;
PLDR_MODULE Module;
- TRACE_LDR("LdrLoadDll, loading %wZ%s%S\n", Name, SearchPath ? " from " : "", SearchPath ? SearchPath : L"");
+ TRACE_LDR("LdrLoadDll, loading %wZ%s%S\n",
+ Name,
+ SearchPath ? " from " : "",
+ SearchPath ? SearchPath : L"");
if (Name == NULL)
{
* NOTE
*
*/
-static NTSTATUS LdrPerformRelocations (PIMAGE_NT_HEADERS NTHeaders,
- PVOID ImageBase)
+static NTSTATUS
+LdrPerformRelocations(PIMAGE_NT_HEADERS NTHeaders,
+ PVOID ImageBase)
{
- USHORT NumberOfEntries;
- PUSHORT pValue16;
- ULONG RelocationRVA;
- ULONG Delta32;
- ULONG Offset;
- PULONG pValue32;
+ USHORT NumberOfEntries;
+ PUSHORT pValue16;
+ ULONG RelocationRVA;
+ LONG Delta32;
+ ULONG Offset;
+ PULONG pValue32;
PRELOCATION_DIRECTORY RelocationDir;
- PRELOCATION_ENTRY RelocationBlock;
- int i;
+ PRELOCATION_ENTRY RelocationBlock;
+ int i;
PIMAGE_DATA_DIRECTORY RelocationDDir;
ULONG OldProtect;
PVOID ProtectBase;
NTSTATUS Status;
PIMAGE_SECTION_HEADER Sections;
ULONG MaxExtend;
+ ULONG RelocationBlockOffset;
+ ULONG RelocationSectionSize;
if (NTHeaders->FileHeader.Characteristics & IMAGE_FILE_RELOCS_STRIPPED)
{
Sections =
(PIMAGE_SECTION_HEADER)((PVOID)NTHeaders + sizeof(IMAGE_NT_HEADERS));
MaxExtend = 0;
+ RelocationSectionSize = 0;
for (i = 0; i < NTHeaders->FileHeader.NumberOfSections; i++)
{
if (!(Sections[i].Characteristics & IMAGE_SECTION_NOLOAD))
(ULONG)(Sections[i].VirtualAddress + Sections[i].Misc.VirtualSize);
MaxExtend = max(MaxExtend, Extend);
}
+
+ if (!memcmp(Sections[i].Name,".reloc", 6))
+ {
+ RelocationSectionSize = Sections[i].Misc.VirtualSize;
+ DPRINT("Relocation section size: %lx\n", RelocationSectionSize);
+ }
}
RelocationDDir =
RelocationDir =
(PRELOCATION_DIRECTORY)((PCHAR)ImageBase + RelocationRVA);
- while (RelocationDir->SizeOfBlock)
+ RelocationBlockOffset = 0;
+ while (RelocationBlockOffset < RelocationSectionSize)
{
if (RelocationDir->VirtualAddress > MaxExtend)
{
return(Status);
}
}
-
for (i = 0; i < NumberOfEntries; i++)
{
Offset = (RelocationBlock[i].TypeOffset & 0xfff);
case TYPE_RELOC_HIGHADJ:
/* FIXME: do the highadjust fixup */
DPRINT("TYPE_RELOC_HIGHADJ fixup not implemented, sorry\n");
- return(STATUS_UNSUCCESSFUL);
+ return STATUS_UNSUCCESSFUL;
default:
DPRINT("unexpected fixup type\n");
RelocationRVA += RelocationDir->SizeOfBlock;
RelocationDir =
(PRELOCATION_DIRECTORY) (ImageBase + RelocationRVA);
+ RelocationBlockOffset += RelocationDir->SizeOfBlock;
}
}
+
return STATUS_SUCCESS;
}
}
static NTSTATUS
-LdrpProcessImportDirectoryEntry(
- PLDR_MODULE Module,
- PLDR_MODULE ImportedModule,
- PIMAGE_IMPORT_MODULE_DIRECTORY ImportModuleDirectory)
+LdrpProcessImportDirectoryEntry(PLDR_MODULE Module,
+ PLDR_MODULE ImportedModule,
+ PIMAGE_IMPORT_MODULE_DIRECTORY ImportModuleDirectory)
{
NTSTATUS Status;
PVOID* ImportAddressList;
NTSTATUS STDCALL
LdrShutdownProcess (VOID)
{
- LdrpDetachProcess(TRUE);
- return STATUS_SUCCESS;
+ LdrpDetachProcess(TRUE);
+ return STATUS_SUCCESS;
}
/*
NTSTATUS
LdrpAttachThread (VOID)
{
- PLIST_ENTRY ModuleListHead;
- PLIST_ENTRY Entry;
- PLDR_MODULE Module;
- NTSTATUS Status;
-
- DPRINT("LdrpAttachThread() called for %wZ\n",
- &ExeModule->BaseDllName);
+ PLIST_ENTRY ModuleListHead;
+ PLIST_ENTRY Entry;
+ PLDR_MODULE Module;
+ NTSTATUS Status;
- RtlEnterCriticalSection (NtCurrentPeb()->LoaderLock);
+ DPRINT("LdrpAttachThread() called for %wZ\n",
+ &ExeModule->BaseDllName);
- Status = LdrpInitializeTlsForThread();
+ RtlEnterCriticalSection (NtCurrentPeb()->LoaderLock);
- if (NT_SUCCESS(Status))
- {
+ Status = LdrpInitializeTlsForThread();
- ModuleListHead = &NtCurrentPeb()->Ldr->InInitializationOrderModuleList;
- Entry = ModuleListHead->Flink;
+ if (NT_SUCCESS(Status))
+ {
+ ModuleListHead = &NtCurrentPeb()->Ldr->InInitializationOrderModuleList;
+ Entry = ModuleListHead->Flink;
- while (Entry != ModuleListHead)
- {
- Module = CONTAINING_RECORD(Entry, LDR_MODULE, InInitializationOrderModuleList);
- if (Module->Flags & PROCESS_ATTACH_CALLED &&
- !(Module->Flags & DONT_CALL_FOR_THREAD) &&
- !(Module->Flags & UNLOAD_IN_PROGRESS))
- {
- TRACE_LDR("%wZ - Calling entry point at %x for thread attaching\n",
- &Module->BaseDllName, Module->EntryPoint);
- LdrpCallDllEntry(Module, DLL_THREAD_ATTACH, NULL);
- }
- Entry = Entry->Flink;
- }
+ while (Entry != ModuleListHead)
+ {
+ Module = CONTAINING_RECORD(Entry, LDR_MODULE, InInitializationOrderModuleList);
+ if (Module->Flags & PROCESS_ATTACH_CALLED &&
+ !(Module->Flags & DONT_CALL_FOR_THREAD) &&
+ !(Module->Flags & UNLOAD_IN_PROGRESS))
+ {
+ TRACE_LDR("%wZ - Calling entry point at %x for thread attaching\n",
+ &Module->BaseDllName, Module->EntryPoint);
+ LdrpCallDllEntry(Module, DLL_THREAD_ATTACH, NULL);
+ }
+ Entry = Entry->Flink;
+ }
- Entry = NtCurrentPeb()->Ldr->InLoadOrderModuleList.Flink;
- Module = CONTAINING_RECORD(Entry, LDR_MODULE, InLoadOrderModuleList);
- LdrpTlsCallback(Module, DLL_THREAD_ATTACH);
- }
+ Entry = NtCurrentPeb()->Ldr->InLoadOrderModuleList.Flink;
+ Module = CONTAINING_RECORD(Entry, LDR_MODULE, InLoadOrderModuleList);
+ LdrpTlsCallback(Module, DLL_THREAD_ATTACH);
+ }
- RtlLeaveCriticalSection (NtCurrentPeb()->LoaderLock);
+ RtlLeaveCriticalSection (NtCurrentPeb()->LoaderLock);
- DPRINT("LdrpAttachThread() done\n");
+ DPRINT("LdrpAttachThread() done\n");
- return Status;
+ return Status;
}