mirror of
https://github.com/reactos/reactos.git
synced 2025-02-24 17:34:57 +00:00
- Two small Ldr cleanup patches (ntdll and kernel32) by: Mike Nordell
svn path=/trunk/; revision=29486
This commit is contained in:
parent
fd1c983af4
commit
3ae0570df2
2 changed files with 51 additions and 77 deletions
|
@ -731,38 +731,30 @@ NTSTATUS NTAPI
|
||||||
LdrLoadDll (IN PWSTR SearchPath OPTIONAL,
|
LdrLoadDll (IN PWSTR SearchPath OPTIONAL,
|
||||||
IN PULONG LoadFlags OPTIONAL,
|
IN PULONG LoadFlags OPTIONAL,
|
||||||
IN PUNICODE_STRING Name,
|
IN PUNICODE_STRING Name,
|
||||||
OUT PVOID *BaseAddress OPTIONAL)
|
OUT PVOID *BaseAddress /* also known as HMODULE*, and PHANDLE 'DllHandle' */)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PLDR_DATA_TABLE_ENTRY Module;
|
PLDR_DATA_TABLE_ENTRY Module;
|
||||||
|
|
||||||
|
PPEB Peb = NtCurrentPeb();
|
||||||
|
|
||||||
TRACE_LDR("LdrLoadDll, loading %wZ%s%S\n",
|
TRACE_LDR("LdrLoadDll, loading %wZ%s%S\n",
|
||||||
Name,
|
Name,
|
||||||
SearchPath ? L" from " : L"",
|
SearchPath ? L" from " : L"",
|
||||||
SearchPath ? SearchPath : 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)
|
RtlEnterCriticalSection(Peb->LoaderLock);
|
||||||
*BaseAddress = NtCurrentPeb()->ImageBaseAddress;
|
Status = LdrpAttachProcess();
|
||||||
return STATUS_SUCCESS;
|
RtlLeaveCriticalSection(Peb->LoaderLock);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (BaseAddress)
|
*BaseAddress = NT_SUCCESS(Status) ? Module->DllBase : NULL;
|
||||||
*BaseAddress = 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;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1324,7 +1316,7 @@ LdrPerformRelocations(PIMAGE_NT_HEADERS NTHeaders,
|
||||||
}
|
}
|
||||||
|
|
||||||
static NTSTATUS
|
static NTSTATUS
|
||||||
LdrpGetOrLoadModule(PWCHAR SerachPath,
|
LdrpGetOrLoadModule(PWCHAR SearchPath,
|
||||||
PCHAR Name,
|
PCHAR Name,
|
||||||
PLDR_DATA_TABLE_ENTRY* Module,
|
PLDR_DATA_TABLE_ENTRY* Module,
|
||||||
BOOLEAN Load)
|
BOOLEAN Load)
|
||||||
|
@ -1345,7 +1337,7 @@ LdrpGetOrLoadModule(PWCHAR SerachPath,
|
||||||
Status = LdrFindEntryForName (&DllName, Module, Load);
|
Status = LdrFindEntryForName (&DllName, Module, Load);
|
||||||
if (Load && !NT_SUCCESS(Status))
|
if (Load && !NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
Status = LdrpLoadModule(SerachPath,
|
Status = LdrpLoadModule(SearchPath,
|
||||||
NtCurrentPeb()->Ldr->Initialized ? 0 : LDRP_PROCESS_CREATION_TIME,
|
NtCurrentPeb()->Ldr->Initialized ? 0 : LDRP_PROCESS_CREATION_TIME,
|
||||||
&DllName,
|
&DllName,
|
||||||
Module,
|
Module,
|
||||||
|
|
|
@ -34,10 +34,10 @@ extern BOOLEAN InWindows;
|
||||||
LPWSTR STDCALL
|
LPWSTR STDCALL
|
||||||
GetDllLoadPath(LPCWSTR lpModule)
|
GetDllLoadPath(LPCWSTR lpModule)
|
||||||
{
|
{
|
||||||
ULONG Pos = 0, Length = 0;
|
ULONG Pos = 0, Length = 0;
|
||||||
PWCHAR EnvironmentBufferW = NULL;
|
PWCHAR EnvironmentBufferW = NULL;
|
||||||
LPCWSTR lpModuleEnd = NULL;
|
LPCWSTR lpModuleEnd = NULL;
|
||||||
UNICODE_STRING ModuleName;
|
UNICODE_STRING ModuleName;
|
||||||
|
|
||||||
if (lpModule != NULL)
|
if (lpModule != NULL)
|
||||||
{
|
{
|
||||||
|
@ -45,16 +45,18 @@ GetDllLoadPath(LPCWSTR lpModule)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ModuleName = NtCurrentTeb()->ProcessEnvironmentBlock->ProcessParameters->ImagePathName;
|
ModuleName = NtCurrentPeb()->ProcessParameters->ImagePathName;
|
||||||
lpModule = ModuleName.Buffer;
|
lpModule = ModuleName.Buffer;
|
||||||
lpModuleEnd = lpModule + (ModuleName.Length / sizeof(WCHAR));
|
lpModuleEnd = lpModule + (ModuleName.Length / sizeof(WCHAR));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lpModule != NULL)
|
if (lpModule != NULL)
|
||||||
{
|
{
|
||||||
while (lpModuleEnd > lpModule && *lpModuleEnd != L'/' &&
|
while (lpModuleEnd > lpModule && *lpModuleEnd != L'/' &&
|
||||||
*lpModuleEnd != L'\\' && *lpModuleEnd != L':')
|
*lpModuleEnd != L'\\' && *lpModuleEnd != L':')
|
||||||
|
{
|
||||||
--lpModuleEnd;
|
--lpModuleEnd;
|
||||||
|
}
|
||||||
Length = (lpModuleEnd - lpModule) + 1;
|
Length = (lpModuleEnd - lpModule) + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -64,9 +66,11 @@ GetDllLoadPath(LPCWSTR lpModule)
|
||||||
Length += GetEnvironmentVariableW(L"PATH", NULL, 0);
|
Length += GetEnvironmentVariableW(L"PATH", NULL, 0);
|
||||||
|
|
||||||
EnvironmentBufferW = RtlAllocateHeap(RtlGetProcessHeap(), 0,
|
EnvironmentBufferW = RtlAllocateHeap(RtlGetProcessHeap(), 0,
|
||||||
Length * sizeof(WCHAR));
|
Length * sizeof(WCHAR));
|
||||||
if (EnvironmentBufferW == NULL)
|
if (EnvironmentBufferW == NULL)
|
||||||
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (lpModule)
|
if (lpModule)
|
||||||
{
|
{
|
||||||
|
@ -75,6 +79,7 @@ GetDllLoadPath(LPCWSTR lpModule)
|
||||||
Pos += lpModuleEnd - lpModule;
|
Pos += lpModuleEnd - lpModule;
|
||||||
EnvironmentBufferW[Pos++] = L';';
|
EnvironmentBufferW[Pos++] = L';';
|
||||||
}
|
}
|
||||||
|
|
||||||
Pos += GetCurrentDirectoryW(Length, EnvironmentBufferW + Pos);
|
Pos += GetCurrentDirectoryW(Length, EnvironmentBufferW + Pos);
|
||||||
EnvironmentBufferW[Pos++] = L';';
|
EnvironmentBufferW[Pos++] = L';';
|
||||||
Pos += GetSystemDirectoryW(EnvironmentBufferW + Pos, Length - Pos);
|
Pos += GetSystemDirectoryW(EnvironmentBufferW + Pos, Length - Pos);
|
||||||
|
@ -412,40 +417,28 @@ HMODULE
|
||||||
STDCALL
|
STDCALL
|
||||||
GetModuleHandleA ( LPCSTR lpModuleName )
|
GetModuleHandleA ( LPCSTR lpModuleName )
|
||||||
{
|
{
|
||||||
UNICODE_STRING UnicodeName;
|
|
||||||
ANSI_STRING ModuleName;
|
ANSI_STRING ModuleName;
|
||||||
PVOID BaseAddress;
|
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
PTEB pTeb = NtCurrentTeb();
|
||||||
|
|
||||||
if (lpModuleName == NULL)
|
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 ((HMODULE)pTeb->ProcessEnvironmentBlock->ImageBaseAddress);
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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,
|
IN LPCSTR lpModuleName OPTIONAL,
|
||||||
OUT HMODULE* phModule)
|
OUT HMODULE* phModule)
|
||||||
{
|
{
|
||||||
UNICODE_STRING UnicodeName;
|
|
||||||
ANSI_STRING ModuleName;
|
ANSI_STRING ModuleName;
|
||||||
LPCWSTR lpModuleNameW;
|
LPCWSTR lpModuleNameW;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
BOOL Ret;
|
BOOL Ret;
|
||||||
|
|
||||||
|
PTEB pTeb = NtCurrentTeb();
|
||||||
|
|
||||||
if (dwFlags & GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS)
|
if (dwFlags & GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS)
|
||||||
{
|
{
|
||||||
lpModuleNameW = (LPCWSTR)lpModuleName;
|
lpModuleNameW = (LPCWSTR)lpModuleName;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
RtlInitAnsiString(&ModuleName,
|
RtlInitAnsiString(&ModuleName, lpModuleName);
|
||||||
(LPSTR)lpModuleName);
|
|
||||||
|
|
||||||
/* convert ansi (or oem) string to unicode */
|
Status = RtlAnsiStringToUnicodeString(&pTeb->StaticUnicodeString,
|
||||||
if (bIsFileApiAnsi)
|
&ModuleName,
|
||||||
Status = RtlAnsiStringToUnicodeString(&UnicodeName,
|
FALSE);
|
||||||
&ModuleName,
|
|
||||||
TRUE);
|
|
||||||
else
|
|
||||||
Status = RtlOemStringToUnicodeString(&UnicodeName,
|
|
||||||
&ModuleName,
|
|
||||||
TRUE);
|
|
||||||
|
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
|
@ -587,18 +574,13 @@ GetModuleHandleExA(IN DWORD dwFlags,
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
lpModuleNameW = UnicodeName.Buffer;
|
lpModuleNameW = pTeb->StaticUnicodeString.Buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
Ret = GetModuleHandleExW(dwFlags,
|
Ret = GetModuleHandleExW(dwFlags,
|
||||||
lpModuleNameW,
|
lpModuleNameW,
|
||||||
phModule);
|
phModule);
|
||||||
|
|
||||||
if (!(dwFlags & GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS))
|
|
||||||
{
|
|
||||||
RtlFreeUnicodeString(&UnicodeName);
|
|
||||||
}
|
|
||||||
|
|
||||||
return Ret;
|
return Ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue