- 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, 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)
{
if (BaseAddress)
*BaseAddress = NtCurrentPeb()->ImageBaseAddress;
return STATUS_SUCCESS;
}
if (BaseAddress)
*BaseAddress = NULL;
Status = LdrpLoadModule(SearchPath, LoadFlags ? *LoadFlags : 0, Name, &Module, BaseAddress); Status = LdrpLoadModule(SearchPath, LoadFlags ? *LoadFlags : 0, Name, &Module, BaseAddress);
if (NT_SUCCESS(Status)
&& (!LoadFlags || 0 == (*LoadFlags & LOAD_LIBRARY_AS_DATAFILE))) if (NT_SUCCESS(Status) &&
(!LoadFlags || 0 == (*LoadFlags & LOAD_LIBRARY_AS_DATAFILE)))
{ {
RtlEnterCriticalSection(NtCurrentPeb()->LoaderLock); RtlEnterCriticalSection(Peb->LoaderLock);
Status = LdrpAttachProcess(); Status = LdrpAttachProcess();
RtlLeaveCriticalSection(NtCurrentPeb()->LoaderLock); RtlLeaveCriticalSection(Peb->LoaderLock);
if (NT_SUCCESS(Status) && BaseAddress)
{
*BaseAddress = Module->DllBase;
}
} }
*BaseAddress = NT_SUCCESS(Status) ? Module->DllBase : NULL;
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,

View file

@ -45,7 +45,7 @@ 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));
} }
@ -54,7 +54,9 @@ GetDllLoadPath(LPCWSTR lpModule)
{ {
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;
} }
@ -66,7 +68,9 @@ GetDllLoadPath(LPCWSTR lpModule)
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)
Status = RtlAnsiStringToUnicodeString(&UnicodeName,
&ModuleName, &ModuleName,
TRUE); FALSE);
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;
} }