/*************************************************************************** * 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; }
/*************************************************************************** * 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; }
DWORD CASPI::SendCommand(LPSRB psrb) { return pfnSendASPI32Command(psrb); }