[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