[PATCH] kernel32: CreateFile() -> ERROR_PATH_NOT_FOUND when a dir in the path doesn't exist

Dmitry Timoshkov dmitry at baikal.ru
Wed Apr 22 01:18:59 CDT 2020


Damjan Jovanovic <damjan.jov at gmail.com> wrote:

> +    wsprintfW(temp_filename, dir_fileW, filename, prefix);

While wsprintf() works of course, it's easier to use lstrcpyW()+lstrcatW().

> +    hFile = CreateFileW(temp_filename, GENERIC_READ, FILE_SHARE_READ, NULL,
> +                        OPEN_ALWAYS, FILE_FLAG_RANDOM_ACCESS, 0);
> +    ok(hFile == INVALID_HANDLE_VALUE && (GetLastError() == ERROR_PATH_NOT_FOUND),
> +       "hFile %p, last error %u\n", hFile, GetLastError());

A usual practice is to set last error to 0xdeadbeef before testing for
exact API error cases.

> diff --git a/dlls/kernelbase/file.c b/dlls/kernelbase/file.c
> index 9ca184a5d0..1492778119 100644
> --- a/dlls/kernelbase/file.c
> +++ b/dlls/kernelbase/file.c
> @@ -602,6 +602,8 @@ HANDLE WINAPI DECLSPEC_HOTPATCH CreateFileW( LPCWSTR filename, DWORD access, DWO
>           */
>          if (status == STATUS_OBJECT_NAME_COLLISION)
>              SetLastError( ERROR_FILE_EXISTS );
> +        else if (status == STATUS_NOT_A_DIRECTORY)
> +            SetLastError( ERROR_PATH_NOT_FOUND );

Probably NtCreateFile() should be fixed instead.

-- 
Dmitry.



More information about the wine-devel mailing list