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

Damjan Jovanovic damjan.jov at gmail.com
Wed Apr 22 00:18:17 CDT 2020


Python's test_tempfile.py unit test fails because it
(ultimately) expects CreateFile() to fail with ERROR_PATH_NOT_FOUND
when the path contains a directory which doesn't exist,
and we fail with ERROR_DIRECTORY instead.

Signed-off-by: Damjan Jovanovic <damjan.jov at gmail.com>
---
 dlls/kernel32/tests/file.c | 9 +++++++++
 dlls/kernelbase/file.c     | 2 ++
 2 files changed, 11 insertions(+)
-------------- next part --------------
diff --git a/dlls/kernel32/tests/file.c b/dlls/kernel32/tests/file.c
index 29620654bd..172bb1f637 100644
--- a/dlls/kernel32/tests/file.c
+++ b/dlls/kernel32/tests/file.c
@@ -33,6 +33,7 @@
 #include "winerror.h"
 #include "winternl.h"
 #include "winnls.h"
+#include "winuser.h"
 #include "fileapi.h"
 
 #undef DeleteFile  /* needed for FILE_DISPOSITION_INFO */
@@ -1589,9 +1590,11 @@ static void test_CreateFileW(void)
     HANDLE hFile;
     WCHAR temp_path[MAX_PATH];
     WCHAR filename[MAX_PATH];
+    WCHAR temp_filename[MAX_PATH];
     static const WCHAR emptyW[]={'\0'};
     static const WCHAR prefix[] = {'p','f','x',0};
     static const WCHAR bogus[] = { '\\', '\\', '.', '\\', 'B', 'O', 'G', 'U', 'S', 0 };
+    static const WCHAR dir_fileW[] = {'%','s','\\','%','s',0};
     DWORD ret;
 
     ret = GetTempPathW(MAX_PATH, temp_path);
@@ -1639,6 +1642,12 @@ static void test_CreateFileW(void)
 
     CloseHandle(hFile);
 
+    wsprintfW(temp_filename, dir_fileW, filename, prefix);
+    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());
+
     ret = DeleteFileW(filename);
     ok(ret, "DeleteFileW: error %d\n", GetLastError());
 
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 );
         else
             SetLastError( RtlNtStatusToDosError(status) );
     }


More information about the wine-devel mailing list