Add mode1 reading Lint changes, routine renaming to be like

others. More const's, fewer void *. Attempt drive detection.

There are still many bugs. The code is just a little less bogus.
This commit is contained in:
rocky
2004-06-20 15:06:42 +00:00
parent e1808fb407
commit 4185b45889
4 changed files with 886 additions and 734 deletions

View File

@@ -1,5 +1,5 @@
/* /*
$Id: aspi32.c,v 1.6 2004/05/16 13:33:28 rocky Exp $ $Id: aspi32.c,v 1.7 2004/06/20 15:06:42 rocky Exp $
Copyright (C) 2004 Rocky Bernstein <rocky@panix.com> Copyright (C) 2004 Rocky Bernstein <rocky@panix.com>
@@ -27,7 +27,7 @@
# include "config.h" # include "config.h"
#endif #endif
static const char _rcsid[] = "$Id: aspi32.c,v 1.6 2004/05/16 13:33:28 rocky Exp $"; static const char _rcsid[] = "$Id: aspi32.c,v 1.7 2004/06/20 15:06:42 rocky Exp $";
#include <cdio/cdio.h> #include <cdio/cdio.h>
#include <cdio/sector.h> #include <cdio/sector.h>
@@ -55,7 +55,7 @@ static const char _rcsid[] = "$Id: aspi32.c,v 1.6 2004/05/16 13:33:28 rocky Exp
/* General ioctl() CD-ROM command function */ /* General ioctl() CD-ROM command function */
static bool static bool
wnaspi32_mciSendCommand(int id, UINT msg, DWORD flags, void *arg) mciSendCommand_aspi(int id, UINT msg, DWORD flags, void *arg)
{ {
MCIERROR mci_error; MCIERROR mci_error;
@@ -70,14 +70,14 @@ wnaspi32_mciSendCommand(int id, UINT msg, DWORD flags, void *arg)
} }
const char * const char *
wnaspi32_is_cdrom(const char drive_letter) is_cdrom_aspi(const char drive_letter)
{ {
static char psz_win32_drive[7]; static char psz_win32_drive[7];
HMODULE hASPI = NULL; HMODULE hASPI = NULL;
long (*lpGetSupport)( void ) = NULL; long (*lpGetSupport)( void ) = NULL;
long (*lpSendCommand)( void* ) = NULL; long (*lpSendCommand)( void* ) = NULL;
DWORD dwSupportInfo; DWORD dwSupportInfo;
int i_adapter, i_num_adapters; int i_adapter, i_hostadapters;
char c_drive; char c_drive;
hASPI = LoadLibrary( "wnaspi32.dll" ); hASPI = LoadLibrary( "wnaspi32.dll" );
@@ -94,7 +94,7 @@ wnaspi32_is_cdrom(const char drive_letter)
return NULL; return NULL;
} }
/* ASPI support seems to be there */ /* ASPI support seems to be there. */
dwSupportInfo = lpGetSupport(); dwSupportInfo = lpGetSupport();
@@ -110,15 +110,15 @@ wnaspi32_is_cdrom(const char drive_letter)
return NULL; return NULL;
} }
i_num_adapters = LOBYTE( LOWORD( dwSupportInfo ) ); i_hostadapters = LOBYTE( LOWORD( dwSupportInfo ) );
if( i_num_adapters == 0 ) { if( i_hostadapters == 0 ) {
FreeLibrary( hASPI ); FreeLibrary( hASPI );
return NULL; return NULL;
} }
c_drive = toupper(drive_letter) - 'A'; c_drive = toupper(drive_letter) - 'A';
for( i_adapter = 0; i_adapter < i_num_adapters; i_adapter++ ) { for( i_adapter = 0; i_adapter < i_hostadapters; i_adapter++ ) {
struct SRB_GetDiskInfo srbDiskInfo; struct SRB_GetDiskInfo srbDiskInfo;
int i_target; int i_target;
SRB_HAInquiry srbInquiry; SRB_HAInquiry srbInquiry;
@@ -147,7 +147,7 @@ wnaspi32_is_cdrom(const char drive_letter)
if( (srbDiskInfo.SRB_Status == SS_COMP) && if( (srbDiskInfo.SRB_Status == SS_COMP) &&
(srbDiskInfo.SRB_Int13HDriveInfo == c_drive) ) { (srbDiskInfo.SRB_Int13HDriveInfo == c_drive) ) {
/* Make sure this is a cdrom device */ /* Make sure this is a CD-ROM device. */
struct SRB_GDEVBlock srbGDEVBlock; struct SRB_GDEVBlock srbGDEVBlock;
memset( &srbGDEVBlock, 0, sizeof(struct SRB_GDEVBlock) ); memset( &srbGDEVBlock, 0, sizeof(struct SRB_GDEVBlock) );
@@ -175,13 +175,13 @@ wnaspi32_is_cdrom(const char drive_letter)
Initialize CD device. Initialize CD device.
*/ */
bool bool
wnaspi32_init_win32 (_img_private_t *env) init_aspi (_img_private_t *env)
{ {
HMODULE hASPI = NULL; HMODULE hASPI = NULL;
long (*lpGetSupport)( void ) = NULL; long (*lpGetSupport)( void ) = NULL;
long (*lpSendCommand)( void* ) = NULL; long (*lpSendCommand)( void* ) = NULL;
DWORD dwSupportInfo; DWORD dwSupportInfo;
int i, j, i_num_adapters; int i_adapter, i_hostadapters;
char c_drive; char c_drive;
if (2 == strlen(env->gen.source_name) && isalpha(env->gen.source_name[0]) ) if (2 == strlen(env->gen.source_name) && isalpha(env->gen.source_name[0]) )
@@ -206,7 +206,7 @@ wnaspi32_init_win32 (_img_private_t *env)
return false; return false;
} }
/* ASPI support seems to be there */ /* ASPI support seems to be there. */
dwSupportInfo = lpGetSupport(); dwSupportInfo = lpGetSupport();
@@ -222,26 +222,37 @@ wnaspi32_init_win32 (_img_private_t *env)
return false; return false;
} }
i_num_adapters = LOBYTE( LOWORD( dwSupportInfo ) ); i_hostadapters = LOBYTE( LOWORD( dwSupportInfo ) );
if( i_num_adapters == 0 ) { if( i_hostadapters == 0 ) {
FreeLibrary( hASPI ); FreeLibrary( hASPI );
return false; return false;
} }
c_drive = toupper(c_drive) - 'A'; c_drive = toupper(c_drive) - 'A';
for( i = 0; i < i_num_adapters; i++ ) { for( i_adapter = 0; i_adapter < i_hostadapters; i_adapter++ ) {
for( j = 0; j < 15; j++ ) {
struct SRB_GetDiskInfo srbDiskInfo; struct SRB_GetDiskInfo srbDiskInfo;
int lun; int i_target;
SRB_HAInquiry srbInquiry;
for (lun = 0; lun < 8; lun++ ) { srbInquiry.SRB_Cmd = SC_HA_INQUIRY;
srbInquiry.SRB_HaId = i_adapter;
lpSendCommand( (void*) &srbInquiry );
if( srbInquiry.SRB_Status != SS_COMP ) continue;
if( !srbInquiry.HA_Unique[3]) srbInquiry.HA_Unique[3]=8;
for(i_target=0; i_target < srbInquiry.HA_Unique[3]; i_target++)
{
int i_lun;
for (i_lun = 0; i_lun < 8; i_lun++ ) {
srbDiskInfo.SRB_Cmd = SC_GET_DISK_INFO; srbDiskInfo.SRB_Cmd = SC_GET_DISK_INFO;
srbDiskInfo.SRB_HaId = i;
srbDiskInfo.SRB_Flags = 0; srbDiskInfo.SRB_Flags = 0;
srbDiskInfo.SRB_Hdr_Rsvd = 0; srbDiskInfo.SRB_Hdr_Rsvd = 0;
srbDiskInfo.SRB_Target = j; srbDiskInfo.SRB_HaId = i_adapter;
srbDiskInfo.SRB_Lun = lun; srbDiskInfo.SRB_Target = i_target;
srbDiskInfo.SRB_Lun = i_lun;
lpSendCommand( (void*) &srbDiskInfo ); lpSendCommand( (void*) &srbDiskInfo );
@@ -251,19 +262,19 @@ wnaspi32_init_win32 (_img_private_t *env)
{ {
continue; continue;
} else { } else {
/* Make sure this is a cdrom device */ /* Make sure this is a CD-ROM device. */
struct SRB_GDEVBlock srbGDEVBlock; struct SRB_GDEVBlock srbGDEVBlock;
memset( &srbGDEVBlock, 0, sizeof(struct SRB_GDEVBlock) ); memset( &srbGDEVBlock, 0, sizeof(struct SRB_GDEVBlock) );
srbGDEVBlock.SRB_Cmd = SC_GET_DEV_TYPE; srbGDEVBlock.SRB_Cmd = SC_GET_DEV_TYPE;
srbGDEVBlock.SRB_HaId = i; srbGDEVBlock.SRB_HaId = i_adapter;
srbGDEVBlock.SRB_Target = j; srbGDEVBlock.SRB_Target = i_target;
lpSendCommand( (void*) &srbGDEVBlock ); lpSendCommand( (void*) &srbGDEVBlock );
if( ( srbGDEVBlock.SRB_Status == SS_COMP ) && if( ( srbGDEVBlock.SRB_Status == SS_COMP ) &&
( srbGDEVBlock.SRB_DeviceType == DTYPE_CDROM ) ) { ( srbGDEVBlock.SRB_DeviceType == DTYPE_CDROM ) ) {
env->i_sid = MAKEWORD( i, j ); env->i_sid = MAKEWORD( i_adapter, i_target );
env->hASPI = (long)hASPI; env->hASPI = (long)hASPI;
env->lpSendCommand = lpSendCommand; env->lpSendCommand = lpSendCommand;
env->b_aspi_init = true; env->b_aspi_init = true;
@@ -292,21 +303,26 @@ wnaspi32_init_win32 (_img_private_t *env)
Returns 0 if no error. Returns 0 if no error.
*/ */
static int static int
wnaspi32_mmc_read_sectors (_img_private_t *env, void *data, lsn_t lsn, mmc_read_sectors_aspi (const _img_private_t *env, void *data, lsn_t lsn,
int sector_type, unsigned int nblocks) int sector_type, unsigned int nblocks)
{ {
unsigned char buf[CDIO_CD_FRAMESIZE_RAW] = { 0, }; unsigned char buf[CDIO_CD_FRAMESIZE_RAW] = { 0, };
HANDLE hEvent; HANDLE hEvent;
struct SRB_ExecSCSICmd ssc; struct SRB_ExecSCSICmd ssc;
#if 1 #if 0
sector_type = 0; /*all types */ 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 sync = 0;
int header_code = 2; int header_code = 2;
int i_user_data = 1; int i_user_data = 1;
int edc_ecc = 0; int edc_ecc = 0;
int error_field = 0; int error_field = 0;
#endif
/* Create the transfer completion event */ /* Create the transfer completion event */
@@ -376,11 +392,13 @@ wnaspi32_mmc_read_sectors (_img_private_t *env, void *data, lsn_t lsn,
Returns 0 if no error. Returns 0 if no error.
*/ */
int int
wnaspi32_read_audio_sectors (_img_private_t *env, void *data, lsn_t lsn, read_audio_sectors_aspi (_img_private_t *env, void *data, lsn_t lsn,
unsigned int nblocks) unsigned int nblocks)
{ {
return wnaspi32_mmc_read_sectors( env, data, lsn, CDIO_MMC_READ_TYPE_CDDA, if (mmc_read_sectors_aspi(env, data, lsn, CDIO_MMC_READ_TYPE_CDDA, 1)) {
nblocks ); return mmc_read_sectors_aspi(env, data, lsn, CDIO_MMC_READ_TYPE_ANY, 1);
}
return 0;
} }
/*! /*!
@@ -388,10 +406,31 @@ wnaspi32_read_audio_sectors (_img_private_t *env, void *data, lsn_t lsn,
from lsn. Returns 0 if no error. from lsn. Returns 0 if no error.
*/ */
int int
wnaspi32_read_mode2_sector (_img_private_t *env, void *data, lsn_t lsn) read_mode2_sector_aspi (const _img_private_t *env, void *data, lsn_t lsn,
bool b_form2)
{ {
return wnaspi32_mmc_read_sectors(env, data, lsn, CDIO_MMC_READ_TYPE_ANY,
1); 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;
}
/*!
Reads a single mode2 sector from cd device 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)
{
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;
} }
/*! /*!
@@ -399,7 +438,7 @@ wnaspi32_read_mode2_sector (_img_private_t *env, void *data, lsn_t lsn)
Return true if successful or false if an error. Return true if successful or false if an error.
*/ */
bool bool
wnaspi32_read_toc (_img_private_t *env) read_toc_aspi (_img_private_t *env)
{ {
HANDLE hEvent; HANDLE hEvent;
struct SRB_ExecSCSICmd ssc; struct SRB_ExecSCSICmd ssc;
@@ -434,8 +473,8 @@ wnaspi32_read_toc (_img_private_t *env)
/* Allocation length and buffer */ /* Allocation length and buffer */
ssc.SRB_BufLen = sizeof( p_tocheader ); ssc.SRB_BufLen = sizeof( p_tocheader );
ssc.SRB_BufPointer = p_tocheader; ssc.SRB_BufPointer = p_tocheader;
ssc.CDBByte[ 7 ] = ( ssc.SRB_BufLen >> 8 ) & 0xff; ssc.CDBByte[ 7 ] = (unsigned char) ( ssc.SRB_BufLen >> 8 ) & 0xff;
ssc.CDBByte[ 8 ] = ( ssc.SRB_BufLen ) & 0xff; ssc.CDBByte[ 8 ] = (unsigned char) ( ssc.SRB_BufLen ) & 0xff;
/* Initiate transfer */ /* Initiate transfer */
ResetEvent( hEvent ); ResetEvent( hEvent );
@@ -452,7 +491,7 @@ wnaspi32_read_toc (_img_private_t *env)
return false; return false;
} }
env->first_track_num = p_tocheader[2]; env->i_first_track = p_tocheader[2];
env->total_tracks = p_tocheader[3] - p_tocheader[2] + 1; env->total_tracks = p_tocheader[3] - p_tocheader[2] + 1;
{ {
@@ -473,8 +512,8 @@ wnaspi32_read_toc (_img_private_t *env)
/* Allocation length and buffer */ /* Allocation length and buffer */
ssc.SRB_BufLen = i_toclength; ssc.SRB_BufLen = i_toclength;
ssc.SRB_BufPointer = p_fulltoc; ssc.SRB_BufPointer = p_fulltoc;
ssc.CDBByte[ 7 ] = ( ssc.SRB_BufLen >> 8 ) & 0xff; ssc.CDBByte[ 7 ] = (unsigned char) ( ssc.SRB_BufLen >> 8 ) & 0xff;
ssc.CDBByte[ 8 ] = ( ssc.SRB_BufLen ) & 0xff; ssc.CDBByte[ 8 ] = (unsigned char) ( ssc.SRB_BufLen ) & 0xff;
/* Initiate transfer */ /* Initiate transfer */
ResetEvent( hEvent ); ResetEvent( hEvent );
@@ -486,8 +525,10 @@ wnaspi32_read_toc (_img_private_t *env)
WaitForSingleObject( hEvent, INFINITE ); WaitForSingleObject( hEvent, INFINITE );
/* check that the transfer went as planned */ /* check that the transfer went as planned */
#if 0
if( ssc.SRB_Status != SS_COMP ) if( ssc.SRB_Status != SS_COMP )
env->total_tracks = 0; env->total_tracks = 0;
#endif
for( i = 0 ; i <= env->total_tracks ; i++ ) { for( i = 0 ; i <= env->total_tracks ; i++ ) {
int i_index = 8 + 8 * i; int i_index = 8 + 8 * i;
@@ -536,13 +577,13 @@ wnaspi32_eject_media (void *user_data) {
i_flags = MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID | i_flags = MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID |
MCI_OPEN_ELEMENT | MCI_OPEN_SHAREABLE; MCI_OPEN_ELEMENT | MCI_OPEN_SHAREABLE;
if( wnaspi32_mciSendCommand( 0, MCI_OPEN, i_flags, &op ) ) { if( mciSendCommand_aspi( 0, MCI_OPEN, i_flags, &op ) ) {
st.dwItem = MCI_STATUS_READY; st.dwItem = MCI_STATUS_READY;
/* Eject disc */ /* Eject disc */
ret = wnaspi32_mciSendCommand( op.wDeviceID, MCI_SET, ret = mciSendCommand_aspi( op.wDeviceID, MCI_SET,
MCI_SET_DOOR_OPEN, 0 ) != 0; MCI_SET_DOOR_OPEN, 0 ) != 0;
/* Release access to the device */ /* Release access to the device */
wnaspi32_mciSendCommand( op.wDeviceID, MCI_CLOSE, MCI_WAIT, 0 ); mciSendCommand_aspi( op.wDeviceID, MCI_CLOSE, MCI_WAIT, 0 );
} else } else
ret = 0; ret = 0;
@@ -550,11 +591,95 @@ wnaspi32_eject_media (void *user_data) {
} }
#endif #endif
/*!
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, };
HANDLE hEvent;
struct SRB_ExecSCSICmd ssc;
/* Create the transfer completion event */
hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
if( hEvent == NULL ) {
return CDIO_DRIVE_CAP_ERROR;
}
memset( &ssc, 0, sizeof( ssc ) );
/* If device supports SCSI-3, then we can get the CD drive
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_PostProc = (LPVOID) hEvent;
ssc.SRB_CDBLen = 6;
/* Operation code */
CDIO_MMC_SET_COMMAND(ssc.CDBByte, CDIO_MMC_MODE_SENSE);
/*ssc.CDBByte[1] = 0x08; /+ doesn't return block descriptors */
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 */
/* Allocation length and buffer */
ssc.SRB_BufPointer = buf;
ssc.SRB_BufLen = sizeof( buf );
/* Initiate transfer */
ResetEvent( hEvent );
env->lpSendCommand( (void*) &ssc );
/* If the command has still not been processed, wait until it's
* finished */
if( ssc.SRB_Status == SS_PENDING )
WaitForSingleObject( hEvent, INFINITE );
/* 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;
}
return i_drivetype;
}
/*! /*!
Get format of track. Get format of track.
*/ */
track_format_t track_format_t
wnaspi32_get_track_format(_img_private_t *env, track_t track_num) get_track_format_aspi(const _img_private_t *env, track_t track_num)
{ {
MCI_OPEN_PARMS op; MCI_OPEN_PARMS op;
MCI_STATUS_PARMS st; MCI_STATUS_PARMS st;
@@ -569,14 +694,14 @@ wnaspi32_get_track_format(_img_private_t *env, track_t track_num)
i_flags = MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID | i_flags = MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID |
MCI_OPEN_ELEMENT | MCI_OPEN_SHAREABLE; MCI_OPEN_ELEMENT | MCI_OPEN_SHAREABLE;
if( wnaspi32_mciSendCommand( 0, MCI_OPEN, i_flags, &op ) ) { if( mciSendCommand_aspi( 0, MCI_OPEN, i_flags, &op ) ) {
st.dwItem = MCI_CDA_STATUS_TYPE_TRACK; st.dwItem = MCI_CDA_STATUS_TYPE_TRACK;
st.dwTrack = track_num; st.dwTrack = track_num;
i_flags = MCI_TRACK | MCI_STATUS_ITEM ; i_flags = MCI_TRACK | MCI_STATUS_ITEM ;
ret = wnaspi32_mciSendCommand( op.wDeviceID, MCI_STATUS, i_flags, &st ); ret = mciSendCommand_aspi( op.wDeviceID, MCI_STATUS, i_flags, &st );
/* Release access to the device */ /* Release access to the device */
wnaspi32_mciSendCommand( op.wDeviceID, MCI_CLOSE, MCI_WAIT, 0 ); mciSendCommand_aspi( op.wDeviceID, MCI_CLOSE, MCI_WAIT, 0 );
switch(st.dwReturn) { switch(st.dwReturn) {
case MCI_CDA_TRACK_AUDIO: case MCI_CDA_TRACK_AUDIO:

View File

@@ -1,5 +1,5 @@
/* /*
$Id: win32.c,v 1.16 2004/05/16 13:33:28 rocky Exp $ $Id: win32.c,v 1.17 2004/06/20 15:06:42 rocky Exp $
Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com> Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com>
@@ -26,7 +26,7 @@
# include "config.h" # include "config.h"
#endif #endif
static const char _rcsid[] = "$Id: win32.c,v 1.16 2004/05/16 13:33:28 rocky Exp $"; static const char _rcsid[] = "$Id: win32.c,v 1.17 2004/06/20 15:06:42 rocky Exp $";
#include <cdio/cdio.h> #include <cdio/cdio.h>
#include <cdio/sector.h> #include <cdio/sector.h>
@@ -94,9 +94,9 @@ str_to_access_mode_win32(const char *psz_access_mode)
static const char * static const char *
cdio_is_cdrom(const char drive_letter) { cdio_is_cdrom(const char drive_letter) {
if ( WIN_NT ) { if ( WIN_NT ) {
return win32ioctl_is_cdrom(drive_letter); return is_cdrom_win32ioctl (drive_letter);
} else { } else {
return wnaspi32_is_cdrom(drive_letter); return is_cdrom_aspi(drive_letter);
} }
} }
@@ -113,10 +113,10 @@ _cdio_get_drive_cap (const void *env) {
if (_obj->hASPI) { if (_obj->hASPI) {
/* A safe guess */ /* A safe guess */
return CDIO_DRIVE_CAP_UNKNOWN | CDIO_DRIVE_CAP_CD_AUDIO
| CDIO_DRIVE_CAP_CD_R ; return get_drive_cap_aspi (env);
} else { } else {
return win32ioctl_get_drive_cap (env); return get_drive_cap_win32ioctl (env);
} }
} }
@@ -145,9 +145,9 @@ _cdio_init_win32 (void *user_data)
env->b_ioctl_init = false; env->b_ioctl_init = false;
if ( _AM_IOCTL == env->access_mode ) { if ( _AM_IOCTL == env->access_mode ) {
return win32ioctl_init_win32(env); return init_win32ioctl(env);
} else { } else {
return wnaspi32_init_win32(env); return init_aspi(env);
} }
} }
@@ -180,9 +180,9 @@ _cdio_read_audio_sectors (void *user_data, void *data, lsn_t lsn,
{ {
_img_private_t *env = user_data; _img_private_t *env = user_data;
if ( env->hASPI ) { if ( env->hASPI ) {
return wnaspi32_read_audio_sectors( env, data, lsn, nblocks ); return read_audio_sectors_aspi( env, data, lsn, nblocks );
} else { } else {
return win32ioctl_read_audio_sectors( env, data, lsn, nblocks ); return read_audio_sectors_win32ioctl( env, data, lsn, nblocks );
} }
} }
@@ -211,9 +211,9 @@ _cdio_read_mode1_sector (void *user_data, void *data, lsn_t lsn,
env->gen.ioctls_debugged++; env->gen.ioctls_debugged++;
if ( env->hASPI ) { if ( env->hASPI ) {
return 1; return read_mode1_sector_aspi( env, data, lsn, b_form2 );
} else { } else {
return win32ioctl_read_mode1_sector( env, data, lsn, b_form2 ); return read_mode1_sector_win32ioctl( env, data, lsn, b_form2 );
} }
} }
@@ -275,7 +275,7 @@ _cdio_read_mode2_sector (void *user_data, void *data, lsn_t lsn,
if ( env->hASPI ) { if ( env->hASPI ) {
int ret; int ret;
ret = wnaspi32_read_mode2_sector(user_data, buf, lsn); ret = read_mode2_sector_aspi(user_data, buf, lsn, 1);
if( ret != 0 ) return ret; if( ret != 0 ) return ret;
if (b_form2) if (b_form2)
memcpy (data, buf, M2RAW_SECTOR_SIZE); memcpy (data, buf, M2RAW_SECTOR_SIZE);
@@ -283,7 +283,7 @@ _cdio_read_mode2_sector (void *user_data, void *data, lsn_t lsn,
memcpy (((char *)data), buf + CDIO_CD_SUBHEADER_SIZE, CDIO_CD_FRAMESIZE); memcpy (((char *)data), buf + CDIO_CD_SUBHEADER_SIZE, CDIO_CD_FRAMESIZE);
return 0; return 0;
} else { } else {
return win32ioctl_read_mode2_sector( env, data, lsn, b_form2 ); return read_mode2_sector_win32ioctl( env, data, lsn, b_form2 );
} }
} }
@@ -341,9 +341,9 @@ _set_arg_win32 (void *user_data, const char key[], const char value[])
{ {
env->access_mode = str_to_access_mode_win32(value); env->access_mode = str_to_access_mode_win32(value);
if (env->access_mode == _AM_ASPI && !env->b_aspi_init) if (env->access_mode == _AM_ASPI && !env->b_aspi_init)
return wnaspi32_init_win32(env) ? 1 : -3; return init_aspi(env) ? 1 : -3;
else if (env->access_mode == _AM_IOCTL && !env->b_ioctl_init) else if (env->access_mode == _AM_IOCTL && !env->b_ioctl_init)
return win32ioctl_init_win32(env) ? 1 : -3; return init_win32ioctl(env) ? 1 : -3;
else else
return -4; return -4;
return 0; return 0;
@@ -363,9 +363,9 @@ _cdio_read_toc (_img_private_t *env)
{ {
bool ret; bool ret;
if( env->hASPI ) { if( env->hASPI ) {
ret = wnaspi32_read_toc( env ); ret = read_toc_aspi( env );
} else { } else {
ret =win32ioctl_read_toc(env); ret = read_toc_win32ioctl( env );
} }
if (ret) env->gen.toc_init = true ; if (ret) env->gen.toc_init = true ;
return true; return true;
@@ -438,7 +438,7 @@ _cdio_get_first_track_num(void *user_data)
if (!env->toc_init) _cdio_read_toc (env) ; if (!env->toc_init) _cdio_read_toc (env) ;
return env->first_track_num; return env->i_first_track;
} }
/*! /*!
@@ -454,7 +454,7 @@ _cdio_get_mcn (const void *env) {
const _img_private_t *_env = env; const _img_private_t *_env = env;
if( ! _env->hASPI ) { if( ! _env->hASPI ) {
return win32ioctl_get_mcn(_env); return get_mcn_win32ioctl(_env);
} }
return NULL; return NULL;
} }
@@ -487,9 +487,9 @@ _cdio_get_track_format(void *obj, track_t track_num)
return TRACK_FORMAT_ERROR; return TRACK_FORMAT_ERROR;
if( env->hASPI ) { if( env->hASPI ) {
return wnaspi32_get_track_format(env, track_num); return get_track_format_aspi(env, track_num);
} else { } else {
return win32ioctl_get_track_format(env, track_num); return get_track_format_win32ioctl(env, track_num);
} }
} }
@@ -502,22 +502,27 @@ _cdio_get_track_format(void *obj, track_t track_num)
FIXME: there's gotta be a better design for this and get_track_format? FIXME: there's gotta be a better design for this and get_track_format?
*/ */
static bool static bool
_cdio_get_track_green(void *obj, track_t track_num) _cdio_get_track_green(void *obj, track_t i_track)
{ {
_img_private_t *env = obj; _img_private_t *env = obj;
if (!env->toc_init) _cdio_read_toc (env) ; if (!env->toc_init) _cdio_read_toc (env) ;
if (track_num == CDIO_CDROM_LEADOUT_TRACK) track_num = env->total_tracks+1; if (i_track == CDIO_CDROM_LEADOUT_TRACK) i_track = env->total_tracks+1;
if (track_num > env->total_tracks+1 || track_num == 0) if (i_track > env->total_tracks+1 || i_track == 0)
return false; return false;
switch (_cdio_get_track_format(env, track_num)) { switch (_cdio_get_track_format(env, i_track)) {
case TRACK_FORMAT_XA:
return true;
case TRACK_FORMAT_ERROR: case TRACK_FORMAT_ERROR:
case TRACK_FORMAT_CDI: case TRACK_FORMAT_CDI:
case TRACK_FORMAT_AUDIO: case TRACK_FORMAT_AUDIO:
return false; return false;
case TRACK_FORMAT_DATA:
if (_AM_ASPI == env->access_mode )
return false;
default: default:
break; break;
} }
@@ -525,7 +530,7 @@ _cdio_get_track_green(void *obj, track_t track_num)
/* FIXME: Dunno if this is the right way, but it's what /* FIXME: Dunno if this is the right way, but it's what
I was using in cd-info for a while. I was using in cd-info for a while.
*/ */
return ((env->tocent[track_num-1].Control & 2) != 0); return ((env->tocent[i_track-1].Control & 2) != 0);
} }
/*! /*!

View File

@@ -1,5 +1,5 @@
/* /*
$Id: win32.h,v 1.4 2004/04/30 07:33:51 rocky Exp $ $Id: win32.h,v 1.5 2004/06/20 15:06:42 rocky Exp $
Copyright (C) 2004 Rocky Bernstein <rocky@panix.com> Copyright (C) 2004 Rocky Bernstein <rocky@panix.com>
@@ -53,7 +53,7 @@ typedef struct {
bool toc_init; /* if true, info below is valid. */ bool toc_init; /* if true, info below is valid. */
track_info_t tocent[100]; /* entry info for each track */ track_info_t tocent[100]; /* entry info for each track */
track_t total_tracks; /* number of tracks in image */ track_t total_tracks; /* number of tracks in image */
track_t first_track_num; /* track number of first track */ track_t i_first_track; /* track number of first track */
} _img_private_t; } _img_private_t;
@@ -61,38 +61,49 @@ typedef struct {
Reads an audio device using the DeviceIoControl method into data Reads an audio device using the DeviceIoControl method into data
starting from lsn. Returns 0 if no error. starting from lsn. Returns 0 if no error.
*/ */
int win32ioctl_read_audio_sectors (_img_private_t *obj, void *data, lsn_t lsn, 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); unsigned int nblocks);
/*! /*!
Reads a single mode2 sector using the DeviceIoControl method into Reads a single mode2 sector using the DeviceIoControl method into
data starting from lsn. Returns 0 if no error. data starting from lsn. Returns 0 if no error.
*/ */
int int read_mode2_sector_aspi (const _img_private_t *env, void *data, lsn_t lsn,
win32ioctl_read_mode2_sector (_img_private_t *env, void *data, lsn_t lsn, bool b_form2);
bool mode2_form2); int read_mode2_sector_win32ioctl (const _img_private_t *env, void *data,
lsn_t lsn, bool b_form2);
/*! /*!
Reads a single mode1 sector using the DeviceIoControl method into Reads a single mode1 sector using the DeviceIoControl method into
data starting from lsn. Returns 0 if no error. data starting from lsn. Returns 0 if no error.
*/ */
int int read_mode1_sector_aspi (const _img_private_t *env, void *data,
win32ioctl_read_mode1_sector (_img_private_t *env, void *data, lsn_t lsn, lsn_t lsn, bool b_form2);
bool mode2_form2); int read_mode1_sector_win32ioctl (const _img_private_t *env, void *data,
lsn_t lsn, bool b_form2);
const char *win32ioctl_is_cdrom(const char drive_letter); const char *is_cdrom_aspi(const char drive_letter);
const char *is_cdrom_win32ioctl (const char drive_letter);
/*! /*!
Initialize internal structures for CD device. Initialize internal structures for CD device.
*/ */
bool win32ioctl_init_win32 (_img_private_t *env); bool init_aspi (_img_private_t *env);
bool init_win32ioctl (_img_private_t *env);
/*! /*!
Read and cache the CD's Track Table of Contents and track info. Read and cache the CD's Track Table of Contents and track info.
Return true if successful or false if an error. Return true if successful or false if an error.
*/ */
bool win32ioctl_read_toc (_img_private_t *env); bool read_toc_win32ioctl (_img_private_t *env);
bool read_toc_aspi (_img_private_t *env);
char *win32ioctl_get_mcn (const _img_private_t *env); char *get_mcn_win32ioctl (const _img_private_t *env);
/*! /*!
Return the the kind of drive capabilities of device. Return the the kind of drive capabilities of device.
@@ -101,10 +112,22 @@ char *win32ioctl_get_mcn (const _img_private_t *env);
string when done with it. string when done with it.
*/ */
cdio_drive_cap_t win32ioctl_get_drive_cap (const void *env); cdio_drive_cap_t get_drive_cap_aspi (const _img_private_t *env);
/*!
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_win32ioctl (const _img_private_t *env);
/*! /*!
Get the format (XA, DATA, AUDIO) of a track. Get the format (XA, DATA, AUDIO) of a track.
*/ */
track_format_t win32ioctl_get_track_format(_img_private_t *env, track_format_t get_track_format_win32ioctl(const _img_private_t *env,
track_t track_num); track_t i_track);
track_format_t get_track_format_aspi(const _img_private_t *env,
track_t i_track);

View File

@@ -1,5 +1,5 @@
/* /*
$Id: win32_ioctl.c,v 1.3 2004/05/10 03:28:57 rocky Exp $ $Id: win32_ioctl.c,v 1.4 2004/06/20 15:06:42 rocky Exp $
Copyright (C) 2004 Rocky Bernstein <rocky@panix.com> Copyright (C) 2004 Rocky Bernstein <rocky@panix.com>
@@ -26,7 +26,7 @@
# include "config.h" # include "config.h"
#endif #endif
static const char _rcsid[] = "$Id: win32_ioctl.c,v 1.3 2004/05/10 03:28:57 rocky Exp $"; static const char _rcsid[] = "$Id: win32_ioctl.c,v 1.4 2004/06/20 15:06:42 rocky Exp $";
#include <cdio/cdio.h> #include <cdio/cdio.h>
#include <cdio/sector.h> #include <cdio/sector.h>
@@ -135,7 +135,7 @@ typedef struct _SUB_Q_MEDIA_CATALOG_NUMBER {
*/ */
const char * const char *
win32ioctl_is_cdrom(const char c_drive_letter) is_cdrom_win32ioctl(const char c_drive_letter)
{ {
UINT uDriveType; UINT uDriveType;
@@ -165,7 +165,7 @@ win32ioctl_is_cdrom(const char c_drive_letter)
starting from lsn. Returns 0 if no error. starting from lsn. Returns 0 if no error.
*/ */
int int
win32ioctl_read_audio_sectors (_img_private_t *env, void *data, lsn_t lsn, read_audio_sectors_win32ioctl (_img_private_t *env, void *data, lsn_t lsn,
unsigned int nblocks) unsigned int nblocks)
{ {
DWORD dwBytesReturned; DWORD dwBytesReturned;
@@ -193,7 +193,7 @@ win32ioctl_read_audio_sectors (_img_private_t *env, void *data, lsn_t lsn,
data starting from lsn. Returns 0 if no error. data starting from lsn. Returns 0 if no error.
*/ */
static int static int
win32ioctl_read_raw_sector (_img_private_t *env, void *buf, lsn_t lsn) read_raw_sector (const _img_private_t *env, void *buf, lsn_t lsn)
{ {
SCSI_PASS_THROUGH_DIRECT sptd; SCSI_PASS_THROUGH_DIRECT sptd;
BOOL success; BOOL success;
@@ -249,17 +249,17 @@ win32ioctl_read_raw_sector (_img_private_t *env, void *buf, lsn_t lsn)
data starting from lsn. Returns 0 if no error. data starting from lsn. Returns 0 if no error.
*/ */
int int
win32ioctl_read_mode2_sector (_img_private_t *env, void *data, lsn_t lsn, read_mode2_sector_win32ioctl (const _img_private_t *env, void *data,
bool mode2_form2) lsn_t lsn, bool b_form2)
{ {
char buf[CDIO_CD_FRAMESIZE_RAW] = { 0, }; char buf[CDIO_CD_FRAMESIZE_RAW] = { 0, };
int ret = win32ioctl_read_raw_sector (env, buf, lsn); int ret = read_raw_sector (env, buf, lsn);
if ( 0 != ret) return ret; if ( 0 != ret) return ret;
memcpy (data, memcpy (data,
buf + CDIO_CD_SYNC_SIZE + CDIO_CD_XA_HEADER, buf + CDIO_CD_SYNC_SIZE + CDIO_CD_XA_HEADER,
mode2_form2 ? M2RAW_SECTOR_SIZE: CDIO_CD_FRAMESIZE); b_form2 ? M2RAW_SECTOR_SIZE: CDIO_CD_FRAMESIZE);
return 0; return 0;
@@ -270,17 +270,17 @@ win32ioctl_read_mode2_sector (_img_private_t *env, void *data, lsn_t lsn,
data starting from lsn. Returns 0 if no error. data starting from lsn. Returns 0 if no error.
*/ */
int int
win32ioctl_read_mode1_sector (_img_private_t *env, void *data, lsn_t lsn, read_mode1_sector_win32ioctl (const _img_private_t *env, void *data,
bool mode2_form2) lsn_t lsn, bool b_form2)
{ {
char buf[CDIO_CD_FRAMESIZE_RAW] = { 0, }; char buf[CDIO_CD_FRAMESIZE_RAW] = { 0, };
int ret = win32ioctl_read_raw_sector (env, buf, lsn); int ret = read_raw_sector (env, buf, lsn);
if ( 0 != ret) return ret; if ( 0 != ret) return ret;
memcpy (data, memcpy (data,
buf + CDIO_CD_SYNC_SIZE+CDIO_CD_HEADER_SIZE, buf + CDIO_CD_SYNC_SIZE+CDIO_CD_HEADER_SIZE,
mode2_form2 ? M2RAW_SECTOR_SIZE: CDIO_CD_FRAMESIZE); b_form2 ? M2RAW_SECTOR_SIZE: CDIO_CD_FRAMESIZE);
return 0; return 0;
@@ -290,7 +290,7 @@ win32ioctl_read_mode1_sector (_img_private_t *env, void *data, lsn_t lsn,
Initialize internal structures for CD device. Initialize internal structures for CD device.
*/ */
bool bool
win32ioctl_init_win32 (_img_private_t *env) init_win32ioctl (_img_private_t *env)
{ {
char psz_win32_drive[7]; char psz_win32_drive[7];
unsigned int len=strlen(env->gen.source_name); unsigned int len=strlen(env->gen.source_name);
@@ -346,7 +346,7 @@ win32ioctl_init_win32 (_img_private_t *env)
Return true if successful or false if an error. Return true if successful or false if an error.
*/ */
bool bool
win32ioctl_read_toc (_img_private_t *env) read_toc_win32ioctl (_img_private_t *env)
{ {
DWORD dwBytesReturned; DWORD dwBytesReturned;
@@ -361,7 +361,7 @@ win32ioctl_read_toc (_img_private_t *env)
return false; return false;
} }
env->first_track_num = cdrom_toc.FirstTrack; env->i_first_track = cdrom_toc.FirstTrack;
env->total_tracks = cdrom_toc.LastTrack - cdrom_toc.FirstTrack + 1; env->total_tracks = cdrom_toc.LastTrack - cdrom_toc.FirstTrack + 1;
@@ -387,7 +387,7 @@ win32ioctl_read_toc (_img_private_t *env)
*/ */
char * char *
win32ioctl_get_mcn (const _img_private_t *env) { get_mcn_win32ioctl (const _img_private_t *env) {
DWORD dwBytesReturned; DWORD dwBytesReturned;
SUB_Q_MEDIA_CATALOG_NUMBER mcn; SUB_Q_MEDIA_CATALOG_NUMBER mcn;
@@ -414,15 +414,15 @@ win32ioctl_get_mcn (const _img_private_t *env) {
Get the format (XA, DATA, AUDIO) of a track. Get the format (XA, DATA, AUDIO) of a track.
*/ */
track_format_t track_format_t
win32ioctl_get_track_format(_img_private_t *env, track_t track_num) get_track_format_win32ioctl(const _img_private_t *env, track_t i_track)
{ {
/* This is pretty much copied from the "badly broken" cdrom_count_tracks /* This is pretty much copied from the "badly broken" cdrom_count_tracks
in linux/cdrom.c. in linux/cdrom.c.
*/ */
if (env->tocent[track_num-1].Control & 0x04) { if (env->tocent[i_track - env->i_first_track].Control & 0x04) {
if (env->tocent[track_num-1].Format == 0x10) if (env->tocent[i_track - env->i_first_track].Format == 0x10)
return TRACK_FORMAT_CDI; return TRACK_FORMAT_CDI;
else if (env->tocent[track_num-1].Format == 0x20) else if (env->tocent[i_track - env->i_first_track].Format == 0x20)
return TRACK_FORMAT_XA; return TRACK_FORMAT_XA;
else else
return TRACK_FORMAT_DATA; return TRACK_FORMAT_DATA;
@@ -439,9 +439,8 @@ win32ioctl_get_track_format(_img_private_t *env, track_t track_num)
*/ */
cdio_drive_cap_t cdio_drive_cap_t
win32ioctl_get_drive_cap (const void *env) get_drive_cap_win32ioctl (const _img_private_t *env)
{ {
const _img_private_t *_obj = env;
int32_t i_drivetype = 0; int32_t i_drivetype = 0;
SCSI_PASS_THROUGH_WITH_BUFFERS sptwb; SCSI_PASS_THROUGH_WITH_BUFFERS sptwb;
ULONG returned = 0; ULONG returned = 0;
@@ -477,7 +476,7 @@ win32ioctl_get_drive_cap (const void *env)
length = offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS,DataBuf) + length = offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS,DataBuf) +
sptwb.Spt.DataTransferLength; sptwb.Spt.DataTransferLength;
if ( DeviceIoControl(_obj->h_device_handle, if ( DeviceIoControl(env->h_device_handle,
IOCTL_SCSI_PASS_THROUGH, IOCTL_SCSI_PASS_THROUGH,
&sptwb, &sptwb,
sizeof(SCSI_PASS_THROUGH), sizeof(SCSI_PASS_THROUGH),