Exemplo n.º 1
0
Arquivo: readd4.c Projeto: pulsa/t.hex
/***************************************************************************
 * readCDAudioLBA_D4
 ***************************************************************************/
DWORD d4_1ModeSelect( HCDROM hCD )
{
  DWORD dwStatus;
  HANDLE heventSRB;
  SRB_ExecSCSICmd s;
  int idx = (int)hCD - 1;
  BYTE buf[12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x09, 0x30 };

  if ( (idx<0) || (idx>=MAXCDHAND) || !cdHandles[idx].used )
    {
      alErrCode = ALERR_INVHANDLE;
      return SS_ERR;
    }

  dwStatus = WaitForSingleObject( cdMutexes[idx], TIMEOUT );
  if ( dwStatus != WAIT_OBJECT_0 )
    {
      alErrCode = ALERR_LOCK;
      return SS_ERR;
    }

  memset( &s, 0, sizeof(s) );
  heventSRB = CreateEvent( NULL, TRUE, FALSE, NULL );
  s.SRB_Cmd        = SC_EXEC_SCSI_CMD;
  s.SRB_HaID       = cdHandles[idx].ha;
  s.SRB_Target     = cdHandles[idx].tgt;
  s.SRB_Lun        = cdHandles[idx].lun;
  s.SRB_Flags      = SRB_EVENT_NOTIFY;
  s.SRB_PostProc   = (LPVOID)heventSRB;
  s.SRB_SenseLen   = SENSE_LEN;
  s.SRB_CDBLen     = 6;
  s.SRB_BufLen     = 12;
  s.SRB_BufPointer = buf;
  s.CDBByte[0]     = 0x15;
  s.CDBByte[1]     = 0x10;
  s.CDBByte[4]     = 0x08;

  ResetEvent( heventSRB );
  dwStatus = pfnSendASPI32Command( (LPSRB)&s );
  if ( dwStatus == SS_PENDING )
    WaitForSingleObject( heventSRB, DEFWAITLEN );
  CloseHandle( heventSRB );

  if ( s.SRB_Status != SS_COMP )
    {
      alErrCode = ALERR_ASPI;
      alAspiErr = s.SRB_Status;
      return SS_ERR;
    }

  return SS_COMP;
}
Exemplo n.º 2
0
Arquivo: atapi.c Projeto: cdfmr/ezmp3c
/***************************************************************************
 * readCDAudioLBA_ATAPI
 ***************************************************************************/
DWORD readCDAudioLBA_ATAPI( HCDROM hCD, LPTRACKBUF t )
{
  DWORD dwStatus;
  HANDLE heventSRB;
  SRB_ExecSCSICmd s;
  int idx = (int)hCD - 1;

  if ( (idx<0) || (idx>=MAXCDHAND) || !cdHandles[idx].used )
    {
      alErrCode = ALERR_INVHANDLE;
      return SS_ERR;
    }


  if ( t->numFrames * 2352 > t->maxLen )
    {
      alErrCode = ALERR_BUFTOOSMALL;
      return SS_ERR;
    }

  dwStatus = WaitForSingleObject( cdMutexes[idx], TIMEOUT );
  if ( dwStatus != WAIT_OBJECT_0 )
    {
      alErrCode = ALERR_LOCK;
      return SS_ERR;
    }

#ifdef AKRIP_DEBUG
  dbprintf( "akrip32: readCDAudioLBA_ATAPI: (%d:%d:%d) %06X:%02X", 
	    cdHandles[idx].ha, cdHandles[idx].tgt, cdHandles[idx].lun,
	    t->startFrame, t->numFrames );
#endif

  heventSRB = CreateEvent( NULL, TRUE, FALSE, NULL );

  memset( &s, 0, sizeof( s ) );
  s.SRB_Cmd        = SC_EXEC_SCSI_CMD;
  s.SRB_HaID       = cdHandles[idx].ha;
  s.SRB_Target     = cdHandles[idx].tgt;
  s.SRB_Lun        = cdHandles[idx].lun;
  s.SRB_Flags      = SRB_DIR_IN | SRB_EVENT_NOTIFY;
  s.SRB_BufLen     = t->maxLen;
  s.SRB_BufPointer = &(t->buf[0]);
  s.SRB_SenseLen   = SENSE_LEN;
  s.SRB_CDBLen     = 12;
  s.SRB_PostProc   = (LPVOID)heventSRB;
  s.CDBByte[0]     = 0xBE;
  //s.CDBByte[1]     = 0x04;
  s.CDBByte[3]     = (BYTE)((t->startFrame >> 16) & 0xFF);
  s.CDBByte[4]     = (BYTE)((t->startFrame >> 8) & 0xFF);
  s.CDBByte[5]     = (BYTE)(t->startFrame & 0xFF);
  s.CDBByte[8]     = (BYTE)(t->numFrames & 0xFF);
  s.CDBByte[9]     = (cdHandles[idx].readType==CDR_ATAPI1)?0x10:0xF0;

  ResetEvent( heventSRB );
  dwStatus = pfnSendASPI32Command( (LPSRB)&s );
  if ( dwStatus == SS_PENDING )
    {
      WaitForSingleObject( heventSRB, DEFWAITLEN );
    }
  CloseHandle( heventSRB );

  if ( s.SRB_Status != SS_COMP )
    {
#ifdef AKRIP_DEBUG
      BYTE *p;
      dbprintf( "akrip32: readCDAudioLBA_ATAPI: ERROR! 0x%08X\n", s.SRB_Status );
      dbprintf( "akrip32:  haStat == %d (0x%04X), tgtStat == %d (0x%04X)",
	       s.SRB_HaStat, s.SRB_HaStat, s.SRB_TargStat, s.SRB_TargStat );
      p = s.SenseArea;
      dbprintf( "  %02X %02X %02X %02X %02X %02X %02X %02X",
	       p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7] );
      p = &(s.SenseArea[8]);
      dbprintf( "  %02X %02X %02X %02X %02X %02X %02X %02X",
	       p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7] );
#endif
      alErrCode = ALERR_ASPI;
      alAspiErr = s.SRB_Status;
      ReleaseMutex( cdMutexes[idx] );
      return SS_ERR;
    }

  t->len = t->numFrames * 2352;
  t->startOffset = 0;
  t->status = s.SRB_Status;

  ReleaseMutex( cdMutexes[idx] );
  return s.SRB_Status;
}
Exemplo n.º 3
0
DWORD CASPI::SendCommand(LPSRB psrb)
{
	return pfnSendASPI32Command(psrb);
}