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

📄 scsi2.cpp.bak

📁 一个UDF系统的SCSI的CDROM刻录软件.
💻 BAK
📖 第 1 页 / 共 5 页
字号:
	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 + -