[PATCH v2 1/4] ntdll/tests: Test readonly file access.
Zhiyi Zhang
zzhang at codeweavers.com
Tue Apr 9 10:53:53 CDT 2019
Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
---
v2: Supersede 162611~162614. Fix a memory leak.
dlls/ntdll/tests/file.c | 69 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 69 insertions(+)
diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c
index ce1619e4e1..8e54dbb541 100644
--- a/dlls/ntdll/tests/file.c
+++ b/dlls/ntdll/tests/file.c
@@ -4763,6 +4763,74 @@ static void test_flush_buffers_file(void)
DeleteFileA(buffer);
}
+static void test_file_readonly_access(void)
+{
+ static const DWORD default_sharing = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE;
+ static const WCHAR fooW[] = {'f', 'o', 'o', 0};
+ WCHAR path[MAX_PATH];
+ OBJECT_ATTRIBUTES attr;
+ UNICODE_STRING nameW;
+ IO_STATUS_BLOCK io;
+ HANDLE handle;
+ NTSTATUS status;
+ DWORD ret;
+
+ /* Set up */
+ GetTempPathW(MAX_PATH, path);
+ GetTempFileNameW(path, fooW, 0, path);
+ DeleteFileW(path);
+ pRtlDosPathNameToNtPathName_U(path, &nameW, NULL, NULL);
+
+ attr.Length = sizeof(attr);
+ attr.RootDirectory = NULL;
+ attr.ObjectName = &nameW;
+ attr.Attributes = OBJ_CASE_INSENSITIVE;
+ attr.SecurityDescriptor = NULL;
+ attr.SecurityQualityOfService = NULL;
+
+ status = pNtCreateFile(&handle, FILE_GENERIC_WRITE, &attr, &io, NULL, FILE_ATTRIBUTE_READONLY, default_sharing,
+ FILE_CREATE, 0, NULL, 0);
+ ok(status == STATUS_SUCCESS, "expected STATUS_SUCCESS, got %#x.\n", status);
+ CloseHandle(handle);
+
+ /* NtCreateFile FILE_GENERIC_WRITE */
+ status = pNtCreateFile(&handle, FILE_GENERIC_WRITE, &attr, &io, NULL, FILE_ATTRIBUTE_NORMAL, default_sharing,
+ FILE_OPEN, FILE_NON_DIRECTORY_FILE, NULL, 0);
+ ok(status == STATUS_ACCESS_DENIED, "expected STATUS_ACCESS_DENIED, got %#x.\n", status);
+
+ /* NtCreateFile DELETE without FILE_DELETE_ON_CLOSE */
+ status = pNtCreateFile(&handle, DELETE, &attr, &io, NULL, FILE_ATTRIBUTE_NORMAL, default_sharing, FILE_OPEN,
+ FILE_NON_DIRECTORY_FILE, NULL, 0);
+ ok(status == STATUS_SUCCESS, "expected STATUS_SUCCESS, got %#x.\n", status);
+ CloseHandle(handle);
+
+ /* NtCreateFile DELETE with FILE_DELETE_ON_CLOSE */
+ status = pNtCreateFile(&handle, SYNCHRONIZE | DELETE, &attr, &io, NULL, FILE_ATTRIBUTE_NORMAL, default_sharing,
+ FILE_OPEN, FILE_DELETE_ON_CLOSE | FILE_NON_DIRECTORY_FILE, NULL, 0);
+ ok(status == STATUS_CANNOT_DELETE, "expected STATUS_CANNOT_DELETE, got %#x.\n", status);
+
+ /* NtOpenFile GENERIC_WRITE */
+ status = pNtOpenFile(&handle, GENERIC_WRITE, &attr, &io, default_sharing, FILE_NON_DIRECTORY_FILE);
+ ok(status == STATUS_ACCESS_DENIED, "expected STATUS_ACCESS_DENIED, got %#x.\n", status);
+
+ /* NtOpenFile DELETE without FILE_DELETE_ON_CLOSE */
+ status = pNtOpenFile(&handle, DELETE, &attr, &io, default_sharing, FILE_NON_DIRECTORY_FILE);
+ ok(status == STATUS_SUCCESS, "expected STATUS_SUCCESS, got %#x.\n", status);
+ CloseHandle(handle);
+
+ /* NtOpenFile DELETE with FILE_DELETE_ON_CLOSE */
+ status = pNtOpenFile(&handle, DELETE, &attr, &io, default_sharing, FILE_DELETE_ON_CLOSE | FILE_NON_DIRECTORY_FILE);
+ ok(status == STATUS_CANNOT_DELETE, "expected STATUS_CANNOT_DELETE, got %#x.\n", status);
+
+ ret = GetFileAttributesW(path);
+ ok(ret & FILE_ATTRIBUTE_READONLY, "got wrong attribute: %#x.\n", ret);
+
+ /* Clean up */
+ pRtlFreeUnicodeString(&nameW);
+ SetFileAttributesW(path, FILE_ATTRIBUTE_NORMAL);
+ DeleteFileW(path);
+}
+
START_TEST(file)
{
HMODULE hkernel32 = GetModuleHandleA("kernel32.dll");
@@ -4827,6 +4895,7 @@ START_TEST(file)
test_file_id_information();
test_file_access_information();
test_file_mode();
+ test_file_readonly_access();
test_query_volume_information_file();
test_query_attribute_information_file();
test_ioctl();
--
2.19.1
More information about the wine-devel
mailing list