Module: wine Branch: master Commit: 6368dbbd5939bf71b04f3c441dd3af8cd027b7fb URL: http://source.winehq.org/git/wine.git/?a=commit;h=6368dbbd5939bf71b04f3c441d...
Author: Charles Davis cdavis@mymail.mines.edu Date: Tue Oct 13 12:58:59 2009 -0600
ntdll: Implement CDROM_RawRead() on Mac OS.
---
dlls/ntdll/cdrom.c | 149 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 149 insertions(+), 0 deletions(-)
diff --git a/dlls/ntdll/cdrom.c b/dlls/ntdll/cdrom.c index 8e334df..c0389f9 100644 --- a/dlls/ntdll/cdrom.c +++ b/dlls/ntdll/cdrom.c @@ -1449,6 +1449,155 @@ static NTSTATUS CDROM_RawRead(int fd, const RAW_READ_INFO* raw, void* buffer, DW FIXME("NIY: %d\n", raw->TrackMode); return STATUS_INVALID_PARAMETER; } +#elif defined(__APPLE__) + 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); + } + } + + 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); + } + } + + 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); + break; + } + + default: + FIXME("NIY: %d\n", raw->TrackMode); + return STATUS_INVALID_PARAMETER; + } #else switch (raw->TrackMode) {