[Bug 30592] New: Give kernel32.GetDiskFreeSpaceExW a trace message to better diagnose free disk space overflow problems with Win9X era apps/games
wine-bugs at winehq.org
wine-bugs at winehq.org
Fri May 4 10:00:16 CDT 2012
http://bugs.winehq.org/show_bug.cgi?id=30592
Bug #: 30592
Summary: Give kernel32.GetDiskFreeSpaceExW a trace message to
better diagnose free disk space overflow problems with
Win9X era apps/games
Product: Wine
Version: 1.5.3
Platform: x86
OS/Version: Linux
Status: NEW
Severity: enhancement
Priority: P2
Component: kernel32
AssignedTo: wine-bugs at winehq.org
ReportedBy: focht at gmx.net
Classification: Unclassified
Hello,
another enhancement request for better diagnosis ...
Sometimes I encounter broken Win9X era apps/games that suffer from
GetDiskFreeSpaceA/W overflows.
Example code which contains overflows:
--- snip ---
0x00428414: pushl %ecx
0x00428415: pushl %eax
0x00428416: leal 0x1c(%esp),%ecx
0x0042841a: pushl %edx
0x0042841b: leal 0x10(%esp),%eax
0x0042841f: pushl %ecx
0x00428420: pushl %eax
0x00428421: call *0x8a75fc -> 0x7b88273a GetDiskFreeSpaceA
0x00428427: movl 0xc(%esp),%ecx ; ecx = free_clusters
0x0042842b: movl 0x320(%esp),%eax ; needed space (compare value)
0x00428432: imull 0x10(%esp),%ecx ; ecx *= sector_bytes
0x00428437: imull 0x14(%esp),%ecx ; ecx *= cluster_sectors
0x0042843c: cmpl %ecx,%eax
0x0042843e: jnle 0x0042844c
0x00428440: xorl %eax,%eax
0x00428442: popl %ebx
0x00428443: addl $0x318,%esp
0x00428449: ret $0x4
0x0042844c: subl %ecx,%eax
0x0042844e: popl %ebx
--- snip ---
If you currently do +volume trace:
--- snip ---
0024:Call KERNEL32.GetDiskFreeSpaceA(0032eccc
"C:\\",0032ecdc,0032ecd8,0032ecd4,0032ece0) ret=00428427
0024:trace:volume:GetDiskFreeSpaceW L"C:\\",0x32ecdc,0x32ecd8,0x32ecd4,0x32ece0
0024:Ret KERNEL32.GetDiskFreeSpaceA() retval=00000001 ret=00428427
...
0024:trace:msvcrt:pf_printf_a Format is: "You do not have enough disk space to
run King's Quest: Mask of Eternity. Please free up %d megs of space and try
again."
--- snip ---
I'd like to see all the information returned to caller when doing +volume
trace.
Source:
http://source.winehq.org/git/wine.git/blob/1726427113b141535c2bb9e93879e409b7d00c37:/dlls/kernel32/volume.c#l1598
--- snip ---
1598 BOOL WINAPI GetDiskFreeSpaceExW( LPCWSTR root, PULARGE_INTEGER avail,
1599 PULARGE_INTEGER total, PULARGE_INTEGER
totalfree )
1600 {
1601 FILE_FS_SIZE_INFORMATION info;
1602 IO_STATUS_BLOCK io;
1603 NTSTATUS status;
1604 HANDLE handle;
1605 UINT units;
1606
1607 TRACE( "%s,%p,%p,%p\n", debugstr_w(root), avail, total, totalfree );
1608
1609 if (!open_device_root( root, &handle )) return FALSE;
1610
1611 status = NtQueryVolumeInformationFile( handle, &io, &info,
sizeof(info), FileFsSizeInformation );
1612 NtClose( handle );
1613 if (status != STATUS_SUCCESS)
1614 {
1615 SetLastError( RtlNtStatusToDosError(status) );
1616 return FALSE;
1617 }
1618
1619 units = info.SectorsPerAllocationUnit * info.BytesPerSector;
1620 if (total) total->QuadPart = info.TotalAllocationUnits.QuadPart *
units;
1621 if (totalfree) totalfree->QuadPart =
info.AvailableAllocationUnits.QuadPart * units;
1622 /* FIXME: this one should take quotas into account */
1623 if (avail) avail->QuadPart = info.AvailableAllocationUnits.QuadPart *
units;
1624 return TRUE;
1625 }
--- snip ---
Before the return on line 1624 a TRACE() would be very helpful, printing the
actual values of out parameters: cluster_sector, sector_bytes, free_clusters,
total_clusters
Additionally a hint if the values were capped due to Win9X compat (capped=0/1).
Actual 32-bits overflow warning would be a bonus but not required ;-)
Thanks.
Regards
--
Configure bugmail: http://bugs.winehq.org/userprefs.cgi?tab=email
Do not reply to this email, post in Bugzilla using the
above URL to reply.
------- You are receiving this mail because: -------
You are watching all bug changes.
More information about the wine-bugs
mailing list