Move more of IoControl out of _win_32 and into win32ioctl.
This commit is contained in:
@@ -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 <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: _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 <cdio/cdio.h>
|
#include <cdio/cdio.h>
|
||||||
#include <cdio/sector.h>
|
#include <cdio/sector.h>
|
||||||
@@ -251,41 +251,49 @@ _cdio_init_win32 (void *user_data)
|
|||||||
for( i = 0; i < i_num_adapters; i++ ) {
|
for( i = 0; i < i_num_adapters; i++ ) {
|
||||||
for( j = 0; j < 15; j++ ) {
|
for( j = 0; j < 15; j++ ) {
|
||||||
struct SRB_GetDiskInfo srbDiskInfo;
|
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;
|
lpSendCommand( (void*) &srbDiskInfo );
|
||||||
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;
|
|
||||||
|
|
||||||
memset( &srbGDEVBlock, 0, sizeof(struct SRB_GDEVBlock) );
|
if( (srbDiskInfo.SRB_Status == SS_COMP) ) {
|
||||||
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;
|
if (srbDiskInfo.SRB_Int13HDriveInfo != c_drive)
|
||||||
} else {
|
{
|
||||||
FreeLibrary( hASPI );
|
continue;
|
||||||
cdio_debug( "%c: is not a CD-ROM drive",
|
} else {
|
||||||
_obj->gen.source_name[0] );
|
/* Make sure this is a cdrom device */
|
||||||
return false;
|
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 {
|
} else {
|
||||||
/* This is pretty much copied from the "badly broken" cdrom_count_tracks
|
return win32ioctl_get_track_format(_obj, track_num);
|
||||||
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 TRACK_FORMAT_ERROR;
|
return TRACK_FORMAT_ERROR;
|
||||||
|
|||||||
@@ -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 <rocky@panix.com>
|
Copyright (C) 2004 Rocky Bernstein <rocky@panix.com>
|
||||||
|
|
||||||
@@ -75,3 +75,8 @@ bool win32ioctl_read_toc (_img_private_t *env);
|
|||||||
|
|
||||||
char *win32ioctl_get_mcn (_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);
|
||||||
|
|||||||
@@ -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 <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: 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 <cdio/cdio.h>
|
#include <cdio/cdio.h>
|
||||||
#include <cdio/sector.h>
|
#include <cdio/sector.h>
|
||||||
@@ -247,18 +247,36 @@ win32ioctl_init_win32 (_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);
|
||||||
|
OSVERSIONINFO ov;
|
||||||
|
DWORD dwFlags;
|
||||||
|
|
||||||
cdio_debug("using winNT/2K/XP ioctl layer");
|
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)) {
|
if (cdio_is_device_win32(env->gen.source_name)) {
|
||||||
sprintf( psz_win32_drive, "\\\\.\\%c:", env->gen.source_name[len-2] );
|
sprintf( psz_win32_drive, "\\\\.\\%c:", env->gen.source_name[len-2] );
|
||||||
|
|
||||||
env->h_device_handle = CreateFile( psz_win32_drive, GENERIC_READ,
|
env->h_device_handle = CreateFile( psz_win32_drive, dwFlags,
|
||||||
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
FILE_SHARE_READ, NULL, OPEN_EXISTING,
|
||||||
NULL, OPEN_EXISTING,
|
0, NULL );
|
||||||
FILE_FLAG_NO_BUFFERING |
|
if( env->h_device_handle == INVALID_HANDLE_VALUE )
|
||||||
FILE_FLAG_RANDOM_ACCESS, NULL );
|
{
|
||||||
return (env->h_device_handle == NULL) ? false : true;
|
/* 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;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -335,4 +353,25 @@ win32ioctl_get_mcn (_img_private_t *env) {
|
|||||||
return NULL;
|
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*/
|
#endif /*HAVE_WIN32_CDROM*/
|
||||||
|
|||||||
Reference in New Issue
Block a user