From: André Hentschel Subject: ntdll: Improve stub for FileFsAttributeInformation in NtQueryVolumeInformationFile (try 2) Message-Id: <51506835.9060902@dawncrow.de> Date: Mon, 25 Mar 2013 16:07:33 +0100 Fixed the last-minute-change... http://bugs.winehq.org/show_bug.cgi?id=27578 --- dlls/ntdll/file.c | 19 ++++++++++++++++++- dlls/ntdll/tests/file.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c index 791570e..267cc94 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 WCHAR ntfsW[] = {'N','T','F','S','\0'}; /************************************************************************** * 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 < sizeof(FILE_FS_ATTRIBUTE_INFORMATION) + 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 = lstrlenW(ntfsW) * sizeof(WCHAR); + memcpy(info->FileSystemName, ntfsW, lstrlenW(ntfsW) * sizeof(WCHAR)); + + 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(); } -- 1.8.0 -- Best Regards, André Hentschel