diff --git a/lib/_cdio_win32.c b/lib/_cdio_win32.c index 228246be..c87a649c 100644 --- a/lib/_cdio_win32.c +++ b/lib/_cdio_win32.c @@ -1,5 +1,5 @@ /* - $Id: _cdio_win32.c,v 1.23 2004/02/04 11:08:10 rocky Exp $ + $Id: _cdio_win32.c,v 1.24 2004/02/05 03:02:16 rocky Exp $ Copyright (C) 2003, 2004 Rocky Bernstein @@ -26,7 +26,7 @@ # include "config.h" #endif -static const char _rcsid[] = "$Id: _cdio_win32.c,v 1.23 2004/02/04 11:08:10 rocky Exp $"; +static const char _rcsid[] = "$Id: _cdio_win32.c,v 1.24 2004/02/05 03:02:16 rocky Exp $"; #include #include @@ -251,41 +251,49 @@ _cdio_init_win32 (void *user_data) for( i = 0; i < i_num_adapters; i++ ) { for( j = 0; j < 15; j++ ) { struct SRB_GetDiskInfo srbDiskInfo; + int lun; + + for (lun = 0; lun < 8; lun++ ) { + srbDiskInfo.SRB_Cmd = SC_GET_DISK_INFO; + srbDiskInfo.SRB_HaId = i; + srbDiskInfo.SRB_Flags = 0; + srbDiskInfo.SRB_Hdr_Rsvd = 0; + srbDiskInfo.SRB_Target = j; + srbDiskInfo.SRB_Lun = lun; - srbDiskInfo.SRB_Cmd = SC_GET_DISK_INFO; - srbDiskInfo.SRB_HaId = i; - srbDiskInfo.SRB_Flags = 0; - srbDiskInfo.SRB_Hdr_Rsvd = 0; - srbDiskInfo.SRB_Target = j; - srbDiskInfo.SRB_Lun = 0; - - lpSendCommand( (void*) &srbDiskInfo ); - - if( (srbDiskInfo.SRB_Status == SS_COMP) && - (srbDiskInfo.SRB_Int13HDriveInfo == c_drive) ) { - /* Make sure this is a cdrom device */ - struct SRB_GDEVBlock srbGDEVBlock; + lpSendCommand( (void*) &srbDiskInfo ); - memset( &srbGDEVBlock, 0, sizeof(struct SRB_GDEVBlock) ); - srbGDEVBlock.SRB_Cmd = SC_GET_DEV_TYPE; - srbGDEVBlock.SRB_HaId = i; - srbGDEVBlock.SRB_Target = j; - - lpSendCommand( (void*) &srbGDEVBlock ); - - if( ( srbGDEVBlock.SRB_Status == SS_COMP ) && - ( srbGDEVBlock.SRB_DeviceType == DTYPE_CDROM ) ) { - _obj->i_sid = MAKEWORD( i, j ); - _obj->hASPI = (long)hASPI; - _obj->lpSendCommand = lpSendCommand; - cdio_debug("Using ASPI layer"); + if( (srbDiskInfo.SRB_Status == SS_COMP) ) { - return true; - } else { - FreeLibrary( hASPI ); - cdio_debug( "%c: is not a CD-ROM drive", - _obj->gen.source_name[0] ); - return false; + if (srbDiskInfo.SRB_Int13HDriveInfo != c_drive) + { + continue; + } else { + /* Make sure this is a cdrom device */ + struct SRB_GDEVBlock srbGDEVBlock; + + memset( &srbGDEVBlock, 0, sizeof(struct SRB_GDEVBlock) ); + srbGDEVBlock.SRB_Cmd = SC_GET_DEV_TYPE; + srbGDEVBlock.SRB_HaId = i; + srbGDEVBlock.SRB_Target = j; + + lpSendCommand( (void*) &srbGDEVBlock ); + + if( ( srbGDEVBlock.SRB_Status == SS_COMP ) && + ( srbGDEVBlock.SRB_DeviceType == DTYPE_CDROM ) ) { + _obj->i_sid = MAKEWORD( i, j ); + _obj->hASPI = (long)hASPI; + _obj->lpSendCommand = lpSendCommand; + cdio_debug("Using ASPI layer"); + + return true; + } else { + FreeLibrary( hASPI ); + cdio_debug( "%c: is not a CD-ROM drive", + _obj->gen.source_name[0] ); + return false; + } + } } } } @@ -800,18 +808,7 @@ _cdio_get_track_format(void *env, track_t track_num) } } } else { - /* This is pretty much copied from the "badly broken" cdrom_count_tracks - in linux/cdrom.c. - */ - if (_obj->tocent[track_num-1].Control & 0x04) { - if (_obj->tocent[track_num-1].Format == 0x10) - return TRACK_FORMAT_CDI; - else if (_obj->tocent[track_num-1].Format == 0x20) - return TRACK_FORMAT_XA; - else - return TRACK_FORMAT_DATA; - } else - return TRACK_FORMAT_AUDIO; + return win32ioctl_get_track_format(_obj, track_num); } return TRACK_FORMAT_ERROR; diff --git a/lib/_cdio_win32.h b/lib/_cdio_win32.h index aa6dbf4c..9fb12bff 100644 --- a/lib/_cdio_win32.h +++ b/lib/_cdio_win32.h @@ -1,5 +1,5 @@ /* - $Id: _cdio_win32.h,v 1.2 2004/02/04 11:08:10 rocky Exp $ + $Id: _cdio_win32.h,v 1.3 2004/02/05 03:02:16 rocky Exp $ Copyright (C) 2004 Rocky Bernstein @@ -75,3 +75,8 @@ bool win32ioctl_read_toc (_img_private_t *env); char *win32ioctl_get_mcn (_img_private_t *env); +/*! + Get the format (XA, DATA, AUDIO) of a track. +*/ +track_format_t win32ioctl_get_track_format(_img_private_t *env, + track_t track_num); diff --git a/lib/win32ioctl.c b/lib/win32ioctl.c index 4c6d89c7..11102f45 100644 --- a/lib/win32ioctl.c +++ b/lib/win32ioctl.c @@ -1,5 +1,5 @@ /* - $Id: win32ioctl.c,v 1.2 2004/02/04 11:08:10 rocky Exp $ + $Id: win32ioctl.c,v 1.3 2004/02/05 03:02:16 rocky Exp $ Copyright (C) 2004 Rocky Bernstein @@ -26,7 +26,7 @@ # include "config.h" #endif -static const char _rcsid[] = "$Id: win32ioctl.c,v 1.2 2004/02/04 11:08:10 rocky Exp $"; +static const char _rcsid[] = "$Id: win32ioctl.c,v 1.3 2004/02/05 03:02:16 rocky Exp $"; #include #include @@ -247,18 +247,36 @@ win32ioctl_init_win32 (_img_private_t *env) { char psz_win32_drive[7]; unsigned int len=strlen(env->gen.source_name); + OSVERSIONINFO ov; + DWORD dwFlags; cdio_debug("using winNT/2K/XP ioctl layer"); + memset(&ov,0,sizeof(OSVERSIONINFO)); + ov.dwOSVersionInfoSize=sizeof(OSVERSIONINFO); + GetVersionEx(&ov); + + if((ov.dwPlatformId==VER_PLATFORM_WIN32_NT) && + (ov.dwMajorVersion>4)) + dwFlags = GENERIC_READ|GENERIC_WRITE; /* add gen write on W2k/XP */ + else dwFlags = GENERIC_READ; + if (cdio_is_device_win32(env->gen.source_name)) { sprintf( psz_win32_drive, "\\\\.\\%c:", env->gen.source_name[len-2] ); - env->h_device_handle = CreateFile( psz_win32_drive, GENERIC_READ, - FILE_SHARE_READ | FILE_SHARE_WRITE, - NULL, OPEN_EXISTING, - FILE_FLAG_NO_BUFFERING | - FILE_FLAG_RANDOM_ACCESS, NULL ); - return (env->h_device_handle == NULL) ? false : true; + env->h_device_handle = CreateFile( psz_win32_drive, dwFlags, + FILE_SHARE_READ, NULL, OPEN_EXISTING, + 0, NULL ); + if( env->h_device_handle == INVALID_HANDLE_VALUE ) + { + /* No good. try toggle write. */ + dwFlags ^= GENERIC_WRITE; + env->h_device_handle = CreateFile( psz_win32_drive, dwFlags, + FILE_SHARE_READ, NULL, + OPEN_EXISTING, 0, NULL ); + return (env->h_device_handle == NULL) ? false : true; + } + return true; } return false; } @@ -335,4 +353,25 @@ win32ioctl_get_mcn (_img_private_t *env) { return NULL; } +/*! + Get the format (XA, DATA, AUDIO) of a track. +*/ +track_format_t +win32ioctl_get_track_format(_img_private_t *env, track_t track_num) +{ + /* This is pretty much copied from the "badly broken" cdrom_count_tracks + in linux/cdrom.c. + */ + if (env->tocent[track_num-1].Control & 0x04) { + if (env->tocent[track_num-1].Format == 0x10) + return TRACK_FORMAT_CDI; + else if (env->tocent[track_num-1].Format == 0x20) + return TRACK_FORMAT_XA; + else + return TRACK_FORMAT_DATA; + } else + return TRACK_FORMAT_AUDIO; +} + + #endif /*HAVE_WIN32_CDROM*/