[PATCH v5] kernel32: Correct ReplaceFileW behaviour

Dmitry Timoshkov dmitry at baikal.ru
Fri Sep 7 21:45:16 CDT 2018


Brock York <twunknown at gmail.com> wrote:

>      attr.ObjectName = &nt_replaced_name;
> -    status = NtOpenFile(&hReplaced, GENERIC_READ|GENERIC_WRITE|DELETE|SYNCHRONIZE,
> +    status = NtOpenFile(&hReplaced, GENERIC_READ|DELETE|SYNCHRONIZE,
>                          &attr, &io,
>                          FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
>                          FILE_SYNCHRONOUS_IO_NONALERT|FILE_NON_DIRECTORY_FILE);
> @@ -1788,6 +1789,19 @@ BOOL WINAPI ReplaceFileW(LPCWSTR lpReplacedFileName, LPCWSTR lpReplacementFileNa
>          goto fail;
>      }
>  
> +    /* Replacement should fail if replaced is READ_ONLY */
> +    if (!GetFileInformationByHandle(hReplaced, &file_info))
> +    {
> +	    error = GetLastError();
> +	    goto fail;
> +    }
> +
> +    if (file_info.dwFileAttributes & FILE_ATTRIBUTE_READONLY)
> +    {
> +        error = ERROR_ACCESS_DENIED;
> +        goto fail;
> +    }

There is an existing test for NtCreateFile that it's supposed to fail if
the file has read-only attribute. Probably NtOpenFile with WRITE|DELETE
access supposed to behave in a similar way. Adding such workarounds to
high level API like ReplaceFile only clutters the code with not appropriate
hacks.

-- 
Dmitry.



More information about the wine-devel mailing list