[PATCH 2/3] ntdll/tests: Add tests for consecutive calls to NtCreateFile.

Daniel Lehman dlehman25 at gmail.com
Fri Oct 23 00:53:15 CDT 2020


Signed-off-by: Daniel Lehman <dlehman25 at gmail.com>
---
 dlls/ntdll/tests/file.c | 66 +++++++++++++++++++++++++++++++++++++++--
 1 file changed, 64 insertions(+), 2 deletions(-)

diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c
index 8b9ec4f624d..5e956d8a66c 100644
--- a/dlls/ntdll/tests/file.c
+++ b/dlls/ntdll/tests/file.c
@@ -4012,9 +4012,44 @@ static void test_NtCreateFile(void)
     /*17*/{ FILE_SUPERSEDE, FILE_ATTRIBUTE_READONLY, 0, FILE_SUPERSEDED, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY, TRUE },
     /*18*/{ FILE_SUPERSEDE, 0, 0, FILE_CREATED, FILE_ATTRIBUTE_ARCHIVE, TRUE }
     };
+    static const struct test_data2
+    {
+        DWORD disposition, access, share, share2, status, result;
+    } td2[] =
+    {
+    /* roughly matches dlls/kernel32/tests/file.c plus FILE_SUPERSEDE */
+    /*  0*/{ FILE_OVERWRITE_IF, GENERIC_READ, 0, FILE_SHARE_READ, STATUS_SHARING_VIOLATION },
+    /*  1*/{ FILE_OVERWRITE_IF, GENERIC_READ, FILE_SHARE_READ, 0, STATUS_SHARING_VIOLATION },
+    /*  2*/{ FILE_OVERWRITE_IF, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_SHARE_READ, 0, FILE_OVERWRITTEN },
+    /*  3*/{ FILE_OVERWRITE_IF, GENERIC_WRITE, 0, FILE_SHARE_WRITE, STATUS_SHARING_VIOLATION, },
+    /*  4*/{ FILE_OVERWRITE_IF, GENERIC_WRITE, FILE_SHARE_WRITE, 0, 0, FILE_OVERWRITTEN },
+    /*  5*/{ FILE_CREATE, GENERIC_READ, 0, FILE_SHARE_READ, STATUS_OBJECT_NAME_COLLISION },
+    /*  6*/{ FILE_CREATE, GENERIC_READ, FILE_SHARE_READ, 0, STATUS_OBJECT_NAME_COLLISION },
+    /*  7*/{ FILE_CREATE, GENERIC_WRITE, 0, FILE_SHARE_WRITE, STATUS_OBJECT_NAME_COLLISION },
+    /*  8*/{ FILE_CREATE, GENERIC_WRITE, FILE_SHARE_WRITE, 0, STATUS_OBJECT_NAME_COLLISION },
+    /*  9*/{ FILE_OPEN_IF, GENERIC_READ, 0, FILE_SHARE_READ, STATUS_SHARING_VIOLATION },
+    /* 10*/{ FILE_OPEN_IF, GENERIC_READ, FILE_SHARE_READ, 0, 0, FILE_OPENED },
+    /* 11*/{ FILE_OPEN_IF, GENERIC_WRITE, 0, FILE_SHARE_WRITE, STATUS_SHARING_VIOLATION },
+    /* 12*/{ FILE_OPEN_IF, GENERIC_WRITE, FILE_SHARE_WRITE, 0, 0, FILE_OPENED },
+    /* 13*/{ FILE_OPEN, GENERIC_READ, 0, FILE_SHARE_READ, STATUS_SHARING_VIOLATION },
+    /* 14*/{ FILE_OPEN, GENERIC_READ, FILE_SHARE_READ, 0, 0, FILE_OPENED },
+    /* 15*/{ FILE_OPEN, GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_SHARE_READ, STATUS_SHARING_VIOLATION },
+    /* 16*/{ FILE_OPEN, GENERIC_WRITE, 0, FILE_SHARE_WRITE, STATUS_SHARING_VIOLATION },
+    /* 17*/{ FILE_OPEN, GENERIC_WRITE, FILE_SHARE_WRITE, 0, 0, FILE_OPENED },
+    /* 18*/{ FILE_OVERWRITE, GENERIC_READ, 0, FILE_SHARE_READ, STATUS_SHARING_VIOLATION },
+    /* 19*/{ FILE_OVERWRITE, GENERIC_READ, FILE_SHARE_READ, 0, STATUS_SHARING_VIOLATION },
+    /* 20*/{ FILE_OVERWRITE, GENERIC_WRITE, FILE_SHARE_READ, FILE_SHARE_WRITE, STATUS_SHARING_VIOLATION },
+    /* 21*/{ FILE_OVERWRITE, GENERIC_WRITE, 0, FILE_SHARE_WRITE, STATUS_SHARING_VIOLATION },
+    /* 22*/{ FILE_OVERWRITE, GENERIC_WRITE, FILE_SHARE_WRITE, 0, 0, FILE_OVERWRITTEN },
+    /* 23*/{ FILE_SUPERSEDE, GENERIC_READ, 0, FILE_SHARE_READ, STATUS_SHARING_VIOLATION },
+    /* 24*/{ FILE_SUPERSEDE, GENERIC_READ, FILE_SHARE_READ, 0, STATUS_SHARING_VIOLATION },
+    /* 25*/{ FILE_SUPERSEDE, GENERIC_WRITE, 0, FILE_SHARE_WRITE, STATUS_SHARING_VIOLATION },
+    /* 26*/{ FILE_SUPERSEDE, GENERIC_WRITE, FILE_SHARE_WRITE, 0, STATUS_SHARING_VIOLATION },
+    /* 27*/{ FILE_SUPERSEDE, GENERIC_WRITE, FILE_SHARE_WRITE|FILE_SHARE_DELETE, 0, FILE_SUPERSEDED },
+    };
     static const WCHAR fooW[] = {'f','o','o',0};
     NTSTATUS status;
