Alexandre Julliard : ntdll: Return system dir path for PE mapping bootstrap placeholders.
Alexandre Julliard
julliard at winehq.org
Wed Mar 31 15:55:13 CDT 2021
Module: wine
Branch: master
Commit: 0bbbf016b1eb1c90a98c58afc2760319050a04d3
URL: https://source.winehq.org/git/wine.git/?a=commit;h=0bbbf016b1eb1c90a98c58afc2760319050a04d3
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed Mar 31 21:12:55 2021 +0200
ntdll: Return system dir path for PE mapping bootstrap placeholders.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
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;
}
More information about the wine-cvs
mailing list