⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aspi32.c

📁 linux下的MPEG1
💻 C
📖 第 1 页 / 共 2 页
字号:
/*    $Id: aspi32.c,v 1.2 2005/01/01 02:43:58 rockyb Exp $    Copyright (C) 2004 Rocky Bernstein <rocky@panix.com>    This program is free software; you can redistribute it and/or modify    it under the terms of the GNU General Public License as published by    the Free Software Foundation; either version 2 of the License, or    (at your option) any later version.    This program is distributed in the hope that it will be useful,    but WITHOUT ANY WARRANTY; without even the implied warranty of    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    GNU General Public License for more details.    You should have received a copy of the GNU General Public License    along with this program; if not, write to the Free Software    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA*//* This file contains Win32-specific code and implements low-level    control of the CD drive via the ASPI API.   Inspired by vlc's cdrom.h code */#ifdef HAVE_CONFIG_H # include "config.h"#endifstatic const char _rcsid[] = "$Id: aspi32.c,v 1.2 2005/01/01 02:43:58 rockyb Exp $";#include <cdio/cdio.h>#include <cdio/sector.h>#include <cdio/util.h>#include <cdio/scsi_mmc.h>#include "cdio_assert.h"#include <string.h>#ifdef HAVE_WIN32_CDROM#include <ctype.h>#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <unistd.h>#include <fcntl.h>#include <windows.h>#include "win32.h"#include <sys/stat.h>#include <sys/types.h>#include "aspi32.h"#include "cdtext_private.h"/* Amount of time we are willing to wait for an operation to complete.   10 seconds? */#define OP_TIMEOUT_MS 10000static const char *aspierror(int nErrorCode) {  switch (nErrorCode)    {    case SS_PENDING:      return "SRB being processed";      break;    case SS_COMP:      return "SRB completed without error";      break;    case SS_ABORTED:      return "SRB aborted";      break;    case SS_ABORT_FAIL:      return "Unable to abort SRB";      break;    case SS_ERR:      return "SRB completed with error";      break;    case SS_INVALID_CMD:      return "Invalid ASPI command";      break;    case SS_INVALID_HA:      return "Invalid host adapter number";      break;    case SS_NO_DEVICE:      return "SCSI device not installed";      break;    case SS_INVALID_SRB:      return "Invalid parameter set in SRB";      break;    case SS_OLD_MANAGER:      return "ASPI manager doesn't support";      break;    case SS_ILLEGAL_MODE:      return "Unsupported MS Windows mode";      break;    case SS_NO_ASPI:      return "No ASPI managers";      break;    case SS_FAILED_INIT:      return "ASPI for windows failed init";      break;    case SS_ASPI_IS_BUSY:      return "No resources available to execute command.";      break;    case SS_BUFFER_TOO_BIG:      return "Buffer size is too big to handle.";      break;    case SS_MISMATCHED_COMPONENTS:      return "The DLLs/EXEs of ASPI don't version check";      break;    case SS_NO_ADAPTERS:      return "No host adapters found";      break;    case SS_INSUFFICIENT_RESOURCES:      return "Couldn't allocate resources needed to init";      break;    case SS_ASPI_IS_SHUTDOWN:      return "Call came to ASPI after PROCESS_DETACH";      break;    case SS_BAD_INSTALL:      return "The DLL or other components are installed wrong.";      break;    default:       return "Unknown ASPI error.";    }}/* General ioctl() CD-ROM command function */static bool mciSendCommand_aspi(int id, UINT msg, DWORD flags, void *arg){  MCIERROR mci_error;    mci_error = mciSendCommand(id, msg, flags, (DWORD)arg);  if ( mci_error ) {    char error[256];        mciGetErrorString(mci_error, error, 256);    cdio_warn("mciSendCommand() error: %s", error);  }  return(mci_error == 0);}/*  See if the ASPI DLL is loadable. If so pointers are returned  and we return true. Return false if there was a problem. */static boolhave_aspi( HMODULE *hASPI, 	   long (**lpGetSupport)( void ), 	   long (**lpSendCommand)( void* ) ){  /* check if aspi is available */  *hASPI = LoadLibrary( "wnaspi32.dll" );  if( *hASPI == NULL ) {    cdio_debug("Unable to load ASPI DLL");    return false;  }  (FARPROC) *lpGetSupport = GetProcAddress( *hASPI,					    "GetASPI32SupportInfo" );  (FARPROC) *lpSendCommand = GetProcAddress( *hASPI,					     "SendASPI32Command" );    /* make sure that we've got both function addresses */  if( *lpGetSupport == NULL || *lpSendCommand == NULL ) {    cdio_debug("Unable to get ASPI function pointers");    FreeLibrary( *hASPI );    return false;  }  return true;}/*!   Get disc type associated with cd object.*/discmode_tget_discmode_aspi (_img_private_t *p_env){  track_t i_track;  discmode_t discmode=CDIO_DISC_MODE_NO_INFO;  /* See if this is a DVD. */  cdio_dvd_struct_t dvd;  /* DVD READ STRUCT for layer 0. */  dvd.physical.type = CDIO_DVD_STRUCT_PHYSICAL;  dvd.physical.layer_num = 0;  if (0 == scsi_mmc_get_dvd_struct_physical_private (p_env, 						     &run_scsi_cmd_aspi,						     &dvd)) {    switch(dvd.physical.layer[0].book_type) {    case CDIO_DVD_BOOK_DVD_ROM:  return CDIO_DISC_MODE_DVD_ROM;    case CDIO_DVD_BOOK_DVD_RAM:  return CDIO_DISC_MODE_DVD_RAM;    case CDIO_DVD_BOOK_DVD_R:    return CDIO_DISC_MODE_DVD_R;    case CDIO_DVD_BOOK_DVD_RW:   return CDIO_DISC_MODE_DVD_RW;    case CDIO_DVD_BOOK_DVD_PR:   return CDIO_DISC_MODE_DVD_PR;    case CDIO_DVD_BOOK_DVD_PRW:  return CDIO_DISC_MODE_DVD_PRW;    default: return CDIO_DISC_MODE_DVD_OTHER;    }  }  if (!p_env->gen.toc_init)     read_toc_aspi (p_env);  if (!p_env->gen.toc_init)     return CDIO_DISC_MODE_NO_INFO;  for (i_track = p_env->gen.i_first_track;        i_track < p_env->gen.i_first_track + p_env->gen.i_tracks ;        i_track ++) {    track_format_t track_fmt=get_track_format_aspi(p_env, i_track);    switch(track_fmt) {    case TRACK_FORMAT_AUDIO:      switch(discmode) {	case CDIO_DISC_MODE_NO_INFO:	  discmode = CDIO_DISC_MODE_CD_DA;	  break;	case CDIO_DISC_MODE_CD_DA:	case CDIO_DISC_MODE_CD_MIXED: 	case CDIO_DISC_MODE_ERROR: 	  /* No change*/	  break;      default:	  discmode = CDIO_DISC_MODE_CD_MIXED;      }      break;    case TRACK_FORMAT_XA:      switch(discmode) {	case CDIO_DISC_MODE_NO_INFO:	  discmode = CDIO_DISC_MODE_CD_XA;	  break;	case CDIO_DISC_MODE_CD_XA:	case CDIO_DISC_MODE_CD_MIXED: 	case CDIO_DISC_MODE_ERROR: 	  /* No change*/	  break;      default:	discmode = CDIO_DISC_MODE_CD_MIXED;      }      break;    case TRACK_FORMAT_DATA:      switch(discmode) {	case CDIO_DISC_MODE_NO_INFO:	  discmode = CDIO_DISC_MODE_CD_DATA;	  break;	case CDIO_DISC_MODE_CD_DATA:	case CDIO_DISC_MODE_CD_MIXED: 	case CDIO_DISC_MODE_ERROR: 	  /* No change*/	  break;      default:	discmode = CDIO_DISC_MODE_CD_MIXED;      }      break;    case TRACK_FORMAT_ERROR:    default:      discmode = CDIO_DISC_MODE_ERROR;    }  }  return discmode;}const char *is_cdrom_aspi(const char drive_letter) {  static char psz_win32_drive[7];  HMODULE hASPI = NULL;  long (*lpGetSupport)( void ) = NULL;  long (*lpSendCommand)( void* ) = NULL;  DWORD dwSupportInfo;  int i_adapter, i_hostadapters;  char c_drive;  int i_rc;  if ( !have_aspi(&hASPI, &lpGetSupport, &lpSendCommand) )    return NULL;  /* ASPI support seems to be there. */    dwSupportInfo = lpGetSupport();  i_rc = HIBYTE( LOWORD ( dwSupportInfo ) );  if( SS_COMP != i_rc ) {    cdio_debug("ASPI: %s", aspierror(i_rc));    FreeLibrary( hASPI );    return NULL;  }    i_hostadapters = LOBYTE( LOWORD( dwSupportInfo ) );  if( i_hostadapters == 0 ) {    FreeLibrary( hASPI );    return NULL;  }    c_drive = toupper(drive_letter) - 'A';    for( i_adapter = 0; i_adapter < i_hostadapters; i_adapter++ ) {    struct SRB_GetDiskInfo srbDiskInfo;    int i_target;    SRB_HAInquiry srbInquiry;        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_Flags       = 0;	    srbDiskInfo.SRB_Hdr_Rsvd    = 0;	    srbDiskInfo.SRB_HaId        = i_adapter;	    srbDiskInfo.SRB_Target      = i_target;	    srbDiskInfo.SRB_Lun         = i_lun;	    	    lpSendCommand( (void*) &srbDiskInfo );	    	    if( (srbDiskInfo.SRB_Status == SS_COMP) &&		(srbDiskInfo.SRB_Int13HDriveInfo == c_drive) ) {	      /* Make sure this is a CD-ROM device. */	      struct SRB_GDEVBlock   srbGDEVBlock;	      	      memset( &srbGDEVBlock, 0, sizeof(struct SRB_GDEVBlock) );	      srbGDEVBlock.SRB_Cmd    = SC_GET_DEV_TYPE;	      srbDiskInfo.SRB_HaId    = i_adapter;	      srbGDEVBlock.SRB_Target = i_target;	      srbGDEVBlock.SRB_Lun    = i_lun;	      	      lpSendCommand( (void*) &srbGDEVBlock );	      	      if( ( srbGDEVBlock.SRB_Status == SS_COMP ) &&		  ( srbGDEVBlock.SRB_DeviceType == DTYPE_CDROM ) ) {		sprintf( psz_win32_drive, "%c:", drive_letter );		FreeLibrary( hASPI );		return(psz_win32_drive);	      }	    }	  }      }  }  FreeLibrary( hASPI );  return NULL;}/*!  Initialize CD device. */boolinit_aspi (_img_private_t *env){  HMODULE hASPI = NULL;  long (*lpGetSupport)( void ) = NULL;  long (*lpSendCommand)( void* ) = NULL;  DWORD dwSupportInfo;  int i_adapter, i_hostadapters;  char c_drive;  int i_rc;  if (2 == strlen(env->gen.source_name) && isalpha(env->gen.source_name[0]) )   {    c_drive = env->gen.source_name[0];  } else if ( 6 == strlen(env->gen.source_name) 	      && isalpha(env->gen.source_name[4] )) {    c_drive = env->gen.source_name[4];  } else {    c_drive = 'C';  }    if ( !have_aspi(&hASPI, &lpGetSupport, &lpSendCommand) )    return false;  /* ASPI support seems to be there. */    dwSupportInfo = lpGetSupport();    i_rc = HIBYTE( LOWORD ( dwSupportInfo ) );  if( SS_COMP != i_rc ) {    cdio_info("ASPI: %s", aspierror(i_rc));    FreeLibrary( hASPI );    return false;  }    i_hostadapters = LOBYTE( LOWORD( dwSupportInfo ) );  if( i_hostadapters == 0 ) {    FreeLibrary( hASPI );    return false;  }  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -