diff --git a/reactos/dll/ntdll/ldr/utils.c b/reactos/dll/ntdll/ldr/utils.c index 2ef1dde1f3b..9eb4fce1e25 100644 --- a/reactos/dll/ntdll/ldr/utils.c +++ b/reactos/dll/ntdll/ldr/utils.c @@ -731,38 +731,30 @@ NTSTATUS NTAPI LdrLoadDll (IN PWSTR SearchPath OPTIONAL, IN PULONG LoadFlags OPTIONAL, IN PUNICODE_STRING Name, - OUT PVOID *BaseAddress OPTIONAL) + OUT PVOID *BaseAddress /* also known as HMODULE*, and PHANDLE 'DllHandle' */) { NTSTATUS Status; - PLDR_DATA_TABLE_ENTRY Module; + PLDR_DATA_TABLE_ENTRY Module; + + PPEB Peb = NtCurrentPeb(); TRACE_LDR("LdrLoadDll, loading %wZ%s%S\n", Name, SearchPath ? L" from " : L"", SearchPath ? SearchPath : L""); - if (Name == NULL) + Status = LdrpLoadModule(SearchPath, LoadFlags ? *LoadFlags : 0, Name, &Module, BaseAddress); + + if (NT_SUCCESS(Status) && + (!LoadFlags || 0 == (*LoadFlags & LOAD_LIBRARY_AS_DATAFILE))) { - if (BaseAddress) - *BaseAddress = NtCurrentPeb()->ImageBaseAddress; - return STATUS_SUCCESS; + RtlEnterCriticalSection(Peb->LoaderLock); + Status = LdrpAttachProcess(); + RtlLeaveCriticalSection(Peb->LoaderLock); } - if (BaseAddress) - *BaseAddress = NULL; + *BaseAddress = NT_SUCCESS(Status) ? Module->DllBase : NULL; - Status = LdrpLoadModule(SearchPath, LoadFlags ? *LoadFlags : 0, Name, &Module, BaseAddress); - if (NT_SUCCESS(Status) - && (!LoadFlags || 0 == (*LoadFlags & LOAD_LIBRARY_AS_DATAFILE))) - { - RtlEnterCriticalSection(NtCurrentPeb()->LoaderLock); - Status = LdrpAttachProcess(); - RtlLeaveCriticalSection(NtCurrentPeb()->LoaderLock); - if (NT_SUCCESS(Status) && BaseAddress) - { - *BaseAddress = Module->DllBase; - } - } return Status; } @@ -1324,7 +1316,7 @@ LdrPerformRelocations(PIMAGE_NT_HEADERS NTHeaders, } static NTSTATUS -LdrpGetOrLoadModule(PWCHAR SerachPath, +LdrpGetOrLoadModule(PWCHAR SearchPath, PCHAR Name, PLDR_DATA_TABLE_ENTRY* Module, BOOLEAN Load) @@ -1345,7 +1337,7 @@ LdrpGetOrLoadModule(PWCHAR SerachPath, Status = LdrFindEntryForName (&DllName, Module, Load); if (Load && !NT_SUCCESS(Status)) { - Status = LdrpLoadModule(SerachPath, + Status = LdrpLoadModule(SearchPath, NtCurrentPeb()->Ldr->Initialized ? 0 : LDRP_PROCESS_CREATION_TIME, &DllName, Module, diff --git a/reactos/dll/win32/kernel32/misc/ldr.c b/reactos/dll/win32/kernel32/misc/ldr.c index c0a773d5373..985bc1c10b3 100644 --- a/reactos/dll/win32/kernel32/misc/ldr.c +++ b/reactos/dll/win32/kernel32/misc/ldr.c @@ -34,10 +34,10 @@ extern BOOLEAN InWindows; LPWSTR STDCALL GetDllLoadPath(LPCWSTR lpModule) { - ULONG Pos = 0, Length = 0; - PWCHAR EnvironmentBufferW = NULL; - LPCWSTR lpModuleEnd = NULL; - UNICODE_STRING ModuleName; + ULONG Pos = 0, Length = 0; + PWCHAR EnvironmentBufferW = NULL; + LPCWSTR lpModuleEnd = NULL; + UNICODE_STRING ModuleName; if (lpModule != NULL) { @@ -45,16 +45,18 @@ GetDllLoadPath(LPCWSTR lpModule) } else { - ModuleName = NtCurrentTeb()->ProcessEnvironmentBlock->ProcessParameters->ImagePathName; - lpModule = ModuleName.Buffer; - lpModuleEnd = lpModule + (ModuleName.Length / sizeof(WCHAR)); + ModuleName = NtCurrentPeb()->ProcessParameters->ImagePathName; + lpModule = ModuleName.Buffer; + lpModuleEnd = lpModule + (ModuleName.Length / sizeof(WCHAR)); } if (lpModule != NULL) { - while (lpModuleEnd > lpModule && *lpModuleEnd != L'/' && - *lpModuleEnd != L'\\' && *lpModuleEnd != L':') + while (lpModuleEnd > lpModule && *lpModuleEnd != L'/' && + *lpModuleEnd != L'\\' && *lpModuleEnd != L':') + { --lpModuleEnd; + } Length = (lpModuleEnd - lpModule) + 1; } @@ -64,9 +66,11 @@ GetDllLoadPath(LPCWSTR lpModule) Length += GetEnvironmentVariableW(L"PATH", NULL, 0); EnvironmentBufferW = RtlAllocateHeap(RtlGetProcessHeap(), 0, - Length * sizeof(WCHAR)); + Length * sizeof(WCHAR)); if (EnvironmentBufferW == NULL) + { return NULL; + } if (lpModule) { @@ -75,6 +79,7 @@ GetDllLoadPath(LPCWSTR lpModule) Pos += lpModuleEnd - lpModule; EnvironmentBufferW[Pos++] = L';'; } + Pos += GetCurrentDirectoryW(Length, EnvironmentBufferW + Pos); EnvironmentBufferW[Pos++] = L';'; Pos += GetSystemDirectoryW(EnvironmentBufferW + Pos, Length - Pos); @@ -412,40 +417,28 @@ HMODULE STDCALL GetModuleHandleA ( LPCSTR lpModuleName ) { - UNICODE_STRING UnicodeName; ANSI_STRING ModuleName; - PVOID BaseAddress; NTSTATUS Status; + PTEB pTeb = NtCurrentTeb(); if (lpModuleName == NULL) - return ((HMODULE)NtCurrentPeb()->ImageBaseAddress); - RtlInitAnsiString (&ModuleName, - (LPSTR)lpModuleName); - - /* convert ansi (or oem) string to unicode */ - if (bIsFileApiAnsi) - RtlAnsiStringToUnicodeString (&UnicodeName, - &ModuleName, - TRUE); - else - RtlOemStringToUnicodeString (&UnicodeName, - &ModuleName, - TRUE); - - Status = LdrGetDllHandle (0, - 0, - &UnicodeName, - &BaseAddress); - - RtlFreeUnicodeString (&UnicodeName); - - if (!NT_SUCCESS(Status)) { - SetLastErrorByStatus (Status); - return NULL; + return ((HMODULE)pTeb->ProcessEnvironmentBlock->ImageBaseAddress); } - return ((HMODULE)BaseAddress); + RtlInitAnsiString(&ModuleName, lpModuleName); + + Status = RtlAnsiStringToUnicodeString(&pTeb->StaticUnicodeString, + &ModuleName, + FALSE); + + if (NT_SUCCESS(Status)) + { + return GetModuleHandleW(pTeb->StaticUnicodeString.Buffer); + } + + SetLastErrorByStatus(Status); + return FALSE; } @@ -556,30 +549,24 @@ GetModuleHandleExA(IN DWORD dwFlags, IN LPCSTR lpModuleName OPTIONAL, OUT HMODULE* phModule) { - UNICODE_STRING UnicodeName; ANSI_STRING ModuleName; LPCWSTR lpModuleNameW; NTSTATUS Status; BOOL Ret; + PTEB pTeb = NtCurrentTeb(); + if (dwFlags & GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS) { lpModuleNameW = (LPCWSTR)lpModuleName; } else { - RtlInitAnsiString(&ModuleName, - (LPSTR)lpModuleName); + RtlInitAnsiString(&ModuleName, lpModuleName); - /* convert ansi (or oem) string to unicode */ - if (bIsFileApiAnsi) - Status = RtlAnsiStringToUnicodeString(&UnicodeName, - &ModuleName, - TRUE); - else - Status = RtlOemStringToUnicodeString(&UnicodeName, - &ModuleName, - TRUE); + Status = RtlAnsiStringToUnicodeString(&pTeb->StaticUnicodeString, + &ModuleName, + FALSE); if (!NT_SUCCESS(Status)) { @@ -587,18 +574,13 @@ GetModuleHandleExA(IN DWORD dwFlags, return FALSE; } - lpModuleNameW = UnicodeName.Buffer; + lpModuleNameW = pTeb->StaticUnicodeString.Buffer; } Ret = GetModuleHandleExW(dwFlags, lpModuleNameW, phModule); - if (!(dwFlags & GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS)) - { - RtlFreeUnicodeString(&UnicodeName); - } - return Ret; }