-    HANDLE handle;
+    HANDLE handle, handle2;
     WCHAR path[MAX_PATH];
     OBJECT_ATTRIBUTES attr;
     IO_STATUS_BLOCK io;
@@ -4067,9 +4102,36 @@ static void test_NtCreateFile(void)
         }
     }
 
-    pRtlFreeUnicodeString( &nameW );
     SetFileAttributesW(path, FILE_ATTRIBUTE_ARCHIVE);
     DeleteFileW( path );
+
+    /* test consecutive calls to NtCreateFile */
+    for (i = 0; i < ARRAY_SIZE(td2); i++)
+    {
+        status = pNtCreateFile(&handle, td2[i].access, &attr, &io, NULL,
+                               FILE_ATTRIBUTE_NORMAL, td2[i].share,
+                               FILE_CREATE, 0, NULL, 0);
+        ok(status == STATUS_SUCCESS, "%d: expected 0 got %#x\n", i, status);
+
+        status = pNtCreateFile(&handle2, td2[i].access, &attr, &io, NULL,
+                               FILE_ATTRIBUTE_NORMAL, td2[i].share2 ? td2[i].share2 : td2[i].share,
+                               td2[i].disposition, 0, NULL, 0);
+
+        todo_wine_if(i == 1 || i == 19 || i == 24 || i == 26)
+        ok(status == td2[i].status, "%d: expected %#x got %#x\n", i, td2[i].status, status);
+        if (!status)
+        {
+            todo_wine_if(i == 1 || i == 19)
+            ok(io.Information == td2[i].result,"%d: expected %#x got %#lx\n", i, td2[i].result, io.Information);
+            CloseHandle(handle2);
+        }
+
+        CloseHandle(handle);
+        DeleteFileW(path);
+    }
+
+    DeleteFileW( path );
+    pRtlFreeUnicodeString( &nameW );
 }
 
 static void test_read_write(void)
-- 
2.25.1




More information about the wine-devel mailing list