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