libaacs | branch: master | npzacs <[email protected]> | Sun Oct 10 15:36:17 2010 +0300| [00b2df2bb7598262da44683509b50a7a983026fd] | committer: npzacs
Added Win32 MMC. Note: completely untested! > http://git.videolan.org/gitweb.cgi/libaacs.git/?a=commit;h=00b2df2bb7598262da44683509b50a7a983026fd --- src/libaacs/mmc.c | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 89 insertions(+), 2 deletions(-) diff --git a/src/libaacs/mmc.c b/src/libaacs/mmc.c index 3b21471..b513eb2 100644 --- a/src/libaacs/mmc.c +++ b/src/libaacs/mmc.c @@ -51,20 +51,50 @@ #define PATCHED_DRIVE 0 #endif +#if defined(_WIN32) +/* + * from ntddscsi.h, Windows DDK + */ +# define SCSI_IOCTL_DATA_OUT 0 +# define SCSI_IOCTL_DATA_IN 1 +# define SCSI_IOCTL_DATA_UNSPECIFIED 2 +# define IOCTL_SCSI_PASS_THROUGH_DIRECT 0x4D014 +# define MAX_SENSE_LEN 18 + +typedef struct _SCSI_PASS_THROUGH_DIRECT { + USHORT Length; + UCHAR ScsiStatus; + UCHAR PathId; + UCHAR TargetId; + UCHAR Lun; + UCHAR CdbLength; + UCHAR SenseInfoLength; + UCHAR DataIn; + ULONG DataTransferLength; + ULONG TimeOutValue; + PVOID DataBuffer; + ULONG SenseInfoOffset; + UCHAR Cdb[16]; +} SCSI_PASS_THROUGH_DIRECT, *PSCSI_PASS_THROUGH_DIRECT; + +#endif // defined(_WIN32) + + struct mmc { #if defined(_WIN32) HANDLE fd; #else int fd; #endif - uint8_t host_priv_key[20], host_cert[92], host_nonce[20]; + uint8_t host_priv_key[20], host_cert[92]; + uint8_t host_nonce[20]; uint8_t host_key_point[40]; }; static int _mmc_send_cmd(MMC *mmc, const uint8_t *cmd, uint8_t *buf, size_t tx, size_t rx) { -#ifdef HAVE_LINUX_CDROM_H +#if defined(HAVE_LINUX_CDROM_H) if (mmc->fd >= 0) { struct cdrom_generic_command cgc; struct request_sense sense; @@ -109,6 +139,63 @@ static int _mmc_send_cmd(MMC *mmc, const uint8_t *cmd, uint8_t *buf, size_t tx, DEBUG(DBG_MMC, " Send failed! [%d] %s (%p)\n", a, strerror(errno), mmc); } + +#elif defined(_WIN32) + + DWORD dwBytesReturned; + + struct { + SCSI_PASS_THROUGH_DIRECT sptd; + UCHAR SenseBuf[MAX_SENSE_LEN]; + } sptd_sb; + + if (mmc->fd == INVALID_HANDLE_VALUE) { + return 0; + } + + sptd_sb.sptd.Length = sizeof(SCSI_PASS_THROUGH_DIRECT); + sptd_sb.sptd.PathId = 0; + sptd_sb.sptd.TargetId = 0; + sptd_sb.sptd.Lun = 0; + sptd_sb.sptd.CdbLength = 12; + sptd_sb.sptd.SenseInfoLength = MAX_SENSE_LEN; + sptd_sb.sptd.TimeOutValue = 5; + sptd_sb.sptd.SenseInfoOffset = sizeof(SCSI_PASS_THROUGH_DIRECT); + + if (buf) { + if (tx) { + sptd_sb.sptd.DataIn = SCSI_IOCTL_DATA_OUT; + sptd_sb.sptd.DataTransferLength = tx; + sptd_sb.sptd.DataBuffer = buf; + } else if (rx) { + sptd_sb.sptd.DataIn = SCSI_IOCTL_DATA_IN; + sptd_sb.sptd.DataTransferLength = rx; + sptd_sb.sptd.DataBuffer = buf; + } + } else { + sptd_sb.sptd.DataIn = SCSI_IOCTL_DATA_UNSPECIFIED; + sptd_sb.sptd.DataTransferLength = 0; + sptd_sb.sptd.DataBuffer = NULL; + } + + memcpy(sptd_sb.sptd.Cdb, cmd, 16); + + ZeroMemory(sptd_sb.SenseBuf, MAX_SENSE_LEN); + + if (DeviceIoControl(mmc->fd, + IOCTL_SCSI_PASS_THROUGH_DIRECT, + (void*)&sptd_sb, sizeof(sptd_sb), + (void*)&sptd_sb, sizeof(sptd_sb), + &dwBytesReturned, NULL)) { + + if (sptd_sb.sptd.ScsiStatus == 0 /* STATUS_GOOD */) { + DEBUG(DBG_MMC, " Send succeeded! (%p)\n", mmc); + return 1; + } + } + + DEBUG(DBG_MMC, " Send failed! (%p)\n", mmc); + #endif return 0; _______________________________________________ libaacs-devel mailing list [email protected] http://mailman.videolan.org/listinfo/libaacs-devel
