ntdll: Use the loadFrom directory to load dlls from the activation context.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50978
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Alexandre Julliard 2021-04-19 15:15:26 +02:00
parent 8f3383f741
commit 55d98c572c
1 changed files with 52 additions and 1 deletions

View File

@ -2431,6 +2431,44 @@ failed:
} }
/***********************************************************************
* build_dlldata_path
*
* Helper for find_actctx_dll.
*/
static NTSTATUS build_dlldata_path( LPCWSTR libname, ACTCTX_SECTION_KEYED_DATA *data, LPWSTR *fullname )
{
struct dllredirect_data *dlldata = data->lpData;
char *base = data->lpSectionBase;
SIZE_T total = dlldata->total_len + (wcslen(libname) + 1) * sizeof(WCHAR);
WCHAR *p, *buffer;
NTSTATUS status = STATUS_SUCCESS;
ULONG i;
if (!(p = buffer = RtlAllocateHeap( GetProcessHeap(), 0, total ))) return STATUS_NO_MEMORY;
for (i = 0; i < dlldata->paths_count; i++)
{
memcpy( p, base + dlldata->paths[i].offset, dlldata->paths[i].len );
p += dlldata->paths[i].len / sizeof(WCHAR);
}
wcscpy( p, libname );
if (dlldata->flags & DLL_REDIRECT_PATH_EXPAND)
{
RtlExpandEnvironmentStrings( NULL, buffer, wcslen(buffer), NULL, 0, &total );
if ((*fullname = RtlAllocateHeap( GetProcessHeap(), 0, total * sizeof(WCHAR) )))
RtlExpandEnvironmentStrings( NULL, buffer, wcslen(buffer), *fullname, total, NULL );
else
status = STATUS_NO_MEMORY;
RtlFreeHeap( GetProcessHeap(), 0, buffer );
}
else *fullname = buffer;
return status;
}
/*********************************************************************** /***********************************************************************
* find_actctx_dll * find_actctx_dll
* *
@ -2440,8 +2478,9 @@ static NTSTATUS find_actctx_dll( LPCWSTR libname, LPWSTR *fullname )
{ {
static const WCHAR winsxsW[] = {'\\','w','i','n','s','x','s','\\'}; static const WCHAR winsxsW[] = {'\\','w','i','n','s','x','s','\\'};
ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION *info; ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION *info = NULL;
ACTCTX_SECTION_KEYED_DATA data; ACTCTX_SECTION_KEYED_DATA data;
struct dllredirect_data *dlldata;
UNICODE_STRING nameW; UNICODE_STRING nameW;
NTSTATUS status; NTSTATUS status;
SIZE_T needed, size = 1024; SIZE_T needed, size = 1024;
@ -2454,6 +2493,18 @@ static NTSTATUS find_actctx_dll( LPCWSTR libname, LPWSTR *fullname )
&nameW, &data ); &nameW, &data );
if (status != STATUS_SUCCESS) return status; if (status != STATUS_SUCCESS) return status;
if (data.ulLength < offsetof( struct dllredirect_data, paths[0] ))
{
status = STATUS_SXS_KEY_NOT_FOUND;
goto done;
}
dlldata = data.lpData;
if (!(dlldata->flags & DLL_REDIRECT_PATH_OMITS_ASSEMBLY_ROOT))
{
status = build_dlldata_path( libname, &data, fullname );
goto done;
}
for (;;) for (;;)
{ {
if (!(info = RtlAllocateHeap( GetProcessHeap(), 0, size ))) if (!(info = RtlAllocateHeap( GetProcessHeap(), 0, size )))