Matteo Bruni : ntdll/tests: Add a test for filename casing with NtQueryDirectoryFile().
Alexandre Julliard
julliard at wine.codeweavers.com
Wed May 20 10:04:12 CDT 2015
Module: wine
Branch: master
Commit: cb5c92f33c56d469e5e061e8ac2f090e88358c34
URL: http://source.winehq.org/git/wine.git/?a=commit;h=cb5c92f33c56d469e5e061e8ac2f090e88358c34
Author: Matteo Bruni <mbruni at codeweavers.com>
Date: Tue May 19 23:32:35 2015 +0200
ntdll/tests: Add a test for filename casing with NtQueryDirectoryFile().
---
dlls/ntdll/tests/directory.c | 96 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 96 insertions(+)
diff --git a/dlls/ntdll/tests/directory.c b/dlls/ntdll/tests/directory.c
index ec8cd5a..21aa31f 100644
--- a/dlls/ntdll/tests/directory.c
+++ b/dlls/ntdll/tests/directory.c
@@ -276,6 +276,101 @@ done:
pRtlFreeUnicodeString(&ntdirname);
}
+static void set_up_case_test(const char *testdir)
+{
+ BOOL ret;
+ char buf[MAX_PATH];
+ HANDLE h;
+
+ ret = CreateDirectoryA(testdir, NULL);
+ ok(ret, "couldn't create dir '%s', error %d\n", testdir, GetLastError());
+
+ sprintf(buf, "%s\\%s", testdir, "TesT");
+ h = CreateFileA(buf, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
+ FILE_ATTRIBUTE_NORMAL, 0);
+ ok(h != INVALID_HANDLE_VALUE, "failed to create temp file '%s'\n", buf);
+ CloseHandle(h);
+}
+
+static void tear_down_case_test(const char *testdir)
+{
+ int ret;
+ char buf[MAX_PATH];
+
+ sprintf(buf, "%s\\%s", testdir, "TesT");
+ ret = DeleteFileA(buf);
+ ok(ret || (GetLastError() == ERROR_PATH_NOT_FOUND),
+ "Failed to rm %s, error %d\n", buf, GetLastError());
+ RemoveDirectoryA(testdir);
+}
+
+static void test_NtQueryDirectoryFile_case(void)
+{
+ static const char testfile[] = "TesT";
+ static const WCHAR testfile_w[] = {'T','e','s','T'};
+ static int testfile_len = sizeof(testfile) - 1;
+ static WCHAR testmask[] = {'t','e','s','t'};
+ OBJECT_ATTRIBUTES attr;
+ UNICODE_STRING ntdirname;
+ char testdir[MAX_PATH];
+ WCHAR testdir_w[MAX_PATH];
+ HANDLE dirh;
+ UNICODE_STRING mask;
+ IO_STATUS_BLOCK io;
+ UINT data_size, data_len;
+ BYTE data[8192];
+ FILE_BOTH_DIRECTORY_INFORMATION *dir_info = (FILE_BOTH_DIRECTORY_INFORMATION *)data;
+ DWORD status;
+ WCHAR *name;
+ ULONG name_len;
+
+ /* Clean up from prior aborted run, if any, then set up test files */
+ ok(GetTempPathA(MAX_PATH, testdir), "couldn't get temp dir\n");
+ strcat(testdir, "case.tmp");
+ tear_down_case_test(testdir);
+ set_up_case_test(testdir);
+
+ pRtlMultiByteToUnicodeN(testdir_w, sizeof(testdir_w), NULL, testdir, strlen(testdir) + 1);
+ if (!pRtlDosPathNameToNtPathName_U(testdir_w, &ntdirname, NULL, NULL))
+ {
+ ok(0, "RtlDosPathNametoNtPathName_U failed\n");
+ goto done;
+ }
+ InitializeObjectAttributes(&attr, &ntdirname, OBJ_CASE_INSENSITIVE, 0, NULL);
+
+ data_size = offsetof(FILE_BOTH_DIRECTORY_INFORMATION, FileName[256]);
+
+ status = pNtOpenFile(&dirh, SYNCHRONIZE | FILE_LIST_DIRECTORY, &attr, &io, FILE_SHARE_READ,
+ FILE_SYNCHRONOUS_IO_NONALERT | FILE_OPEN_FOR_BACKUP_INTENT | FILE_DIRECTORY_FILE);
+ ok (status == STATUS_SUCCESS, "failed to open dir '%s', ret 0x%x, error %d\n", testdir, status, GetLastError());
+ if (status != STATUS_SUCCESS)
+ {
+ skip("can't test if we can't open the directory\n");
+ return;
+ }
+
+ mask.Buffer = testmask;
+ mask.Length = mask.MaximumLength = lstrlenW(testmask) * sizeof(WCHAR);
+ pNtQueryDirectoryFile(dirh, NULL, NULL, NULL, &io, data, data_size,
+ FileBothDirectoryInformation, TRUE, &mask, FALSE);
+ ok(U(io).Status == STATUS_SUCCESS, "failed to query directory; status %x\n", U(io).Status);
+ data_len = io.Information;
+ ok(data_len >= sizeof(FILE_BOTH_DIRECTORY_INFORMATION), "not enough data in directory\n");
+
+ name = dir_info->FileName;
+ name_len = dir_info->FileNameLength / sizeof(WCHAR);
+
+ ok(name_len == testfile_len, "unexpected filename length %u\n", name_len);
+ ok(!memcmp(name, testfile_w, testfile_len * sizeof(WCHAR)), "unexpected filename %s\n",
+ wine_dbgstr_wn(name, name_len));
+
+ pNtClose(dirh);
+
+done:
+ tear_down_case_test(testdir);
+ pRtlFreeUnicodeString(&ntdirname);
+}
+
static void test_redirection(void)
{
ULONG old, cur;
@@ -345,5 +440,6 @@ START_TEST(directory)
pRtlWow64EnableFsRedirectionEx = (void *)GetProcAddress(hntdll,"RtlWow64EnableFsRedirectionEx");
test_NtQueryDirectoryFile();
+ test_NtQueryDirectoryFile_case();
test_redirection();
}
More information about the wine-cvs
mailing list