[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