=?UTF-8?Q?Andr=C3=A9=20Hentschel=20?=: ntdll: Improve stub for FileFsAttributeInformation in NtQueryVolumeInformationFile .

Alexandre Julliard julliard at winehq.org
Tue Mar 26 15:11:13 CDT 2013


Module: wine
Branch: master
Commit: d53a55ea88c01647575b1388e22b1bbdf43b8a0d
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=d53a55ea88c01647575b1388e22b1bbdf43b8a0d

Author: André Hentschel <nerv at dawncrow.de>
Date:   Mon Mar 25 16:07:33 2013 +0100

ntdll: Improve stub for FileFsAttributeInformation in NtQueryVolumeInformationFile.

---

 dlls/ntdll/file.c       |   19 ++++++++++++++++++-
 dlls/ntdll/tests/file.c |   47 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 65 insertions(+), 1 deletions(-)

diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c
index 791570e..5147ef5 100644
--- a/dlls/ntdll/file.c
+++ b/dlls/ntdll/file.c
@@ -92,6 +92,7 @@ mode_t FILE_umask = 0;
 #define SECSPERDAY         86400
 #define SECS_1601_TO_1970  ((369 * 365 + 89) * (ULONGLONG)SECSPERDAY)
 
+static const WCHAR ntfsW[] = {'N','T','F','S'};
 
 /**************************************************************************
  *                 FILE_CreateFile                    (internal)
@@ -2639,7 +2640,23 @@ NTSTATUS WINAPI NtQueryVolumeInformationFile( HANDLE handle, PIO_STATUS_BLOCK io
         }
         break;
     case FileFsAttributeInformation:
-        FIXME( "%p: attribute info not supported\n", handle );
+        if (length < offsetof( FILE_FS_ATTRIBUTE_INFORMATION, FileSystemName[sizeof(ntfsW)/sizeof(WCHAR)] ))
+            io->u.Status = STATUS_BUFFER_TOO_SMALL;
+        else
+        {
+            FILE_FS_ATTRIBUTE_INFORMATION *info = buffer;
+
+            FIXME( "%p: faking attribute info\n", handle );
+            info->FileSystemAttribute = FILE_SUPPORTS_ENCRYPTION | FILE_FILE_COMPRESSION |
+                                        FILE_PERSISTENT_ACLS | FILE_UNICODE_ON_DISK |
+                                        FILE_CASE_PRESERVED_NAMES | FILE_CASE_SENSITIVE_SEARCH;
+            info->MaximumComponentNameLength = MAXIMUM_FILENAME_LENGTH - 1;
+            info->FileSystemNameLength = sizeof(ntfsW);
+            memcpy(info->FileSystemName, ntfsW, sizeof(ntfsW));
+
+            io->Information = sizeof(*info);
+            io->u.Status = STATUS_SUCCESS;
+        }
         break;
     case FileFsControlInformation:
         FIXME( "%p: control info not supported\n", handle );
diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c
index f6a9e7c..c077b71 100644
--- a/dlls/ntdll/tests/file.c
+++ b/dlls/ntdll/tests/file.c
@@ -1634,6 +1634,52 @@ todo_wine
     CloseHandle( dir );
 }
 
+static void test_query_attribute_information_file(void)
+{
+    NTSTATUS status;
+    HANDLE dir;
+    WCHAR path[MAX_PATH];
+    OBJECT_ATTRIBUTES attr;
+    IO_STATUS_BLOCK io;
+    UNICODE_STRING nameW;
+    FILE_FS_ATTRIBUTE_INFORMATION *ffai;
+    BYTE buf[sizeof(FILE_FS_ATTRIBUTE_INFORMATION) + MAX_PATH * sizeof(WCHAR)];
+
+    GetWindowsDirectoryW( path, MAX_PATH );
+    pRtlDosPathNameToNtPathName_U( path, &nameW, NULL, NULL );
+    attr.Length = sizeof(attr);
+    attr.RootDirectory = 0;
+    attr.ObjectName = &nameW;
+    attr.Attributes = OBJ_CASE_INSENSITIVE;
+    attr.SecurityDescriptor = NULL;
+    attr.SecurityQualityOfService = NULL;
+
+    status = pNtOpenFile( &dir, SYNCHRONIZE|FILE_LIST_DIRECTORY, &attr, &io,
+                          FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_DIRECTORY_FILE|FILE_SYNCHRONOUS_IO_NONALERT );
+    ok( !status, "open %s failed %x\n", wine_dbgstr_w(nameW.Buffer), status );
+    pRtlFreeUnicodeString( &nameW );
+
+    ZeroMemory( buf, sizeof(buf) );
+    U(io).Status = 0xdadadada;
+    io.Information = 0xcacacaca;
+
+    status = pNtQueryVolumeInformationFile( dir, &io, buf, sizeof(buf), FileFsAttributeInformation );
+
+    ffai = (FILE_FS_ATTRIBUTE_INFORMATION *)buf;
+
+    ok(status == STATUS_SUCCESS, "expected STATUS_SUCCESS, got %d\n", status);
+    ok(U(io).Status == STATUS_SUCCESS, "expected STATUS_SUCCESS, got %d\n", U(io).Status);
+    ok(ffai->FileSystemAttribute != 0, "Missing FileSystemAttribute\n");
+    ok(ffai->MaximumComponentNameLength != 0, "Missing MaximumComponentNameLength\n");
+    ok(ffai->FileSystemNameLength != 0, "Missing FileSystemNameLength\n");
+
+    trace("FileSystemAttribute: %x MaximumComponentNameLength: %x FileSystemName: %s\n",
+          ffai->FileSystemAttribute, ffai->MaximumComponentNameLength,
+          wine_dbgstr_wn(ffai->FileSystemName, ffai->FileSystemNameLength / sizeof(WCHAR)));
+
+    CloseHandle( dir );
+}
+
 static void test_NtCreateFile(void)
 {
     static const struct test_data
@@ -1770,4 +1816,5 @@ START_TEST(file)
     test_file_name_information();
     test_file_all_name_information();
     test_query_volume_information_file();
+    test_query_attribute_information_file();
 }




More information about the wine-cvs mailing list