From 0bbbf016b1eb1c90a98c58afc2760319050a04d3 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Wed, 31 Mar 2021 21:12:55 +0200 Subject: [PATCH] ntdll: Return system dir path for PE mapping bootstrap placeholders. Signed-off-by: Alexandre Julliard --- dlls/ntdll/loader.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c index 964a3e0eaa4..5edccd6a29e 100644 --- a/dlls/ntdll/loader.c +++ b/dlls/ntdll/loader.c @@ -2577,10 +2577,10 @@ static NTSTATUS find_builtin_without_file( const WCHAR *name, UNICODE_STRING *ne RtlAppendUnicodeToString( new_name, L"\\" ); RtlAppendUnicodeToString( new_name, name ); status = open_dll_file( new_name, pwm, mapping, image_info, id ); - if (status != STATUS_DLL_NOT_FOUND) return status; + if (status != STATUS_DLL_NOT_FOUND) goto done; RtlAppendUnicodeToString( new_name, L".fake" ); status = open_dll_file( new_name, pwm, mapping, image_info, id ); - if (status != STATUS_DLL_NOT_FOUND) return status; + if (status != STATUS_DLL_NOT_FOUND) goto done; RtlFreeUnicodeString( new_name ); } for (i = 0; ; i++) @@ -2592,16 +2592,27 @@ static NTSTATUS find_builtin_without_file( const WCHAR *name, UNICODE_STRING *ne RtlAppendUnicodeToString( new_name, name ); status = open_dll_file( new_name, pwm, mapping, image_info, id ); if (status == STATUS_IMAGE_MACHINE_TYPE_MISMATCH) found_image = TRUE; - else if (status != STATUS_DLL_NOT_FOUND) return status; + else if (status != STATUS_DLL_NOT_FOUND) goto done; new_name->Length = len; RtlAppendUnicodeToString( new_name, L"\\fakedlls\\" ); RtlAppendUnicodeToString( new_name, name ); status = open_dll_file( new_name, pwm, mapping, image_info, id ); if (status == STATUS_IMAGE_MACHINE_TYPE_MISMATCH) found_image = TRUE; - else if (status != STATUS_DLL_NOT_FOUND) return status; + else if (status != STATUS_DLL_NOT_FOUND) goto done; RtlFreeUnicodeString( new_name ); } if (found_image) status = STATUS_IMAGE_MACHINE_TYPE_MISMATCH; + +done: + RtlFreeUnicodeString( new_name ); + if (!status) + { + new_name->Length = (4 + wcslen(system_dir) + wcslen(name)) * sizeof(WCHAR); + new_name->Buffer = RtlAllocateHeap( GetProcessHeap(), 0, new_name->Length + sizeof(WCHAR) ); + wcscpy( new_name->Buffer, L"\\??\\" ); + wcscat( new_name->Buffer, system_dir ); + wcscat( new_name->Buffer, name ); + } return status; }