- Two small Ldr cleanup patches (ntdll and kernel32) by: Mike Nordell

svn path=/trunk/; revision=29486
This commit is contained in:
Peter Ward 2007-10-10 23:14:20 +00:00
parent fd1c983af4
commit 3ae0570df2
2 changed files with 51 additions and 77 deletions

View file

@ -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,

View file

@ -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;
}