From: Heng-Leung C. <Heng@Sousuke.org> - 2009-02-21 03:05:12
|
Hi Max, the exact error code returned is 87 (The parameter is incorrect). I'm guessing that this happened, when I changed the buffer sizes, and fread() tried to read the last sectors *plus* anything beyond the disk's capacity. Guess that was my fault then... sorry for the inconvenience. I don't know whether those are intended read errors created for copy protection purposes. If so, what's returned by the MSX's disk ROM here? An empty (all bytes zeroed out?) buffer block? Either case, are specific copy protections internally emulated? Opening disk images of those offending games, will never rise any read-errors. So I suspect the problem is somewhere else? So I ran some other tests: 1. test: Consecutively read all sectors, i.e. from sector 0 to 1439. Always assuming a disksize of 737280 bytes. 2. test: Immediately seek to the offending sector, and try to read it. Results using Windows's internal disk i/o: 1. test: Everything worked flawless, no errors. 2. test: Same here, no errors. Results using mingw's disk i/o: 1. test: No errors at all. 2. test: fread() returns an unfilled block, returning an error. (Broken pipe) Out of curiosity, I've tried to read out the whole image by reading sector by sector. And even seek to the corresponding sector before. And again, no problems rose up. So what could be the problem here? Yes exacly, I was referring to the IOCTL_DISK_GET_DRIVE_GEOMETRY functions. So far the disk capacity - regardless of the disk's format - was recognized correctly. Are there any games, which have a completely non-standard disk format? Just to be sure, that really all known problematic cases do work. All sourcecodes are available here: http://sousuke.dyndns.org/openMSX/diskio/ - readimage-win32: Reads whole image, using Win32 disk i/o. - readsector-win32: Reads specified sector, using Win32 disk i/o. - readimage-mingw: Reads whole image, using mingw disk i/o. - readimage-mingw-sectorwise: Same as above, but reads sectorwise, and seeks to the sector everytime prior reading. - readsector-mingw: Reads specified sector, using mingw disk i/o. (doesn't work) - drivegeometry: Gets drive geometty and calculates the disk's capacity. Best regards Max Attar Feingold wrote: > Heng-Leung: > > Have you debugged through the case of ReadFile returning an error, but still > providing the requested data in the appropriate block? That doesn't match > the usual behavior of this API. What is the error? > > Is it possible that the sectors in question are actually bad/unreadable > sectors on the floppy disks themselves, in order to provide copy-protection? > If so, we probably need a mechanism for transferring the error intact to the > MSX I/O emulation layer - that would provide seamless emulation of bad > sectors, would it not? > > Now, if needed, we can certainly special-case specific usages of file i/o > with _WIN32 #ifdefs. See FileOperations.cc for many examples of that - the > goal is to keep the #ifdefs contained inside this file, insomuch as that's > possible. > > I'll note that the IOCTL_DISK_GET_DRIVE_GEOMETRY family of calls should help > you determine what kind of floppy disk you're dealing with. I *think* this > should work independently of how the floppy disk is formatted, but I'm not > 100% sure of that. > >> -----Original Message----- >> From: Heng-Leung Chau [mailto:Heng@Sousuke.org] >> Sent: Wednesday, February 18, 2009 8:37 >> To: ope...@li... >> Subject: [openMSX-devel] Win32 physical disk support / fread() error > handling >> Here's a small status of the physical disk support under Win32. >> So far I've successfully implemented the functionality. Although some >> problems still remain as I mentioned in the IRC channel. >> >> The problem is that specific sectors in some games (tested: Dragon >> Slayer 6, SD Snatcher) aren't readable using MinGW's fread(). Using >> Windows' native ReadFile() does work however. >> As I understand, ReadFile() also generates an error, due to the disk's >> non-standard format. But it still fetches the requested block, whereas >> fread() does not. >> So is it possible to change the error handling in fread()? Otherwise we >> need to change the fileaccess-functions for the Windows binaries... or >> any other suggestions/ideas here? >> >> But there's also good news to report. >> Looks like it is possible to get the drive's physical parameters under >> Windows. So it may be reliably detect whether the user is really trying >> to access a floppy drive or not. >> >> >> Best regards, >> Heng-Leung |