[PATCH v2 2/2] ntdll/tests: Add disk space allocation tests for NtCreateFile.

Patrick Hibbs hibbsncc1701 at gmail.com
Wed Jan 26 07:49:03 CST 2022


Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52171
Signed-off-by: Patrick Hibbs <hibbsncc1701 at gmail.com>
---
 dlls/ntdll/tests/file.c | 81 ++++++++++++++++++++++++++++-------------
 1 file changed, 56 insertions(+), 25 deletions(-)

diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c
index 19ae5f2ac21..69b75a52fb7 100644
--- a/dlls/ntdll/tests/file.c
+++ b/dlls/ntdll/tests/file.c
@@ -4170,28 +4170,42 @@ static void test_NtCreateFile(void)
 {
     static const struct test_data
     {
-        DWORD disposition, attrib_in, status, result, attrib_out, needs_cleanup;
+        DWORD disposition, attrib_in, status, result, attrib_out, alloc_in, alloc_out, enable_write, needs_cleanup;
     } td[] =
     {
-    /* 0*/{ FILE_CREATE, FILE_ATTRIBUTE_READONLY, 0, FILE_CREATED, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY, FALSE },
-    /* 1*/{ FILE_CREATE, 0, STATUS_OBJECT_NAME_COLLISION, 0, 0, TRUE },
-    /* 2*/{ FILE_CREATE, 0, 0, FILE_CREATED, FILE_ATTRIBUTE_ARCHIVE, FALSE },
-    /* 3*/{ FILE_OPEN, FILE_ATTRIBUTE_READONLY, 0, FILE_OPENED, FILE_ATTRIBUTE_ARCHIVE, TRUE },
-    /* 4*/{ FILE_OPEN, FILE_ATTRIBUTE_READONLY, STATUS_OBJECT_NAME_NOT_FOUND, 0, 0, FALSE },
-    /* 5*/{ FILE_OPEN_IF, 0, 0, FILE_CREATED, FILE_ATTRIBUTE_ARCHIVE, FALSE },
-    /* 6*/{ FILE_OPEN_IF, FILE_ATTRIBUTE_READONLY, 0, FILE_OPENED, FILE_ATTRIBUTE_ARCHIVE, TRUE },
-    /* 7*/{ FILE_OPEN_IF, FILE_ATTRIBUTE_READONLY, 0, FILE_CREATED, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY, FALSE },
-    /* 8*/{ FILE_OPEN_IF, 0, 0, FILE_OPENED, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY, FALSE },
-    /* 9*/{ FILE_OVERWRITE, 0, STATUS_ACCESS_DENIED, 0, 0, TRUE },
-    /*10*/{ FILE_OVERWRITE, 0, STATUS_OBJECT_NAME_NOT_FOUND, 0, 0, FALSE },
-    /*11*/{ FILE_CREATE, 0, 0, FILE_CREATED, FILE_ATTRIBUTE_ARCHIVE, FALSE },
-    /*12*/{ FILE_OVERWRITE, FILE_ATTRIBUTE_READONLY, 0, FILE_OVERWRITTEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY, FALSE },
-    /*13*/{ FILE_OVERWRITE_IF, 0, STATUS_ACCESS_DENIED, 0, 0, TRUE },
-    /*14*/{ FILE_OVERWRITE_IF, 0, 0, FILE_CREATED, FILE_ATTRIBUTE_ARCHIVE, FALSE },
-    /*15*/{ FILE_OVERWRITE_IF, FILE_ATTRIBUTE_READONLY, 0, FILE_OVERWRITTEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY, FALSE },
-    /*16*/{ FILE_SUPERSEDE, 0, 0, FILE_SUPERSEDED, FILE_ATTRIBUTE_ARCHIVE, FALSE },
-    /*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 }
+    /* 0*/{ FILE_CREATE, FILE_ATTRIBUTE_READONLY, 0, FILE_CREATED, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY, 0, 0, FALSE, FALSE },
+    /* 1*/{ FILE_CREATE, 0, STATUS_OBJECT_NAME_COLLISION, 0, 0, 0, 0, FALSE, TRUE },
+    /* 2*/{ FILE_CREATE, 0, 0, FILE_CREATED, FILE_ATTRIBUTE_ARCHIVE, 0, 0, FALSE, FALSE },
+    /* 3*/{ FILE_OPEN, FILE_ATTRIBUTE_READONLY, 0, FILE_OPENED, FILE_ATTRIBUTE_ARCHIVE, 0, 0, FALSE, TRUE },
+    /* 4*/{ FILE_OPEN, FILE_ATTRIBUTE_READONLY, STATUS_OBJECT_NAME_NOT_FOUND, 0, 0, 0, 0, FALSE, FALSE },
+    /* 5*/{ FILE_OPEN_IF, 0, 0, FILE_CREATED, FILE_ATTRIBUTE_ARCHIVE, 0, 0, FALSE, FALSE },
+    /* 6*/{ FILE_OPEN_IF, FILE_ATTRIBUTE_READONLY, 0, FILE_OPENED, FILE_ATTRIBUTE_ARCHIVE, 0, 0, FALSE, TRUE },
+    /* 7*/{ FILE_OPEN_IF, FILE_ATTRIBUTE_READONLY, 0, FILE_CREATED, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY, 0, 0, FALSE, FALSE },
+    /* 8*/{ FILE_OPEN_IF, 0, 0, FILE_OPENED, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY, 0, 0, FALSE, FALSE },
+    /* 9*/{ FILE_OVERWRITE, 0, STATUS_ACCESS_DENIED, 0, 0, 0, 0, FALSE, TRUE },
+    /*10*/{ FILE_OVERWRITE, 0, STATUS_OBJECT_NAME_NOT_FOUND, 0, 0, 0, 0, FALSE, FALSE },
+    /*11*/{ FILE_CREATE, 0, 0, FILE_CREATED, FILE_ATTRIBUTE_ARCHIVE, 0, 0, FALSE, FALSE },
+    /*12*/{ FILE_OVERWRITE, FILE_ATTRIBUTE_READONLY, 0, FILE_OVERWRITTEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY, 0, 0, FALSE, FALSE },
+    /*13*/{ FILE_OVERWRITE_IF, 0, STATUS_ACCESS_DENIED, 0, 0, 0, 0, FALSE, TRUE },
+    /*14*/{ FILE_OVERWRITE_IF, 0, 0, FILE_CREATED, FILE_ATTRIBUTE_ARCHIVE, 0, 0, FALSE, FALSE },
+    /*15*/{ FILE_OVERWRITE_IF, FILE_ATTRIBUTE_READONLY, 0, FILE_OVERWRITTEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY, 0, 0, FALSE, FALSE },
+    /*16*/{ FILE_SUPERSEDE, 0, 0, FILE_SUPERSEDED, FILE_ATTRIBUTE_ARCHIVE, 0, 0, FALSE, FALSE },
+    /*17*/{ FILE_SUPERSEDE, FILE_ATTRIBUTE_READONLY, 0, FILE_SUPERSEDED, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY, 0, 0, FALSE, TRUE },
+    /*18*/{ FILE_SUPERSEDE, 0, 0, FILE_CREATED, FILE_ATTRIBUTE_ARCHIVE, 0, 0, FALSE, TRUE },
+    /*19*/{ FILE_CREATE, 0, 0, FILE_CREATED, FILE_ATTRIBUTE_ARCHIVE, 2000, 2000, FALSE, TRUE },
+    /*20*/{ FILE_CREATE, 0, 0, FILE_CREATED, FILE_ATTRIBUTE_ARCHIVE, 2000, 2000, TRUE, FALSE },
+    /*21*/{ FILE_OVERWRITE, 0, 0, FILE_OVERWRITTEN, FILE_ATTRIBUTE_ARCHIVE, 2000, 2000, FALSE, FALSE },
+    /*22*/{ FILE_OPEN, 0, 0, FILE_OPENED, FILE_ATTRIBUTE_ARCHIVE, 2000, 0, TRUE, TRUE },
+    /*23*/{ FILE_OVERWRITE, 0, STATUS_OBJECT_NAME_NOT_FOUND, 0, 0, 2000, 0, FALSE, TRUE },
+    /*24*/{ FILE_OVERWRITE, 0, STATUS_OBJECT_NAME_NOT_FOUND, 0, 0, 2000, 0, TRUE, TRUE },
+    /*25*/{ FILE_OVERWRITE_IF, 0, 0, FILE_CREATED, FILE_ATTRIBUTE_ARCHIVE, 2000, 2000, TRUE, FALSE },
+    /*26*/{ FILE_OVERWRITE_IF, 0, 0, FILE_OVERWRITTEN, FILE_ATTRIBUTE_ARCHIVE, 2000, 2000, TRUE, TRUE },
+    /*27*/{ FILE_SUPERSEDE, 0, 0, FILE_CREATED, FILE_ATTRIBUTE_ARCHIVE, 2000, 2000, FALSE, FALSE },
+    /*28*/{ FILE_SUPERSEDE, 0, 0, FILE_SUPERSEDED, FILE_ATTRIBUTE_ARCHIVE, 2000, 2000, TRUE, FALSE },
+    /*29*/{ FILE_SUPERSEDE, 0, 0, FILE_SUPERSEDED, FILE_ATTRIBUTE_ARCHIVE, 2000, 2000, FALSE, FALSE },
+    /*30*/{ FILE_OPEN, 0, 0, FILE_OPENED, FILE_ATTRIBUTE_ARCHIVE, 0, 2000, FALSE, FALSE },
+    /*31*/{ FILE_OPEN, 0, 0, FILE_OPENED, FILE_ATTRIBUTE_ARCHIVE, 2000, 0, FALSE, TRUE },/* Win7 dealloc without write permission! */
+    /*32*/{ FILE_OPEN, 0, STATUS_OBJECT_NAME_NOT_FOUND, 0, 0, 2000, 0, FALSE, FALSE }
     };
     static const WCHAR fooW[] = {'f','o','o',0};
     NTSTATUS status;
@@ -4201,6 +4215,8 @@ static void test_NtCreateFile(void)
     IO_STATUS_BLOCK io;
     UNICODE_STRING nameW;
     DWORD ret, i;
+    LARGE_INTEGER li;
+    FILE_NETWORK_OPEN_INFORMATION info;
 
     GetTempPathW(MAX_PATH, path);
     GetTempFileNameW(path, fooW, 0, path);
@@ -4214,17 +4230,22 @@ static void test_NtCreateFile(void)
     attr.SecurityDescriptor = NULL;
     attr.SecurityQualityOfService = NULL;
 
+    info.AllocationSize.QuadPart = 0;
+
     for (i = 0; i < ARRAY_SIZE(td); i++)
     {
-        status = pNtCreateFile(&handle, GENERIC_READ, &attr, &io, NULL,
+        li.QuadPart = td[i].alloc_in;
+
+        status = pNtCreateFile(&handle, ((td[i].enable_write) ? (GENERIC_READ | GENERIC_WRITE) : (GENERIC_READ)),
+                               &attr, &io, ((li.QuadPart > 0) ? (&li) : (NULL)),
                                td[i].attrib_in, FILE_SHARE_READ|FILE_SHARE_WRITE,
                                td[i].disposition, 0, NULL, 0);
 
-        ok(status == td[i].status, "%d: expected %#x got %#x\n", i, td[i].status, status);
+        ok(status == td[i].status, "%d: status expected %#x got %#x\n", i, td[i].status, status);
 
         if (!status)
         {
-            ok(io.Information == td[i].result,"%d: expected %#x got %#lx\n", i, td[i].result, io.Information);
+            ok(io.Information == td[i].result,"%d: result expected %#x got %#lx\n", i, td[i].result, io.Information);
 
             ret = GetFileAttributesW(path);
             ret &= ~FILE_ATTRIBUTE_NOT_CONTENT_INDEXED;
@@ -4232,11 +4253,21 @@ static void test_NtCreateFile(void)
             if (ret != td[i].attrib_out)
             {
             todo_wine
-                ok(ret == td[i].attrib_out, "%d: expected %#x got %#x\n", i, td[i].attrib_out, ret);
+                ok(ret == td[i].attrib_out, "%d: attribute expected %#x got %#x\n", i, td[i].attrib_out, ret);
                 SetFileAttributesW(path, td[i].attrib_out);
             }
             else
-                ok(ret == td[i].attrib_out, "%d: expected %#x got %#x\n", i, td[i].attrib_out, ret);
+                ok(ret == td[i].attrib_out, "%d: attribute expected %#x got %#x\n", i, td[i].attrib_out, ret);
+
+            if (td[i].alloc_in)
+            {
+                status = pNtQueryFullAttributesFile( &attr, &info );
+                ok(status == STATUS_SUCCESS,
+                    "%d: query failed %x\n", i, status);
+                ok(info.AllocationSize.QuadPart >= td[i].alloc_out,
+                    "%d: alloc_size failed expected %#x got %#I64x\n", i, td[i].alloc_out,
+                    info.AllocationSize.QuadPart);
+            }
 
             CloseHandle(handle);
         }
-- 
2.30.2




More information about the wine-devel mailing list