From: Elizabeth Figura <zfigura@codeweavers.com> --- dlls/kernel32/tests/volume.c | 2 +- dlls/mountmgr.sys/device.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/dlls/kernel32/tests/volume.c b/dlls/kernel32/tests/volume.c index f8d0a8be5d1..6560fb8ac27 100644 --- a/dlls/kernel32/tests/volume.c +++ b/dlls/kernel32/tests/volume.c @@ -2188,7 +2188,7 @@ static void test_GetDiskSpaceInformationA(void) GetVolumeNameForVolumeMountPointA("C:\\", volume, ARRAY_SIZE(volume)); hr = pGetDiskSpaceInformationA(volume, &info); - todo_wine ok(hr == S_OK, "got %#lx for %s\n", hr, debugstr_a(volume)); + ok(hr == S_OK, "got %#lx for %s\n", hr, debugstr_a(volume)); check_disk_space_information(&info); } diff --git a/dlls/mountmgr.sys/device.c b/dlls/mountmgr.sys/device.c index 733d48aa05a..f73476cdcd4 100644 --- a/dlls/mountmgr.sys/device.c +++ b/dlls/mountmgr.sys/device.c @@ -1768,6 +1768,40 @@ static NTSTATUS WINAPI harddisk_query_volume( DEVICE_OBJECT *device, IRP *irp ) break; } + case FileFsFullSizeInformationEx: + { + FILE_FS_FULL_SIZE_INFORMATION_EX *info = irp->AssociatedIrp.SystemBuffer; + struct size_info size_info; + struct get_volume_size_info_params params = { dev->unix_mount, &size_info }; + + if (length < sizeof(FILE_FS_FULL_SIZE_INFORMATION_EX)) + { + status = STATUS_BUFFER_TOO_SMALL; + break; + } + + if ((status = MOUNTMGR_CALL( get_volume_size_info, ¶ms )) == STATUS_SUCCESS) + { + info->ActualTotalAllocationUnits = size_info.total_allocation_units; + info->ActualAvailableAllocationUnits = size_info.actual_available_allocation_units; + info->ActualPoolUnavailableAllocationUnits = 0; + info->CallerAvailableAllocationUnits = size_info.caller_available_allocation_units; + info->CallerPoolUnavailableAllocationUnits = 0; + info->UsedAllocationUnits = info->ActualTotalAllocationUnits - info->ActualAvailableAllocationUnits; + info->CallerTotalAllocationUnits = info->CallerAvailableAllocationUnits + info->UsedAllocationUnits; + info->TotalReservedAllocationUnits = 0; + info->VolumeStorageReserveAllocationUnits = 0; + info->AvailableCommittedAllocationUnits = 0; + info->PoolAvailableAllocationUnits = 0; + info->SectorsPerAllocationUnit = size_info.sectors_per_allocation_unit; + info->BytesPerSector = size_info.bytes_per_sector; + io->Information = sizeof(*info); + status = STATUS_SUCCESS; + } + + break; + } + default: FIXME("Unsupported volume query %x\n", irpsp->Parameters.QueryVolume.FsInformationClass); status = STATUS_NOT_SUPPORTED; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9927