Charles Davis : ntdll: Implement CDROM_ScsiGetCaps() on Mac OS.
Alexandre Julliard
julliard at winehq.org
Tue Oct 20 10:33:39 CDT 2009
Module: wine
Branch: master
Commit: 816a78b0cf9412793ff5d3ab8b8bbcd5e92f9ecc
URL: http://source.winehq.org/git/wine.git/?a=commit;h=816a78b0cf9412793ff5d3ab8b8bbcd5e92f9ecc
Author: Charles Davis <cdavis at mymail.mines.edu>
Date: Mon Oct 19 12:15:18 2009 -0600
ntdll: Implement CDROM_ScsiGetCaps() on Mac OS.
---
dlls/ntdll/cdrom.c | 23 ++++++++++++++++++++---
1 files changed, 20 insertions(+), 3 deletions(-)
diff --git a/dlls/ntdll/cdrom.c b/dlls/ntdll/cdrom.c
index d9ab7e2..d3dd54b 100644
--- a/dlls/ntdll/cdrom.c
+++ b/dlls/ntdll/cdrom.c
@@ -1892,12 +1892,12 @@ static NTSTATUS CDROM_ScsiPassThrough(int fd, PSCSI_PASS_THROUGH pPacket)
*
*
*/
-static NTSTATUS CDROM_ScsiGetCaps(PIO_SCSI_CAPABILITIES caps)
+static NTSTATUS CDROM_ScsiGetCaps(int fd, PIO_SCSI_CAPABILITIES caps)
{
NTSTATUS ret = STATUS_NOT_IMPLEMENTED;
- caps->Length = sizeof(*caps);
#ifdef SG_SCATTER_SZ
+ caps->Length = sizeof(*caps);
caps->MaximumTransferLength = SG_SCATTER_SZ; /* FIXME */
caps->MaximumPhysicalPages = SG_SCATTER_SZ / getpagesize();
caps->SupportedAsynchronousEvents = TRUE;
@@ -1906,6 +1906,23 @@ static NTSTATUS CDROM_ScsiGetCaps(PIO_SCSI_CAPABILITIES caps)
caps->AdapterScansDown = FALSE; /* FIXME ? */
caps->AdapterUsesPio = FALSE; /* FIXME ? */
ret = STATUS_SUCCESS;
+#elif defined __APPLE__
+ uint64_t bytesr, bytesw, align;
+ int io = ioctl(fd, DKIOCGETMAXBYTECOUNTREAD, &bytesr);
+ if (io != 0) return CDROM_GetStatusCode(io);
+ io = ioctl(fd, DKIOCGETMAXBYTECOUNTWRITE, &bytesw);
+ if (io != 0) return CDROM_GetStatusCode(io);
+ io = ioctl(fd, DKIOCGETMINSEGMENTALIGNMENTBYTECOUNT, &align);
+ if (io != 0) return CDROM_GetStatusCode(io);
+ caps->Length = sizeof(*caps);
+ caps->MaximumTransferLength = bytesr < bytesw ? bytesr : bytesw;
+ caps->MaximumPhysicalPages = caps->MaximumTransferLength / getpagesize();
+ caps->SupportedAsynchronousEvents = TRUE;
+ caps->AlignmentMask = align-1;
+ caps->TaggedQueuing = FALSE; /* we could check that it works and answer TRUE */
+ caps->AdapterScansDown = FALSE; /* FIXME ? */
+ caps->AdapterUsesPio = FALSE; /* FIXME ? */
+ ret = STATUS_SUCCESS;
#else
FIXME("Unimplemented\n");
#endif
@@ -2882,7 +2899,7 @@ NTSTATUS CDROM_DeviceIoControl(HANDLE hDevice,
sz = sizeof(IO_SCSI_CAPABILITIES);
if (lpOutBuffer == NULL) status = STATUS_INVALID_PARAMETER;
else if (nOutBufferSize < sizeof(IO_SCSI_CAPABILITIES)) status = STATUS_BUFFER_TOO_SMALL;
- else status = CDROM_ScsiGetCaps(lpOutBuffer);
+ else status = CDROM_ScsiGetCaps(fd, lpOutBuffer);
break;
case IOCTL_DVD_START_SESSION:
sz = sizeof(DVD_SESSION_ID);
More information about the wine-cvs
mailing list