[PATCH] ntdll: test also FullDirectoryInformation (2nd)

Marcus Meissner marcus at jet.franken.de
Sun Mar 23 09:30:32 CDT 2014


2nd try, copy and paste of testsuite was not completed
---
 dlls/ntdll/tests/directory.c | 66 ++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 61 insertions(+), 5 deletions(-)

diff --git a/dlls/ntdll/tests/directory.c b/dlls/ntdll/tests/directory.c
index f190ff4..56f34a5 100644
--- a/dlls/ntdll/tests/directory.c
+++ b/dlls/ntdll/tests/directory.c
@@ -133,14 +133,12 @@ static void tear_down_attribute_test(const char *testdirA)
 }
 
 /* Match one found file against testfiles[], increment count if found */
-static void tally_test_file(FILE_BOTH_DIRECTORY_INFORMATION *dir_info)
+static void tally_test_file(DWORD xattrib, WCHAR *nameW, int namelen)
 {
     int i;
     DWORD attribmask =
       (FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_DIRECTORY|FILE_ATTRIBUTE_REPARSE_POINT);
-    DWORD attrib = dir_info->FileAttributes & attribmask;
-    WCHAR *nameW = dir_info->FileName;
-    int namelen = dir_info->FileNameLength / sizeof(WCHAR);
+    DWORD attrib = xattrib & attribmask;
 
     for (i=0; testfiles[i].name; i++) {
         int len = strlen(testfiles[i].name);
@@ -171,6 +169,7 @@ static void test_flags_NtQueryDirectoryFile(OBJECT_ATTRIBUTES *attr, const char
     UINT data_len;    /* length of dir data */
     BYTE data[8192];  /* directory data */
     FILE_BOTH_DIRECTORY_INFORMATION *dir_info;
+    FILE_FULL_DIRECTORY_INFORMATION *full_info;
     DWORD status;
     int numfiles;
     int i;
@@ -199,7 +198,7 @@ static void test_flags_NtQueryDirectoryFile(OBJECT_ATTRIBUTES *attr, const char
     while ((data_pos < data_len) && (numfiles < max_test_dir_size)) {
         dir_info = (FILE_BOTH_DIRECTORY_INFORMATION *)(data + data_pos);
 
-        tally_test_file(dir_info);
+        tally_test_file(dir_info->FileAttributes, dir_info->FileName, dir_info->FileNameLength/sizeof(WCHAR));
 
         if (dir_info->NextEntryOffset == 0) {
             pNtQueryDirectoryFile( dirh, 0, NULL, NULL, &io, data, data_size,
@@ -229,6 +228,63 @@ static void test_flags_NtQueryDirectoryFile(OBJECT_ATTRIBUTES *attr, const char
             ok(testfiles[i].nfound == 1, "Wrong number %d of %s files found (single_entry=%d,restart=%d)\n",
                testfiles[i].nfound, testfiles[i].description, single_entry, restart_flag);
     pNtClose(dirh);
+
+    /* Now try "Full" directory information */
+    reset_found_files();
+
+    data_size = mask ? offsetof( FILE_FULL_DIRECTORY_INFORMATION, FileName[256] ) : sizeof(data);
+
+    status = pNtOpenFile( &dirh, SYNCHRONIZE | FILE_LIST_DIRECTORY, attr, &io, FILE_OPEN,
+                         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", testdirA, status, GetLastError());
+    if (status != STATUS_SUCCESS) {
+       skip("can't test if we can't open the directory\n");
+       return;
+    }
+
+    /* Read the directory and note which files are found */
+    pNtQueryDirectoryFile( dirh, NULL, NULL, NULL, &io, data, data_size,
+                       FileFullDirectoryInformation, single_entry, mask, restart_flag );
+    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_FULL_DIRECTORY_INFORMATION), "not enough data in directory\n");
+
+    data_pos = 0;
+    numfiles = 0;
+    while ((data_pos < data_len) && (numfiles < max_test_dir_size)) {
+        full_info = (FILE_FULL_DIRECTORY_INFORMATION *)(data + data_pos);
+
+        tally_test_file(full_info->FileAttributes, full_info->FileName, full_info->FileNameLength/sizeof(WCHAR));
+
+        if (full_info->NextEntryOffset == 0) {
+            pNtQueryDirectoryFile( dirh, 0, NULL, NULL, &io, data, data_size,
+                               FileFullDirectoryInformation, single_entry, mask, FALSE );
+            if (U(io).Status == STATUS_NO_MORE_FILES)
+                break;
+            ok (U(io).Status == STATUS_SUCCESS, "failed to query directory; status %x\n", U(io).Status);
+            data_len = io.Information;
+            if (data_len < sizeof(FILE_FULL_DIRECTORY_INFORMATION))
+                break;
+            data_pos = 0;
+        } else {
+            data_pos += full_info->NextEntryOffset;
+        }
+        numfiles++;
+    }
+    ok(numfiles < max_test_dir_size, "too many loops\n");
+
+    if (mask)
+        for (i=0; testfiles[i].name; i++)
+            ok(testfiles[i].nfound == (testfiles[i].nameW == mask->Buffer),
+               "Wrong number %d of %s files found (single_entry=%d,mask=%s)\n",
+               testfiles[i].nfound, testfiles[i].description, single_entry,
+               wine_dbgstr_wn(mask->Buffer, mask->Length/sizeof(WCHAR) ));
+    else
+        for (i=0; testfiles[i].name; i++)
+            ok(testfiles[i].nfound == 1, "Wrong number %d of %s files found (single_entry=%d,restart=%d)\n",
+               testfiles[i].nfound, testfiles[i].description, single_entry, restart_flag);
+
+    pNtClose(dirh);
 }
 
 static void test_NtQueryDirectoryFile(void)
-- 
1.8.4.5




More information about the wine-patches mailing list