[PATCH] ntdll: Add support for FileFsFullSizeInformation class in NtQueryVolumeInformationFile
Alistair Leslie-Hughes
leslie_alistair at hotmail.com
Tue May 19 03:45:10 CDT 2020
From: Jianqiu Zhang <zhangjianqiu_133 at yeah.net>
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
---
dlls/ntdll/file.c | 54 ++++++++++++++++++++++++++++++++++++++++-
dlls/ntdll/tests/file.c | 8 +-----
2 files changed, 54 insertions(+), 8 deletions(-)
diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c
index 31e0f1680b..99076791d5 100644
--- a/dlls/ntdll/file.c
+++ b/dlls/ntdll/file.c
@@ -3485,7 +3485,59 @@ NTSTATUS WINAPI NtQueryVolumeInformationFile( HANDLE handle, PIO_STATUS_BLOCK io
FIXME( "%p: control info not supported\n", handle );
break;
case FileFsFullSizeInformation:
- FIXME( "%p: full size info not supported\n", handle );
+ if (length < sizeof(FILE_FS_FULL_SIZE_INFORMATION))
+ io->u.Status = STATUS_BUFFER_TOO_SMALL;
+ else
+ {
+ FILE_FS_FULL_SIZE_INFORMATION *info = buffer;
+
+ if (fstat( fd, &st ) < 0)
+ {
+ io->u.Status = FILE_GetNtStatus();
+ break;
+ }
+ if (!S_ISREG(st.st_mode) && !S_ISDIR(st.st_mode))
+ {
+ io->u.Status = STATUS_INVALID_DEVICE_REQUEST;
+ }
+ else
+ {
+ ULONGLONG bsize;
+#if !defined(linux) || !defined(HAVE_FSTATFS)
+ struct statvfs stfs;
+
+ if (fstatvfs( fd, &stfs ) < 0)
+ {
+ io->u.Status = FILE_GetNtStatus();
+ break;
+ }
+ bsize = stfs.f_frsize;
+#else
+ struct statfs stfs;
+ if (fstatfs( fd, &stfs ) < 0)
+ {
+ io->u.Status = FILE_GetNtStatus();
+ break;
+ }
+ bsize = stfs.f_bsize;
+#endif
+ if (bsize == 2048) /* assume CD-ROM */
+ {
+ info->BytesPerSector = 2048;
+ info->SectorsPerAllocationUnit = 1;
+ }
+ else
+ {
+ info->BytesPerSector = 512;
+ info->SectorsPerAllocationUnit = 8;
+ }
+ info->TotalAllocationUnits.QuadPart = bsize * stfs.f_blocks / (info->BytesPerSector * info->SectorsPerAllocationUnit);
+ info->CallerAvailableAllocationUnits.QuadPart = bsize * stfs.f_bavail / (info->BytesPerSector * info->SectorsPerAllocationUnit);
+ info->ActualAvailableAllocationUnits.QuadPart = bsize * stfs.f_bfree / (info->BytesPerSector * info->SectorsPerAllocationUnit);
+ io->Information = sizeof(*info);
+ io->u.Status = STATUS_SUCCESS;
+ }
+ }
break;
case FileFsObjectIdInformation:
FIXME( "%p: object id info not supported\n", handle );
diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c
index 31c18454f0..99c4a5cdc7 100644
--- a/dlls/ntdll/tests/file.c
+++ b/dlls/ntdll/tests/file.c
@@ -1265,7 +1265,7 @@ static void test_file_full_size_information(void)
/* Assume No Quota Settings configured on Wine Testbot */
res = pNtQueryVolumeInformationFile(h, &io, &ffsi, sizeof ffsi, FileFsFullSizeInformation);
- todo_wine ok(res == STATUS_SUCCESS, "cannot get attributes, res %x\n", res);
+ ok(res == STATUS_SUCCESS, "cannot get attributes, res %x\n", res);
res = pNtQueryVolumeInformationFile(h, &io, &fsi, sizeof fsi, FileFsSizeInformation);
ok(res == STATUS_SUCCESS, "cannot get attributes, res %x\n", res);
@@ -1281,8 +1281,6 @@ static void test_file_full_size_information(void)
ok(fsi.BytesPerSector == 512, "[fsi] BytesPerSector expected 512, got %d\n",fsi.BytesPerSector);
ok(fsi.SectorsPerAllocationUnit == 8, "[fsi] SectorsPerAllocationUnit expected 8, got %d\n",fsi.SectorsPerAllocationUnit);
- todo_wine
- {
ok(ffsi.TotalAllocationUnits.QuadPart > 0,
"[ffsi] TotalAllocationUnits expected positive, got negative value 0x%s\n",
wine_dbgstr_longlong(ffsi.TotalAllocationUnits.QuadPart));
@@ -1300,14 +1298,10 @@ static void test_file_full_size_information(void)
"[ffsi] CallerAvailableAllocationUnits error fsi:0x%s, ffsi: 0x%s\n",
wine_dbgstr_longlong(fsi.AvailableAllocationUnits.QuadPart),
wine_dbgstr_longlong(ffsi.CallerAvailableAllocationUnits.QuadPart));
- }
/* Assume file system is NTFS */
- todo_wine
- {
ok(ffsi.BytesPerSector == 512, "[ffsi] BytesPerSector expected 512, got %d\n",ffsi.BytesPerSector);
ok(ffsi.SectorsPerAllocationUnit == 8, "[ffsi] SectorsPerAllocationUnit expected 8, got %d\n",ffsi.SectorsPerAllocationUnit);
- }
CloseHandle( h );
}
--
2.26.2
More information about the wine-devel
mailing list