ntdll: Fix IOCTL_CDROM_RAW_READ ioctl
Vitaliy Margolen
wine-patch at kievinfo.com
Tue Jul 19 15:13:05 CDT 2005
Apparently kernel headers don't agree with the kernel itself.
At least the comments part.
Here is the link with more information:
http://www.kerneltraffic.org/kernel-traffic/kt20050102_288.html
Vitaliy Margolen
changelog:
dlls/ntdll/cdrom.c
fix IOCTL_CDROM_RAW_READ ioctl
-------------- next part --------------
Index: dlls/ntdll/cdrom.c
===================================================================
RCS file: /home/wine/wine/dlls/ntdll/cdrom.c,v
retrieving revision 1.62
diff -u -p -r1.62 cdrom.c
--- dlls/ntdll/cdrom.c 10 Jul 2005 17:42:46 -0000 1.62
+++ dlls/ntdll/cdrom.c 19 Jul 2005 20:06:16 -0000
@@ -1343,17 +1353,32 @@ static NTSTATUS CDROM_RawRead(int fd, co
*/
#if defined(linux)
{
- struct cdrom_read cdr;
struct cdrom_read_audio cdra;
+ struct cdrom_msf* msf;
+ int i;
+ LONGLONG t = ((LONGLONG)raw->DiskOffset.u.HighPart << 32) +
+ raw->DiskOffset.u.LowPart + CD_MSF_OFFSET;
switch (raw->TrackMode)
{
case YellowMode2:
- if (raw->DiskOffset.u.HighPart) FIXME("Unsupported value\n");
- cdr.cdread_lba = raw->DiskOffset.u.LowPart; /* FIXME ? */
- cdr.cdread_bufaddr = buffer;
- cdr.cdread_buflen = raw->SectorCount * sectSize;
- io = ioctl(fd, CDROMREADMODE2, &cdr);
+ /* Linux reads only one sector at a time.
+ * ioctl CDROMREADMODE2 takes struct cdrom_msf as an argument
+ * on the contrary to what header comments state.
+ */
+ for (i = 0; i < raw->SectorCount; i++, t += sectSize)
+ {
+ msf = (struct cdrom_msf*)buffer + i * sectSize;
+ msf->cdmsf_min0 = t / CD_FRAMES / CD_SECS;
+ msf->cdmsf_sec0 = t / CD_FRAMES % CD_SECS;
+ msf->cdmsf_frame0 = t % CD_FRAMES;
+ io = ioctl(fd, CDROMREADMODE2, msf);
+ if (io != 0)
+ {
+ *sz = sectSize * i;
+ return CDROM_GetStatusCode(io);
+ }
+ }
break;
case XAForm2:
FIXME("XAForm2: NIY\n");
More information about the wine-patches
mailing list