Charles Davis : ntdll: Fix IOCTL_CDROM_RAW_READ on Mac OS.
Alexandre Julliard
julliard at winehq.org
Thu Apr 7 07:36:54 CDT 2011
Module: wine
Branch: stable
Commit: b37c63e08ee5b1983df7f770baeda013c0c1cf06
URL: http://source.winehq.org/git/wine.git/?a=commit;h=b37c63e08ee5b1983df7f770baeda013c0c1cf06
Author: Charles Davis <cdavis at mymail.mines.edu>
Date: Fri Feb 18 10:36:24 2011 -0700
ntdll: Fix IOCTL_CDROM_RAW_READ on Mac OS.
(cherry picked from commit 03c29bf7f5e2d72b327c67643a1830c6146871df)
---
dlls/ntdll/cdrom.c | 153 +++++++--------------------------------------------
1 files changed, 21 insertions(+), 132 deletions(-)
diff --git a/dlls/ntdll/cdrom.c b/dlls/ntdll/cdrom.c
index 59f85a0..554aa46 100644
--- a/dlls/ntdll/cdrom.c
+++ b/dlls/ntdll/cdrom.c
@@ -1437,6 +1437,9 @@ static NTSTATUS CDROM_RawRead(int fd, const RAW_READ_INFO* raw, void* buffer, DW
{
int ret = STATUS_NOT_SUPPORTED;
int io = -1;
+#ifdef __APPLE__
+ dk_cd_read_t cdrd;
+#endif
TRACE("RAW_READ_INFO: DiskOffset=%i,%i SectorCount=%i TrackMode=%i\n buffer=%p len=%i sz=%p\n",
raw->DiskOffset.u.HighPart, raw->DiskOffset.u.LowPart, raw->SectorCount, raw->TrackMode, buffer, len, sz);
@@ -1506,154 +1509,40 @@ static NTSTATUS CDROM_RawRead(int fd, const RAW_READ_INFO* raw, void* buffer, DW
return STATUS_INVALID_PARAMETER;
}
#elif defined(__APPLE__)
+ /* Mac OS lets us read multiple parts of the sector at a time.
+ * We can read all the sectors in at once, unlike Linux.
+ */
+ memset(&cdrd, 0, sizeof(cdrd));
+ cdrd.offset = (raw->DiskOffset.QuadPart >> 11) * kCDSectorSizeWhole;
+ cdrd.buffer = buffer;
+ cdrd.bufferLength = raw->SectorCount * kCDSectorSizeWhole;
switch (raw->TrackMode)
{
case YellowMode2:
- {
- /* Mac OS, on the other hand, DOES read only one part of the sector
- * at a time. Therefore, we have to read each part of the sector, in
- * order, to get the whole raw sector in.
- * This means that we have to read each sector one at a time, as on
- * Linux.
- */
- dk_cd_read_t cdrd;
- UInt64 lba = raw->DiskOffset.QuadPart >> 11;
- PBYTE bp;
- int i;
-
- for (i = 0, bp = buffer; i < raw->SectorCount;
- i++, lba++, bp += kCDSectorSizeWhole)
- {
- cdrd.offset = lba * kCDSectorSizeWhole;
- cdrd.sectorType = kCDSectorTypeMode2;
-
- /* First, the sync area */
- cdrd.sectorArea = kCDSectorAreaSync;
- cdrd.buffer = bp;
- cdrd.bufferLength = 12;
- io = ioctl(fd, DKIOCCDREAD, &cdrd);
- if (io != 0)
- {
- *sz = kCDSectorSizeWhole * i;
- return CDROM_GetStatusCode(io);
- }
-
- /* Then the header */
- cdrd.offset += 12;
- cdrd.sectorArea = kCDSectorAreaHeader;
- cdrd.buffer = (PBYTE)cdrd.buffer + 12;
- cdrd.bufferLength = 4;
- io = ioctl(fd, DKIOCCDREAD, &cdrd);
- if (io != 0)
- {
- *sz = kCDSectorSizeWhole * i + 12;
- return CDROM_GetStatusCode(io);
- }
-
- /* And finally the sector proper */
- cdrd.offset += 4;
- cdrd.sectorArea = kCDSectorAreaUser;
- cdrd.buffer = (PBYTE)cdrd.buffer + 4;
- cdrd.bufferLength = kCDSectorSizeMode2;
- io = ioctl(fd, DKIOCCDREAD, &cdrd);
- if (io != 0)
- {
- *sz = kCDSectorSizeWhole * i + 16;
- return CDROM_GetStatusCode(io);
- }
- }
-
+ cdrd.sectorType = kCDSectorTypeMode2;
+ cdrd.sectorArea = kCDSectorAreaSync | kCDSectorAreaHeader | kCDSectorAreaUser;
break;
- }
case XAForm2:
- {
- /* Same here */
- dk_cd_read_t cdrd;
- UInt64 lba = raw->DiskOffset.QuadPart >> 11;
- PBYTE bp;
- int i;
-
- for (i = 0, bp = buffer; i < raw->SectorCount;
- i++, lba++, bp += kCDSectorSizeWhole)
- {
- cdrd.offset = lba * kCDSectorSizeWhole;
- cdrd.sectorType = kCDSectorTypeMode2Form2;
-
- /* First, the sync area */
- cdrd.sectorArea = kCDSectorAreaSync;
- cdrd.buffer = bp;
- cdrd.bufferLength = 12;
- io = ioctl(fd, DKIOCCDREAD, &cdrd);
- if (io != 0)
- {
- *sz = kCDSectorSizeWhole * i;
- return CDROM_GetStatusCode(io);
- }
-
- /* Then the header */
- cdrd.offset += 12;
- cdrd.sectorArea = kCDSectorAreaHeader;
- cdrd.buffer = (PBYTE)cdrd.buffer + 12;
- cdrd.bufferLength = 4;
- io = ioctl(fd, DKIOCCDREAD, &cdrd);
- if (io != 0)
- {
- *sz = kCDSectorSizeWhole * i + 12;
- return CDROM_GetStatusCode(io);
- }
-
- /* And the sub-header */
- cdrd.offset += 4;
- cdrd.sectorArea = kCDSectorAreaSubHeader;
- cdrd.buffer = (PBYTE)cdrd.buffer + 4;
- cdrd.bufferLength = 8;
- io = ioctl(fd, DKIOCCDREAD, &cdrd);
- if (io != 0)
- {
- *sz = kCDSectorSizeWhole * i + 16;
- return CDROM_GetStatusCode(io);
- }
-
- /* And finally the sector proper */
- cdrd.offset += 8;
- cdrd.sectorArea = kCDSectorAreaUser;
- cdrd.buffer = (PBYTE)cdrd.buffer + 8;
- cdrd.bufferLength = kCDSectorSizeMode2;
- io = ioctl(fd, DKIOCCDREAD, &cdrd);
- if (io != 0)
- {
- *sz = kCDSectorSizeWhole * i + 24;
- return CDROM_GetStatusCode(io);
- }
- }
-
+ cdrd.sectorType = kCDSectorTypeMode2Form2;
+ cdrd.sectorArea = kCDSectorAreaSync | kCDSectorAreaHeader | kCDSectorAreaSubHeader | kCDSectorAreaUser;
break;
- }
case CDDA:
- {
- /* With CDDA, the whole raw sector is considered user data, so there's
- * no need to read one at a time.
- */
- dk_cd_read_t cdrd;
-
- cdrd.offset = (raw->DiskOffset.QuadPart >> 11) * kCDSectorSizeCDDA;
- cdrd.sectorArea = kCDSectorAreaUser;
cdrd.sectorType = kCDSectorTypeCDDA;
- cdrd.buffer = buffer;
- cdrd.bufferLength = len < raw->SectorCount*kCDSectorSizeCDDA ? len :
- raw->SectorCount*kCDSectorSizeCDDA;
-
- io = ioctl(fd, DKIOCCDREAD, &cdrd);
- if (io != 0) return CDROM_GetStatusCode(io);
+ cdrd.sectorArea = kCDSectorAreaUser;
break;
- }
default:
FIXME("NIY: %d\n", raw->TrackMode);
return STATUS_INVALID_PARAMETER;
}
+ io = ioctl(fd, DKIOCCDREAD, &cdrd);
+ if (io != 0)
+ {
+ *sz = cdrd.bufferLength;
+ return CDROM_GetStatusCode(io);
+ }
#else
switch (raw->TrackMode)
{
More information about the wine-cvs
mailing list