mirror of
https://github.com/reactos/reactos.git
synced 2025-02-24 01:15:09 +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,
|
||||
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,
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue