📄 scsi2.cpp.bak
字号:
srbExec.CDBByte [ 0 ] = 0xbb;
srbExec.CDBByte [ 2 ] = (read>>8)&0xff;
srbExec.CDBByte [ 3 ] = read&0xff;
srbExec.CDBByte [ 4 ] = (write>>8)&0xff;
srbExec.CDBByte [ 5 ] = write&0xff;
pfnSendASPI32Command ( ( LPSRB ) &srbExec );
if(srbExec.SRB_TargStat == STATUS_CHKCOND&&!m_silence){
m_sense=*(scsi_sense *)srbExec.SenseArea;
AfxMessageBox(checkSense());
}
return srbExec.SRB_Status == SS_COMP;
}
//--------------------------------------------------------------------------
CString SCSI2::ReadTrackInfo(int track,track_info*result){
unsigned char szBuffer[0x100];
SRB_ExecSCSICmd srbExec;
memset ( &srbExec, 0, sizeof ( SRB_ExecSCSICmd ) );
srbExec.SRB_Cmd = SC_EXEC_SCSI_CMD;
srbExec.SRB_HaId = m_HA;
srbExec.SRB_Flags = SRB_DIR_IN;
srbExec.SRB_Target = m_ID;
srbExec.SRB_Lun = m_LUN;
srbExec.SRB_BufLen = sizeof(track_info);
srbExec.SRB_BufPointer = szBuffer;
srbExec.SRB_SenseLen = 18;
srbExec.SRB_CDBLen = 10;
srbExec.CDBByte [ 0 ] = 0x52;
srbExec.CDBByte [ 1 ] = 0x01;
srbExec.CDBByte [ 5 ] = track<1?0xff:track;
srbExec.CDBByte [ 8 ] = 0xff;
pfnSendASPI32Command ( ( LPSRB ) &srbExec );
while ( srbExec.SRB_Status == SS_PENDING );
if ( srbExec.SRB_Status != SS_COMP ){
m_sense=*(scsi_sense *)srbExec.SenseArea;
AfxMessageBox(checkSense());
return "";
}
else{
track_info *p=(track_info *)szBuffer;
if(result!=NULL)*result=*(track_info *)szBuffer;
CString szReturnString,s;
s.Format("Track Number:%d,Session Number:%d\n",
p->track_number_LSB,p->session_number_LSB);
szReturnString+=s;
switch(p->track_mode&0xD){
case 4: szReturnString+="Data Track,Uninteruppted\n";
break;
case 5: szReturnString+="Data Track,Incremental\n";
break;
}
szReturnString+=p->damage?"Damaged,":"Not Damaged\n";
if(p->damage) szReturnString+=p->NWA_V?"Writting allowed\n":"No writting allowed\n";
szReturnString+=p->RT?"Reserved\n":"Not Reserved\n";
szReturnString+=p->blank?"Blank\n":"Not Blank\n";
szReturnString+=p->packet?"Packet":"Not Packet\n";
if(p->packet) szReturnString+=p->fp?"(Fixed Size)\n":"(Variable)\n";
switch(p->data_mode){
case 1: szReturnString+="Mode1\n";
break;
case 2: szReturnString+="Mode2\n";
break;
}
s.Format("Track start address: %Xh\n",SCSI2::toInt32(p->track_start_addr));
szReturnString+=s;
if(p->LRA_V){
s.Format("Last Record address: %Xh\n",SCSI2::toInt32(p->last_record_addr));
szReturnString+=s;
}
else
szReturnString+="Last Record address: Not Available\n";
s.Format("Track size: %Xh\n",SCSI2::toInt32(p->track_size));
szReturnString+=s;
if(p->NWA_V){
s.Format("Next writable address: %Xh\n",SCSI2::toInt32(p->next_writtable_addr));
szReturnString+=s;
}
else
szReturnString+="Next Writable address: Not Available\n";
return szReturnString;
}
}
//--------------------------------------------------------------------------
CString SCSI2::ReadDiskInfo(disk_info *result){
CString szReturnString;
unsigned char szBuffer[0x100];
SRB_ExecSCSICmd srbExec;
memset ( &srbExec, 0, sizeof ( SRB_ExecSCSICmd ) );
srbExec.SRB_Cmd = SC_EXEC_SCSI_CMD;
srbExec.SRB_HaId = m_HA;
srbExec.SRB_Flags = SRB_DIR_IN;
srbExec.SRB_Target = m_ID;
srbExec.SRB_Lun = m_LUN;
srbExec.SRB_BufLen = sizeof(disk_info);
srbExec.SRB_BufPointer = szBuffer;
srbExec.SRB_SenseLen = 18;
srbExec.SRB_CDBLen = 10;
srbExec.CDBByte [ 0 ] = 0x51;
srbExec.CDBByte [ 8 ] = 0xff;
pfnSendASPI32Command ( ( LPSRB ) &srbExec );
while ( srbExec.SRB_Status == SS_PENDING );
if ( srbExec.SRB_Status != SS_COMP ){
m_sense=*(scsi_sense *)srbExec.SenseArea;
AfxMessageBox(checkSense());
szReturnString="Read Track Info error.";
}
else{
disk_info *p=(disk_info *)(szBuffer);
char s[80];
szReturnString="Disk Status: ";
switch(p->disk_status){
case 0: szReturnString+="Empty\n";
break;
case 1: szReturnString+="Incomplete\n";
break;
case 2: szReturnString+="Complete\n";
break;
default: szReturnString+="Other\n";
break;
}
szReturnString="State of Last Session: ";
switch(p->disk_status){
case 0: szReturnString+="Empty\n";
break;
case 1: szReturnString+="Incomplete\n";
break;
case 3: szReturnString+="Complete\n";
break;
default: szReturnString+="Other\n";
break;
}
szReturnString+=p->erasable?"Erasable,":"Not Erasable\n";
sprintf(s,"Frist Track: %d\n",p->first_track);
szReturnString+=s;
sprintf(s,"Sessions: %d\n",p->numsess);
szReturnString+=s;
szReturnString+="Disk Type: ";
switch(p->disk_type){
case 0: szReturnString+="CD-DA/CDROM\n";
break;
case 0x10: szReturnString+="CD-I\n";
break;
case 0x20: szReturnString+="CDROM-XA\n";
break;
default: szReturnString+="Unknown\n";
break;
}
}
if(result!=NULL) *result=*(disk_info *)(szBuffer);
return szReturnString;
}
//--------------------------------------------------------------------------
CString SCSI2::WriteParameters () {
CString szReturnString;
unsigned char szBuffer[0x100];
SRB_ExecSCSICmd srbExec;
memset ( &srbExec, 0, sizeof ( SRB_ExecSCSICmd ) );
srbExec.SRB_Cmd = SC_EXEC_SCSI_CMD;
srbExec.SRB_HaId = m_HA;
srbExec.SRB_Flags = SRB_DIR_IN;
srbExec.SRB_Target = m_ID;
srbExec.SRB_Lun = m_LUN;
srbExec.SRB_BufLen = sizeof(cd_mode_page_05);
srbExec.SRB_BufPointer = szBuffer;
srbExec.SRB_SenseLen = 18;
srbExec.SRB_CDBLen = 10;
srbExec.CDBByte [ 0 ] = SCSI_MODE_SEN10;
srbExec.CDBByte [ 1 ] = 0x08;
srbExec.CDBByte [ 2 ] = 0x05;
srbExec.CDBByte [ 8 ] = sizeof(cd_mode_page_05);
pfnSendASPI32Command ( ( LPSRB ) &srbExec );
while ( srbExec.SRB_Status == SS_PENDING );
if ( srbExec.SRB_Status != SS_COMP )
szReturnString="Mode Sense error.";
else{
cd_mode_page_05 *p=(cd_mode_page_05 *)(szBuffer+4);
char s[80];
szReturnString="Write Type: ";
switch(p->write_type){
case 0: szReturnString+="Packet/Incremental\n";
break;
case 1: szReturnString+="Track At Once\n";
break;
case 2: szReturnString+="Session At Once\n";
break;
case 3: szReturnString+="Raw\n";
break;
default: szReturnString+="Unknown\n";
break;
}
szReturnString+="Multisession: ";
szReturnString+=p->multi_session==3?"Yes\n":"No\n";
if(p->ls_v){
sprintf(s,"Link size: %d sectors\n",p->link_size);
szReturnString+=s;
}
else
szReturnString+="Link Size: 7 sectors\n";
szReturnString+="Buffer Underrun Free: ";
szReturnString+=p->BUFE?"Yes\n":"No\n";
szReturnString+="Track Mode: ";
switch(p->track_mode&0xD){
case 8:
case 0: szReturnString+="2 Audio Channels, No Pre-emphasis\n";
break;
case 9:
case 1: szReturnString+="2 Audio Channels, Pre-emphasis:50/15uS\n";
break;
case 4: szReturnString+="Data Track,Uninteruppted\n";
break;
case 5: szReturnString+="Data Track,Incremental\n";
break;
default: szReturnString+="Unknown\n";
break;
}
szReturnString+="Data Block Type: ";
switch(p->dbtype){
case 0: szReturnString+="Raw Data(2352 Bytes)\n";
break;
case 1: szReturnString+="Raw Data with P,Q Sub-channel(2368 Bytes)\n";
break;
case 2: szReturnString+="Raw data with P-W Sub-channel(2448 Bytes)\n";
break;
case 3: szReturnString+="Raw data with raw P-W Sub-channel(2448 Bytes)\n";
break;
case 8: szReturnString+="Mode1(2048 Bytes)\n";
break;
case 9: szReturnString+="Mode2(2336 Bytes)\n";
break;
case 10: szReturnString+="Mode2(2048 Bytes)\n";
break;
case 11: szReturnString+="Mode2(2056 Bytes)\n";
break;
case 12: szReturnString+="Mode2(2324 Bytes)\n";
break;
case 13: szReturnString+="Mode2(2332 Bytes)\n";
break;
default: szReturnString+="Unknown\n";
break;
}
szReturnString+="Session format: ";
switch(p->session_format){
case 0: szReturnString+="CD-DA/CDROM\n";
break;
case 0x10: szReturnString+="CD-I\n";
break;
case 0x20: szReturnString+="CDROM-XA\n";
break;
default: szReturnString+="Unknown\n";
break;
}
if(p->write_type==0){
if(p->fp==1){
sprintf(s,"Packet size: %d user data blocks\n",toInt32(p->packet_size));
szReturnString+=s;
}
else
szReturnString+="Packet size: Variable\n";
}
sprintf(s,"Subheader: 0x%02X 0x%02X 0x%02X 0x%02X\n",
p->sub_h.fileNumber,p->sub_h.channelNumber,p->sub_h.subMode,p->sub_h.coding);
szReturnString+=s;
}
return szReturnString;
}
//--------------------------------------------------------------------------
bool SCSI2::SetWriteParameters (int write_type,int dbtype,int track_mode,
int session_format) {
unsigned char szBuffer[0x100];
SRB_ExecSCSICmd srbExec;
memset ( &srbExec, 0, sizeof ( SRB_ExecSCSICmd ) );
srbExec.SRB_Cmd = SC_EXEC_SCSI_CMD;
srbExec.SRB_HaId = m_HA;
srbExec.SRB_Target = m_ID;
srbExec.SRB_Lun = m_LUN;
srbExec.SRB_Flags = SRB_DIR_IN;
srbExec.SRB_BufLen = sizeof(cd_mode_page_05);
srbExec.SRB_BufPointer = szBuffer;
srbExec.SRB_SenseLen = 18;
srbExec.SRB_CDBLen = 6;
srbExec.CDBByte [ 0 ] = SCSI_MODE_SEN6;
srbExec.CDBByte [ 1 ] = 0x08;
srbExec.CDBByte [ 2 ] = 0x05;
srbExec.CDBByte [ 4 ] = sizeof(cd_mode_page_05);
pfnSendASPI32Command ( ( LPSRB ) &srbExec );
while ( srbExec.SRB_Status == SS_PENDING );
if ( srbExec.SRB_Status == SS_COMP ){
cd_mode_page_05 *p=(cd_mode_page_05 *)(szBuffer+4);
p->write_type=write_type; //Packet/TAO
p->fp=0; //Variable Packet Size
p->dbtype=dbtype; //Mode 2 form 1
p->track_mode=track_mode; //Data,incremental/TAO
p->session_format=session_format; //CDROM
p->sub_h.subMode=0x08;
srbExec.SRB_Status = 0;
srbExec.SRB_HaStat=0;
srbExec.SRB_Flags = SRB_DIR_OUT;
srbExec.SRB_SenseLen = 18;
srbExec.SRB_CDBLen = 6;
srbExec.CDBByte [ 0 ] = SCSI_MODE_SEL6;
srbExec.CDBByte [ 1 ] = 0x10;
srbExec.CDBByte [ 2 ] = 0;
pfnSendASPI32Command ( ( LPSRB ) &srbExec );
while ( srbExec.SRB_Status == SS_PENDING );
if(srbExec.SRB_TargStat == STATUS_CHKCOND&&!m_silence){
m_sense=*(scsi_sense *)srbExec.SenseArea;
AfxMessageBox(checkSense());
}
}
return srbExec.SRB_Status == SS_COMP;
}
//--------------------------------------------------------------------------
void SCSI2::LoadUnload (bool load ) {
CString szReturnString;
unsigned char szBuffer[100];
SRB_ExecSCSICmd srbExec;
memset ( &srbExec, 0, sizeof ( SRB_ExecSCSICmd ) );
srbExec.SRB_Cmd = SC_EXEC_SCSI_CMD;
srbExec.SRB_HaId = m_HA;
srbExec.SRB_Flags = SRB_DIR_IN;
srbExec.SRB_Target = m_ID;
srbExec.SRB_Lun = m_LUN;
srbExec.SRB_BufLen = 36;
srbExec.SRB_BufPointer = szBuffer;
srbExec.SRB_SenseLen = 18;
srbExec.SRB_CDBLen = 6;
srbExec.CDBByte [ 0 ] = 0x1E;
srbExec.CDBByte [ 4 ] = 0;
pfnSendASPI32Command ( ( LPSRB ) &srbExec );
if(checkError(srbExec.SRB_Status)=="SUCCESS"){
srbExec.SRB_CDBLen = 12;
srbExec.CDBByte [ 0 ] = 0xA6;
srbExec.CDBByte [ 4 ] = load?3:2;
pfnSendASPI32Command ( ( LPSRB ) &srbExec );
if(checkError(srbExec.SRB_Status)!="SUCCESS"){
//ASPIReset(m_HA,m_ID,m_LUN);
srbExec.SRB_CDBLen = 6;
srbExec.CDBByte [ 0 ] = 0x1B;
srbExec.CDBByte [ 4 ] = load?3:2;
pfnSendASPI32Command ( ( LPSRB ) &srbExec );
}
}
}
//--------------------------------------------------------------------------
CString SCSI2::PMA () {
CString szReturnString;
unsigned char szBuffer[1024];
SRB_ExecSCSICmd srbExec;
memset ( &srbExec, 0, sizeof ( SRB_ExecSCSICmd ) );
srbExec.SRB_Cmd = SC_EXEC_SCSI_CMD;
srbExec.SRB_HaId = m_HA;
srbExec.SRB_Flags = SRB_DIR_IN;
srbExec.SRB_Target = m_ID;
srbExec.SRB_Lun = m_LUN;
srbExec.SRB_BufLen = 1024;
srbExec.SRB_BufPointer = szBuffer;
srbExec.SRB_SenseLen = 28;
srbExec.SRB_CDBLen = 10;
srbExec.CDBByte [ 0 ] = 0x43;
srbExec.CDBByte [ 2 ] = 0x03;
srbExec.CDBByte [ 7 ] = 4;
pfnSendASPI32Command ( ( LPSRB ) &srbExec );
if(checkError(srbExec.SRB_Status)=="SUCCESS"){
char s[80];
cd_pma*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -