From a87aac092cf3f954ee23d1daf0ca46f3f962a30d Mon Sep 17 00:00:00 2001 From: rocky Date: Mon, 21 Jun 2004 03:22:58 +0000 Subject: [PATCH] Can now get drive capabilities in ASPI driver ASPI headers from win32.h moved to aspi32.h some more cleanups. --- lib/MSWindows/aspi32.c | 140 +++++++++++++++++++++++------------------ lib/MSWindows/aspi32.h | 55 +++++++++++----- lib/MSWindows/win32.h | 20 +----- 3 files changed, 121 insertions(+), 94 deletions(-) diff --git a/lib/MSWindows/aspi32.c b/lib/MSWindows/aspi32.c index 340df9ca..4d5b63e8 100644 --- a/lib/MSWindows/aspi32.c +++ b/lib/MSWindows/aspi32.c @@ -1,5 +1,5 @@ /* - $Id: aspi32.c,v 1.7 2004/06/20 15:06:42 rocky Exp $ + $Id: aspi32.c,v 1.8 2004/06/21 03:22:58 rocky Exp $ Copyright (C) 2004 Rocky Bernstein @@ -27,7 +27,7 @@ # include "config.h" #endif -static const char _rcsid[] = "$Id: aspi32.c,v 1.7 2004/06/20 15:06:42 rocky Exp $"; +static const char _rcsid[] = "$Id: aspi32.c,v 1.8 2004/06/21 03:22:58 rocky Exp $"; #include #include @@ -306,17 +306,11 @@ static int mmc_read_sectors_aspi (const _img_private_t *env, void *data, lsn_t lsn, int sector_type, unsigned int nblocks) { - unsigned char buf[CDIO_CD_FRAMESIZE_RAW] = { 0, }; HANDLE hEvent; struct SRB_ExecSCSICmd ssc; #if 0 sector_type = 0; /*all types */ - /*sector_type = 1;*/ /* CD-DA */ - /*sector_type = 2;*/ /* mode1 */ - /*sector_type = 3;*/ /* mode2 */ - /*sector_type = 4;*/ /* mode2/form1 */ - /*sector_type = 5;*/ /* mode2/form2 */ #endif int sync = 0; int header_code = 2; @@ -362,8 +356,25 @@ mmc_read_sectors_aspi (const _img_private_t *env, void *data, lsn_t lsn, #endif /* Result buffer */ - ssc.SRB_BufPointer = buf; - ssc.SRB_BufLen = CDIO_CD_FRAMESIZE_RAW; + ssc.SRB_BufPointer = data; + + switch (sector_type) { + case CDIO_MMC_READ_TYPE_ANY: + case CDIO_MMC_READ_TYPE_CDDA: + ssc.SRB_BufLen = CDIO_CD_FRAMESIZE_RAW; + break; + case CDIO_MMC_READ_TYPE_M2F1: + ssc.SRB_BufLen = CDIO_CD_FRAMESIZE; + break; + case CDIO_MMC_READ_TYPE_M2F2: + ssc.SRB_BufLen = 2324; + break; + case CDIO_MMC_READ_TYPE_MODE1: + ssc.SRB_BufLen = CDIO_CD_FRAMESIZE; + break; + default: + ssc.SRB_BufLen = CDIO_CD_FRAMESIZE_RAW; + } /* Initiate transfer */ ResetEvent( hEvent ); @@ -380,10 +391,7 @@ mmc_read_sectors_aspi (const _img_private_t *env, void *data, lsn_t lsn, if( ssc.SRB_Status != SS_COMP ) { return 1; } - - /* FIXME! remove the 8 (SUBHEADER size) below... */ - memcpy (data, buf, CDIO_CD_FRAMESIZE_RAW); - + return 0; } @@ -409,14 +417,10 @@ int read_mode2_sector_aspi (const _img_private_t *env, void *data, lsn_t lsn, bool b_form2) { - - if (mmc_read_sectors_aspi(env, data, lsn, b_form2 - ? CDIO_MMC_READ_TYPE_M2F2 - : CDIO_MMC_READ_TYPE_M2F1, - 1)) { - return mmc_read_sectors_aspi(env, data, lsn, CDIO_MMC_READ_TYPE_ANY, 1); - } - return 0; + return mmc_read_sectors_aspi(env, data, lsn, b_form2 + ? CDIO_MMC_READ_TYPE_M2F2 + : CDIO_MMC_READ_TYPE_M2F1, + 1); } /*! @@ -427,10 +431,7 @@ int read_mode1_sector_aspi (const _img_private_t *env, void *data, lsn_t lsn, bool b_form2) { - if (mmc_read_sectors_aspi(env, data, lsn, CDIO_MMC_READ_TYPE_MODE1, 1)) { - return mmc_read_sectors_aspi(env, data, lsn, CDIO_MMC_READ_TYPE_ANY, 1); - } - return 0; + return mmc_read_sectors_aspi(env, data, lsn, CDIO_MMC_READ_TYPE_MODE1, 1); } /*! @@ -594,16 +595,12 @@ wnaspi32_eject_media (void *user_data) { /*! Return the the kind of drive capabilities of device. - Note: string is malloc'd so caller should free() then returned - string when done with it. - */ cdio_drive_cap_t get_drive_cap_aspi (const _img_private_t *env) { int32_t i_drivetype = CDIO_DRIVE_CAP_CD_AUDIO | CDIO_DRIVE_CAP_UNKNOWN; - unsigned char buf[192] = { 0, }; - + BYTE buf[256] = { 0, }; HANDLE hEvent; struct SRB_ExecSCSICmd ssc; @@ -619,24 +616,22 @@ get_drive_cap_aspi (const _img_private_t *env) capabilities, i.e. ability to read/write to CD-ROM/R/RW or/and read/write to DVD-ROM/R/RW. */ - ssc.SRB_Cmd = SC_EXEC_SCSI_CMD; - ssc.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY; - ssc.SRB_HaId = LOBYTE( env->i_sid ); - ssc.SRB_Target = HIBYTE( env->i_sid ); - ssc.SRB_SenseLen = SENSE_LEN; + ssc.SRB_Cmd = SC_EXEC_SCSI_CMD; + ssc.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY; + ssc.SRB_HaId = LOBYTE( env->i_sid ); + ssc.SRB_Target = HIBYTE( env->i_sid ); + ssc.SRB_Lun = 0; /* FIXME */ + ssc.SRB_SenseLen = SENSE_LEN; ssc.SRB_PostProc = (LPVOID) hEvent; - ssc.SRB_CDBLen = 6; + ssc.SRB_CDBLen = 12; /* Operation code */ - CDIO_MMC_SET_COMMAND(ssc.CDBByte, CDIO_MMC_MODE_SENSE); - - /*ssc.CDBByte[1] = 0x08; /+ doesn't return block descriptors */ + CDIO_MMC_SET_COMMAND(ssc.CDBByte, CDIO_MMC_MODE_SENSE_10); ssc.CDBByte[1] = 0x0; - ssc.CDBByte[2] = 0x2a; /*MODE_PAGE_CAPABILITIES*/; - ssc.CDBByte[3] = 0; /* Not used */ - ssc.CDBByte[4] = 128; - ssc.CDBByte[5] = 0; /* Not used */ + ssc.CDBByte[2] = 0x3F; /* try narrower 0x2a "mode-page" ? */ + ssc.CDBByte[7] = 0x01; + ssc.CDBByte[8] = 0x00; /* Allocation length and buffer */ ssc.SRB_BufPointer = buf; @@ -651,26 +646,49 @@ get_drive_cap_aspi (const _img_private_t *env) if( ssc.SRB_Status == SS_PENDING ) WaitForSingleObject( hEvent, INFINITE ); + CloseHandle( hEvent ); + /* check that the transfer went as planned */ if( ssc.SRB_Status != SS_COMP ) { - CloseHandle( hEvent ); return i_drivetype; - } - { - unsigned int n=buf[3]+4; - /* Reader? */ - if (buf[n+5] & 0x01) i_drivetype |= CDIO_DRIVE_CAP_CD_AUDIO; - if (buf[n+2] & 0x02) i_drivetype |= CDIO_DRIVE_CAP_CD_RW; - if (buf[n+2] & 0x08) i_drivetype |= CDIO_DRIVE_CAP_DVD; - - /* Writer? */ - if (buf[n+3] & 0x01) i_drivetype |= CDIO_DRIVE_CAP_CD_R; - if (buf[n+3] & 0x10) i_drivetype |= CDIO_DRIVE_CAP_DVD_R; - if (buf[n+3] & 0x20) i_drivetype |= CDIO_DRIVE_CAP_DVD_RAM; - - if (buf[n+6] & 0x08) i_drivetype |= CDIO_DRIVE_CAP_OPEN_TRAY; - if (buf[n+6] >> 5 != 0) - i_drivetype |= CDIO_DRIVE_CAP_CLOSE_TRAY; + } else { + BYTE *p; + int lenData = ((unsigned int)buf[0] << 8) + buf[1]; + BYTE *pMax = buf + 256; + + i_drivetype = 0; + /* set to first sense mask, and then walk through the masks */ + p = buf + 8; + while( (p < &(buf[2+lenData])) && (p < pMax) ) { + BYTE which; + + which = p[0] & 0x3F; + switch( which ) + { + case CDRAUDIOCTL: + case READERRREC: + case CDRPARMS: + /* Don't handle theses yet. */ + break; + case CDRCAPS: + /* Reader? */ + if (p[5] & 0x01) i_drivetype |= CDIO_DRIVE_CAP_CD_AUDIO; + if (p[2] & 0x02) i_drivetype |= CDIO_DRIVE_CAP_CD_RW; + if (p[2] & 0x08) i_drivetype |= CDIO_DRIVE_CAP_DVD; + + /* Writer? */ + if (p[3] & 0x01) i_drivetype |= CDIO_DRIVE_CAP_CD_R; + if (p[3] & 0x10) i_drivetype |= CDIO_DRIVE_CAP_DVD_R; + if (p[3] & 0x20) i_drivetype |= CDIO_DRIVE_CAP_DVD_RAM; + + if (p[6] & 0x08) i_drivetype |= CDIO_DRIVE_CAP_OPEN_TRAY; + if (p[6] >> 5 != 0) + i_drivetype |= CDIO_DRIVE_CAP_CLOSE_TRAY; + break; + default: ; + } + p += (p[1] + 2); + } } return i_drivetype; } diff --git a/lib/MSWindows/aspi32.h b/lib/MSWindows/aspi32.h index b1b85bd9..719c8f65 100644 --- a/lib/MSWindows/aspi32.h +++ b/lib/MSWindows/aspi32.h @@ -1,6 +1,6 @@ /* Win32 aspi specific */ /* - $Id: aspi32.h,v 1.1 2004/03/05 12:32:45 rocky Exp $ + $Id: aspi32.h,v 1.2 2004/06/21 03:22:58 rocky Exp $ Copyright (C) 2003, 2004 Rocky Bernstein @@ -94,6 +94,14 @@ struct SRB_ExecSCSICmd unsigned char SenseArea[SENSE_LEN+2]; }; +/*! + Values and structures used in MODE SENSE 10 command. +*/ +#define READERRREC 0x01 +#define CDRPARMS 0x0D +#define CDRAUDIOCTL 0x0E +#define CDRCAPS 0x2A + /***************************************************************************** %%% SRB - HOST ADAPTER INQUIRY - SC_HA_INQUIRY (0) %%% *****************************************************************************/ @@ -114,33 +122,50 @@ typedef struct // Offset } SRB_HAInquiry; -const char * wnaspi32_is_cdrom(const char drive_letter); +/*! + Return the the kind of drive capabilities of device. + + Note: string is malloc'd so caller should free() then returned + string when done with it. + + */ +cdio_drive_cap_t get_drive_cap_aspi (const _img_private_t *env); + +/*! + Get the format (XA, DATA, AUDIO) of a track. +*/ +track_format_t get_track_format_aspi(const _img_private_t *env, + track_t i_track); /*! - Initialize CD device. + Initialize internal structures for CD device. */ -bool wnaspi32_init_win32 (_img_private_t *env); +bool init_aspi (_img_private_t *env); + +const char *is_cdrom_aspi(const char drive_letter); /*! - Reads an audio device into data starting from lsn. - Returns 0 if no error. + Reads an audio device using the DeviceIoControl method into data + starting from lsn. Returns 0 if no error. */ -int wnaspi32_read_audio_sectors (_img_private_t *env, void *data, lsn_t lsn, - unsigned int nblocks); +int read_audio_sectors_aspi (_img_private_t *obj, void *data, lsn_t lsn, + unsigned int nblocks); +/*! + Reads a single mode1 sector using the DeviceIoControl method into + data starting from lsn. Returns 0 if no error. + */ +int read_mode1_sector_aspi (const _img_private_t *env, void *data, + lsn_t lsn, bool b_form2); /*! Reads a single mode2 sector from cd device into data starting from lsn. Returns 0 if no error. */ -int wnaspi32_read_mode2_sector (_img_private_t *env, void *data, lsn_t lsn); +int read_mode2_sector_aspi (const _img_private_t *env, void *data, lsn_t lsn, + bool b_form2); /*! Read and cache the CD's Track Table of Contents and track info. Return true if successful or false if an error. */ -bool wnaspi32_read_toc (_img_private_t *env); +bool read_toc_aspi (_img_private_t *env); -/*! - Get format of track. -*/ -track_format_t wnaspi32_get_track_format(_img_private_t *env, - track_t track_num); diff --git a/lib/MSWindows/win32.h b/lib/MSWindows/win32.h index b6637cea..fd36f20f 100644 --- a/lib/MSWindows/win32.h +++ b/lib/MSWindows/win32.h @@ -1,5 +1,5 @@ /* - $Id: win32.h,v 1.5 2004/06/20 15:06:42 rocky Exp $ + $Id: win32.h,v 1.6 2004/06/21 03:22:58 rocky Exp $ Copyright (C) 2004 Rocky Bernstein @@ -60,21 +60,13 @@ typedef struct { /*! Reads an audio device using the DeviceIoControl method into data starting from lsn. Returns 0 if no error. - */ -int read_audio_sectors_aspi (_img_private_t *obj, void *data, lsn_t lsn, - unsigned int nblocks); -/*! - Reads an audio device using the DeviceIoControl method into data - starting from lsn. Returns 0 if no error. - */ +*/ int read_audio_sectors_win32ioctl (_img_private_t *obj, void *data, lsn_t lsn, unsigned int nblocks); /*! Reads a single mode2 sector using the DeviceIoControl method into data starting from lsn. Returns 0 if no error. */ -int read_mode2_sector_aspi (const _img_private_t *env, void *data, lsn_t lsn, - bool b_form2); int read_mode2_sector_win32ioctl (const _img_private_t *env, void *data, lsn_t lsn, bool b_form2); @@ -82,18 +74,14 @@ int read_mode2_sector_win32ioctl (const _img_private_t *env, void *data, Reads a single mode1 sector using the DeviceIoControl method into data starting from lsn. Returns 0 if no error. */ -int read_mode1_sector_aspi (const _img_private_t *env, void *data, - lsn_t lsn, bool b_form2); int read_mode1_sector_win32ioctl (const _img_private_t *env, void *data, lsn_t lsn, bool b_form2); -const char *is_cdrom_aspi(const char drive_letter); const char *is_cdrom_win32ioctl (const char drive_letter); /*! Initialize internal structures for CD device. */ -bool init_aspi (_img_private_t *env); bool init_win32ioctl (_img_private_t *env); /*! @@ -101,7 +89,6 @@ bool init_win32ioctl (_img_private_t *env); Return true if successful or false if an error. */ bool read_toc_win32ioctl (_img_private_t *env); -bool read_toc_aspi (_img_private_t *env); char *get_mcn_win32ioctl (const _img_private_t *env); @@ -128,6 +115,3 @@ cdio_drive_cap_t get_drive_cap_win32ioctl (const _img_private_t *env); */ track_format_t get_track_format_win32ioctl(const _img_private_t *env, track_t i_track); - -track_format_t get_track_format_aspi(const _img_private_t *env, - track_t i_track);