https://bugs.winehq.org/show_bug.cgi?id=43947
--- Comment #5 from Christoph Heilmann christoph.heilmann@gmx.de --- I suppose the issue belongs to following code in wine-2.0-rc3/dlls/kernel32/volume.c but I'm not sure whats going wrong here:
1664 /*********************************************************************** d1051870 Alexan*1665 * GetDiskFreeSpaceExW (KERNEL32.@) 1666 * 1667 * This function is used to acquire the size of the available and 1668 * total space on a logical volume. 1669 * 1670 * RETURNS 1671 * 1672 * Zero on failure, nonzero upon success. Use GetLastError to obtain 1673 * detailed error information. 1674 * 1675 */ 1676 BOOL WINAPI GetDiskFreeSpaceExW( LPCWSTR root, PULARGE_INTEGER avail, 1677 PULARGE_INTEGER total, PULARGE_INTEGER totalfree ) 1678 { 1679 FILE_FS_SIZE_INFORMATION info; 1680 IO_STATUS_BLOCK io; 1681 NTSTATUS status; 1682 HANDLE handle; 1683 UINT units; 1684 1685 TRACE( "%s,%p,%p,%p\n", debugstr_w(root), avail, total, totalfree ); 1686 1687 if (!open_device_root( root, &handle )) return FALSE; 1688 1689 status = NtQueryVolumeInformationFile( handle, &io, &info, sizeof(info), FileFsSizeInformation ); 1690 NtClose( handle ); 1691 if (status != STATUS_SUCCESS) 1692 { 1693 SetLastError( RtlNtStatusToDosError(status) ); 1694 return FALSE; 1695 } 1696 1697 units = info.SectorsPerAllocationUnit * info.BytesPerSector; 1698 if (total) total->QuadPart = info.TotalAllocationUnits.QuadPart * units; 1699 if (totalfree) totalfree->QuadPart = info.AvailableAllocationUnits.QuadPart * units; 1700 /* FIXME: this one should take quotas into account */ 1701 if (avail) avail->QuadPart = info.AvailableAllocationUnits.QuadPart * units; 1702 return TRUE; 1703 } 1704 1705 1706 /*********************************************************************** 1707 * GetDiskFreeSpaceExA (KERNEL32.@) b8d9b619 Markus*1708 * 1709 * See GetDiskFreeSpaceExW. d1051870 Alexan*1710 */ 1711 BOOL WINAPI GetDiskFreeSpaceExA( LPCSTR root, PULARGE_INTEGER avail, 1712 PULARGE_INTEGER total, PULARGE_INTEGER totalfree ) 1713 { 0d33e5e3 Alexan*1714 WCHAR *rootW = NULL; d1051870 Alexan*1715 0d33e5e3 Alexan*1716 if (root && !(rootW = FILE_name_AtoW( root, FALSE ))) return FALSE; 1717 return GetDiskFreeSpaceExW( rootW, avail, total, totalfree ); d1051870 Alexan*1718 } 1719 1720 1721 /*********************************************************************** 1722 * GetDiskFreeSpaceW (KERNEL32.@) 1723 */ 1724 BOOL WINAPI GetDiskFreeSpaceW( LPCWSTR root, LPDWORD cluster_sectors, 1725 LPDWORD sector_bytes, LPDWORD free_clusters, 1726 LPDWORD total_clusters ) 1727 { 1728 FILE_FS_SIZE_INFORMATION info; 1729 IO_STATUS_BLOCK io; 1730 NTSTATUS status; 1731 HANDLE handle; 1732 UINT units; 1733 1734 TRACE( "%s,%p,%p,%p,%p\n", debugstr_w(root), 1735 cluster_sectors, sector_bytes, free_clusters, total_clusters ); 1736 1737 if (!open_device_root( root, &handle )) return FALSE; 1738 1739 status = NtQueryVolumeInformationFile( handle, &io, &info, sizeof(info), FileFsSizeInformation ); 1740 NtClose( handle ); 1741 if (status != STATUS_SUCCESS) 1742 { 1743 SetLastError( RtlNtStatusToDosError(status) ); 1744 return FALSE; 1745 } 1746 1747 units = info.SectorsPerAllocationUnit * info.BytesPerSector; 1748 551ef365 Rein K*1749 if( GetVersion() & 0x80000000) { /* win3.x, 9x, ME */ 1750 /* cap the size and available at 2GB as per specs */ 1751 if (info.TotalAllocationUnits.QuadPart * units > 0x7fffffff) { 1752 info.TotalAllocationUnits.QuadPart = 0x7fffffff / units; 1753 if (info.AvailableAllocationUnits.QuadPart * units > 0x7fffffff) 1754 info.AvailableAllocationUnits.QuadPart = 0x7fffffff / units; 1755 } 1756 /* nr. of clusters is always <= 65335 */ 1757 while( info.TotalAllocationUnits.QuadPart > 65535 ) { 1758 info.TotalAllocationUnits.QuadPart /= 2; 1759 info.AvailableAllocationUnits.QuadPart /= 2; 1760 info.SectorsPerAllocationUnit *= 2; 1761 } 1762 } d1051870 Alexan*1763 1764 if (cluster_sectors) *cluster_sectors = info.SectorsPerAllocationUnit; 1765 if (sector_bytes) *sector_bytes = info.BytesPerSector; 1766 if (free_clusters) *free_clusters = info.AvailableAllocationUnits.u.LowPart; 1767 if (total_clusters) *total_clusters = info.TotalAllocationUnits.u.LowPart; 729afb18 Austin*1768 TRACE("%#08x, %#08x, %#08x, %#08x\n", info.SectorsPerAllocationUnit, info.BytesPerSector, 1769 info.AvailableAllocationUnits.u.LowPart, info.TotalAllocationUnits.u.LowPart); d1051870 Alexan*1770 return TRUE; 1771 } 1772 1773 1774 /*********************************************************************** 1775 * GetDiskFreeSpaceA (KERNEL32.@) 1776 */ 1777 BOOL WINAPI GetDiskFreeSpaceA( LPCSTR root, LPDWORD cluster_sectors, 1778 LPDWORD sector_bytes, LPDWORD free_clusters, 1779 LPDWORD total_clusters ) 1780 { 0d33e5e3 Alexan*1781 WCHAR *rootW = NULL; d1051870 Alexan*1782 0d33e5e3 Alexan*1783 if (root && !(rootW = FILE_name_AtoW( root, FALSE ))) return FALSE; 1784 return GetDiskFreeSpaceW( rootW, cluster_sectors, sector_bytes, free_clusters, total_clusters ); d1051870 Alexan*1785 } 590aaaf4 Marcus*1786 1787 /*********************************************************************** 1788 * GetVolumePathNameA (KERNEL32.@) 1789 */ 1790 BOOL WINAPI GetVolumePathNameA(LPCSTR filename, LPSTR volumepathname, DWORD buflen) 1791 { 9b9d8dc3 Hans L*1792 BOOL ret; 3465646d Bruno *1793 WCHAR *filenameW = NULL, *volumeW = NULL; 9b9d8dc3 Hans L*1794 f6c7e247 Erich *1795 TRACE("(%s, %p, %d)\n", debugstr_a(filename), volumepathname, buflen); 9b9d8dc3 Hans L*1796 3465646d Bruno *1797 if (filename && !(filenameW = FILE_name_AtoW( filename, FALSE ))) 1798 return FALSE; 1799 if (volumepathname && !(volumeW = HeapAlloc( GetProcessHeap(), 0, buflen * sizeof(WCHAR) ))) 1800 return FALSE; 9b9d8dc3 Hans L*1801 1802 if ((ret = GetVolumePathNameW( filenameW, volumeW, buflen ))) 1803 FILE_name_WtoA( volumeW, -1, volumepathname, buflen ); 1804 1805 HeapFree( GetProcessHeap(), 0, volumeW ); 1806 return ret; 590aaaf4 Marcus*1807 } 1808