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

📄 scsi2.cpp

📁 一个UDF系统的SCSI的CDROM刻录软件.
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		LVD.logicalVolIdent[127]=2*strlen(label)+1;	//Length of dstring
		LVD.logicalBlockSize=block_size;
		LVD.domainIdent.flags=0;
		str=UDF_ID_COMPLIANT;
		for(i=0;i<strlen(str);i++)		LVD.domainIdent.ident[i]=str[i];
		LVD.domainIdent.identSuffix[0]=0x50;
		LVD.domainIdent.identSuffix[1]=0x01;
		LVD.logicalVolContentsUse.extLength=block_size;
		LVD.logicalVolContentsUse.extLocation.logicalBlockNum=0;
		LVD.logicalVolContentsUse.extLocation.partitionReferenceNum=1;
		LVD.mapTableLength=0x46;
		LVD.numPartitionMaps=2;
		LVD.impIdent.flags=0;
		for(i=0;i<strlen(impId);i++)		LVD.impIdent.ident[i]=impId[i];
		LVD.impIdent.identSuffix[0]=6;
		LVD.impIdent.identSuffix[6]=5;
		LVD.integritySeqExt.extLength=2*block_size;
		LVD.integritySeqExt.extLocation=0x221;
		LVD.partitionMap1.type=1;
		LVD.partitionMap1.len=6;
		LVD.partitionMap1.volSeqNumber=1;
		LVD.partitionMap1.partitionNumber=0;
		LVD.partitionMap2.type=2;
		LVD.partitionMap2.len=0x40;
		LVD.partitionMap2.ident.flags=0;
		str=UDF_ID_VIRTUAL;
		for(i=0;i<strlen(str);i++)		LVD.partitionMap2.ident.ident[i]=str[i];
		LVD.partitionMap2.ident.identSuffix[0]=0x50;
		LVD.partitionMap2.ident.identSuffix[1]=0x01;
		LVD.partitionMap2.ident.identSuffix[2]=0x06;
		LVD.partitionMap2.volSeqNumber=1;
		LVD.partitionMap2.partitionNumber=0;
		LVD.partitionMap2.reserved[0]=1;
		LVD.descTag=fillTag(TAG_IDENT_LVD,(BYTE*)&LVD+0x10,0x1EE,base+1);
		*(logicalVolDesc*)(buffer+offset+block_size)=LVD;


		//Write PD
		partitionDesc PD;
		memset(&PD,0,sizeof(partitionDesc));
		PD.volDescSeqNum=3;
		PD.partitionFlags=1;
		PD.partitionNumber=0;
		PD.partitionContents.flags=0;
		char* temp="+NSR02";
		for(i=0;i<6;i++)		PD.partitionContents.ident[i]=temp[i];
		PD.partitionContents.identSuffix[0]=0x50;
		PD.partitionContents.identSuffix[1]=0x01;
		PD.partitionContents.identSuffix[2]=0x06;
		PD.accessType=2;	//Write-Once
		PD.partitionStartingLocation=0x223;
		PD.partitionLength=0x511a4;
		PD.impIdent.flags=0;
		for(i=0;i<strlen(impId);i++)		PD.impIdent.ident[i]=impId[i];
		PD.impIdent.identSuffix[0]=6;
		PD.impIdent.identSuffix[6]=5;
		PD.descTag=fillTag(TAG_IDENT_PD,(BYTE*)&PD+0x10,0x1f0,base+2);
		*(partitionDesc*)(buffer+offset+2*block_size)=PD;

		//Write USD
		unallocSpaceDesc USD;
		memset(&USD,0,sizeof(unallocSpaceDesc));
		USD.volDescSeqNum=4;
		USD.numAllocDescs=0;
		USD.descTag=fillTag(TAG_IDENT_USD,(BYTE*)&USD+0x10,0x08,base+3);
		*(unallocSpaceDesc*)(buffer+offset+3*block_size)=USD;
		
		//Write IUVD
		impUseVolDesc IUVD;
		memset(&IUVD,0,sizeof(impUseVolDesc));
		IUVD.volDescSeqNum=5;
		IUVD.impIdent.flags=0;
		str=UDF_ID_LV_INFO;
		for(i=0;i<strlen(str);i++)		IUVD.impIdent.ident[i]=str[i];
		IUVD.impIdent.identSuffix[0]=0x50;
		IUVD.impIdent.identSuffix[1]=0x01;
		IUVD.impIdent.identSuffix[2]=0x06;
		IUVD.impUse.LVICharSet.charSetType=0;
		str=UDF_CHAR_SET_INFO;
		for(i=0;i<strlen(str);i++)		IUVD.impUse.LVICharSet.charSetInfo[i]=str[i];
		for(i=0;i<32;i++)				IUVD.impUse.LVId[i]=volID[i];
		IUVD.impUse.LVId[127]=2*strlen(label)+1;
		IUVD.impUse.impIdent.flags=0;
		for(i=0;i<strlen(impId);i++)		IUVD.impUse.impIdent.ident[i]=impId[i];
		IUVD.impUse.impIdent.identSuffix[0]=0x06;
		IUVD.impUse.impIdent.identSuffix[6]=0x05;
		IUVD.descTag=fillTag(TAG_IDENT_IUVD,(BYTE*)&IUVD+0x10,0x1f0,base+4);
		*(impUseVolDesc*)(buffer+offset+4*block_size)=IUVD;
		
		//Write TD
		terminatingDesc TD;
		memset(&TD,0,sizeof(terminatingDesc));
		TD.descTag=fillTag(TAG_IDENT_TD,(BYTE*)&TD+0x10,0x1f0,base+5);
		*(terminatingDesc*)(buffer+offset+5*block_size)=TD;
	}

	//Write LVID
	logicalVolIntegrityDesc LVID;
	memset(&LVID,0,sizeof(logicalVolIntegrityDesc));
	LVID.recordingDateAndTime=t;
	LVID.integrityType=0;	//Open
	LVID.numOfPartitions=2;
	LVID.lengthOfImpUse=0x30;
	Uint32* p=&LVID.freeSpaceTable[0];
	*(p++)=0x511a4-0x12;	//?
	*(p++)=0xffffffff;
	*(p++)=0x511a4;//?
	*(p++)=0xffffffff;
	logicalVolIntegrityDescImpUse* impUse=
		(logicalVolIntegrityDescImpUse*)&LVID.impUse;
	impUse->impIdent.flags=0;
	for(i=0;i<strlen(impId);i++)		impUse->impIdent.ident[i]=impId[i];
	impUse->impIdent.identSuffix[0]=0x06;
	impUse->impIdent.identSuffix[6]=0x05;
	impUse->minUDFReadRev=0x150;
	impUse->minUDFWriteRev=0x150;
	impUse->maxUDFWriteRev=0x150;
	LVID.descTag=fillTag(TAG_IDENT_LVID,(BYTE*)&LVID+0x10,0x80,0x221);
	*(logicalVolIntegrityDesc*)(buffer+block_size*0x21)=LVID;

	terminatingDesc	TD;
	memset(&TD,0,sizeof(terminatingDesc));
	TD.descTag=fillTag(TAG_IDENT_TD,(BYTE*)&TD+0x10,0x1f0,0x222);
	*(terminatingDesc*)(buffer+block_size*0x22)=TD;

	//Write FSD
	fileSetDesc	FSD;
	memset(&FSD,0,sizeof(fileSetDesc));
	FSD.recordingDateAndTime=t;
	FSD.interchangeLvl=3;
	FSD.maxInterchangeLvl=3;
	FSD.charSetList=1;
	FSD.maxCharSetList=1;
	FSD.fileSetNum=0;
	FSD.fileSetDescNum=0;
	FSD.logicalVolIdentCharSet.charSetType=0;
	str=UDF_CHAR_SET_INFO;
	for(i=0;i<strlen(str);i++){
		FSD.logicalVolIdentCharSet.charSetInfo[i]=str[i];
	}
	
	for(i=0;i<32;i++)		FSD.logicalVolIdent[i]=volID[i];
	FSD.logicalVolIdent[127]=2*strlen(label)+1;

	FSD.fileSetCharSet.charSetType=0;
	for(i=0;i<strlen(str);i++){
		FSD.fileSetCharSet.charSetInfo[i]=str[i];
	}
	for(i=0;i<32;i++)		FSD.fileSetIdent[i]=volID[i];
	FSD.fileSetIdent[31]=2*strlen(label)+1;

	FSD.rootDirectoryICB.extLength=0x800;
	FSD.rootDirectoryICB.extLocation.logicalBlockNum=1;
	FSD.rootDirectoryICB.extLocation.partitionReferenceNum=1;
	FSD.domainIdent.flags=0;
	str=UDF_ID_COMPLIANT;
	for(i=0;i<strlen(str);i++)	FSD.domainIdent.ident[i]=str[i];
	FSD.domainIdent.identSuffix[0]=0x50;
	FSD.domainIdent.identSuffix[1]=0x01;
	FSD.descTag=fillTag(TAG_IDENT_FSD,(BYTE*)&FSD+0x10,0x1f0,0);
	*(fileSetDesc*)(buffer+block_size*0x23)=FSD;
	
	//FIDD
	fileEntry	FE;
	memset(&FE,0,sizeof(fileEntry));
	FE.icbTag.strategyType=4;
	FE.icbTag.numEntries=1;
	FE.icbTag.fileType=4;
	FE.icbTag.flags=0x3;
	FE.uid=0xffffffff;
	FE.gid=0xffffffff;
	FE.permissions=0x7fff;
	FE.fileLinkCount=1;
	FE.informationLength=0x28;
	FE.modificationTime=t;
	FE.impIdent.flags=0;
	for(i=0;i<strlen(impId);i++)		FE.impIdent.ident[i]=impId[i];
	FE.impIdent.identSuffix[0]=0x06;
	FE.impIdent.identSuffix[6]=0x05;
	FE.uniqueID=0x11;
	FE.lengthAllocDescs=0x28;
	{//Fill in the Embedded FIDD
		int FIDD_Offset=0xB0;
		fileIdentDesc	FIDD;
		memset(&FIDD,0,sizeof(fileIdentDesc));
		FIDD.fileVersionNum=1;
		FIDD.fileCharacteristics=0xA;
		FIDD.icb.extLength=0x800;
		FIDD.icb.extLocation.logicalBlockNum=1;
		FIDD.icb.extLocation.partitionReferenceNum=1;
		FIDD.descTag=fillTag(TAG_IDENT_FID,(BYTE*)&FIDD+0x10,0x18,1);
		*(fileIdentDesc*)((BYTE*)&FE+FIDD_Offset)=FIDD;
	}

	FE.descTag=fillTag(TAG_IDENT_FE,(BYTE*)&FE+0x10,0xC8,1);
	*(fileEntry*)(buffer+block_size*0x24)=FE;
	
	//VAT ICB
	FE.icbTag.fileType=0;	
	FE.permissions=0x7fff;
	FE.fileLinkCount=0;
	FE.uniqueID=0x12;
	FE.informationLength=0x2c;
	FE.logicalBlocksRecorded=0;
	FE.lengthAllocDescs=0x2c;
	FE.lengthExtendedAttr=0;
	*(Uint32*)((BYTE*)&FE+0xB0)=0;
	*(Uint32*)((BYTE*)&FE+0xB4)=1;
	regid* id=(regid*)((BYTE*)&FE+0xB8);
	str=UDF_ID_ALLOC;
	id->flags=0;
	for(i=0;i<strlen(str);i++)		id->ident[i]=str[i];
	id->identSuffix[0]=0x50;
	id->identSuffix[1]=0x01;
	id->identSuffix[2]=0x06;
	*(Uint32*)((BYTE*)&FE+0xD8)=0xffffffff;
	FE.descTag=fillTag(TAG_IDENT_FE,(BYTE*)&FE+0x10,0xCC,2);
	*(fileEntry*)(buffer+block_size*0x25)=FE;

	//Write the buffer to the disk
	bool result=WritePacket(buffer,0x200,0x26);
	delete volID;
	delete buffer;
	return result;
}
//--------------------------------------------------------------------------
bool SCSI2::SCSIRead ( unsigned char* buffer,long addr,long size,bool header) {

	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 = size*2448;
	srbExec.SRB_BufPointer = buffer;
	srbExec.SRB_SenseLen = SENSE_LEN;
	srbExec.SRB_CDBLen = 12;
	srbExec.CDBByte [ 0 ] = 0xbe;
	srbExec.CDBByte [ 2 ] = (addr>>24)&0xff;
	srbExec.CDBByte [ 3 ] = (addr>>16)&0xff;
	srbExec.CDBByte [ 4 ] = (addr>>8)&0xff;
	srbExec.CDBByte [ 5 ] = addr&0xff;
	srbExec.CDBByte [ 6 ] = (size>>16)&0xff;
	srbExec.CDBByte [ 7 ] = (size>>8)&0xff;
	srbExec.CDBByte [ 8 ] = size&0xff;
	srbExec.CDBByte [ 9 ] = header?0x70:0x10;
	
	pfnSendASPI32Command ( ( LPSRB ) &srbExec );
	while ( srbExec.SRB_Status == SS_PENDING );
	if(checkError(srbExec.SRB_Status)!="SUCCESS"&&!m_silence){
		m_sense=*(scsi_sense *)srbExec.SenseArea;
		AfxMessageBox(checkSense());
	}
	return srbExec.SRB_Status == SS_COMP;

}
//--------------------------------------------------------------------------
CString SCSI2::SCSICDROMCapacity () {

	CString szReturnString;
	unsigned char szBuffer[40];
	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 = SENSE_LEN;
	srbExec.SRB_CDBLen = 10;
	srbExec.CDBByte [ 0 ] = SCSI_READCDCAP;
	
	pfnSendASPI32Command ( ( LPSRB ) &srbExec );
	while ( srbExec.SRB_Status == SS_PENDING );

	if ( srbExec.SRB_Status != SS_COMP )
		szReturnString="Inquiry error.";
	else{
		char s[80];
		sprintf(s,"Blocks:\t%d",(szBuffer[0]<<24)+(szBuffer[1]<<16)+(szBuffer[2]<<8)+szBuffer[3]+1);
		szReturnString=s;
		sprintf(s,"\nBlock length :\t%d",(szBuffer[4]<<24)+(szBuffer[5]<<16)+(szBuffer[6]<<8)+szBuffer[7]);
		szReturnString+=s;
	}
	return szReturnString;
}
//--------------------------------------------------------------------------
CString SCSI2::SCSICDRScan ( ) {

	CString szReturnString;
	unsigned char szBuffer[40];
	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 = SENSE_LEN;
	srbExec.SRB_CDBLen = 10;
	srbExec.CDBByte [ 0 ] = SCSI_MEDIUM_SCN;
	srbExec.CDBByte [ 8 ] = 8;
	srbExec.CDBByte [ 9 ] = 1;
	srbExec.CDBByte [ 13] = 1;
	srbExec.CDBByte [ 14] = 1;
	srbExec.SenseArea[3]=1;
	srbExec.SenseArea[4]=1;

	pfnSendASPI32Command ( ( LPSRB ) &srbExec );
	
	while ( srbExec.SRB_Status == SS_PENDING );
	if(srbExec.SRB_Status&STATUS_CONDMET){
		//memset ( &srbExec, 0, sizeof ( SRB_ExecSCSICmd ) );
		srbExec.SRB_CDBLen = 6;
		srbExec.CDBByte [ 0 ] = SCSI_REQ_SENSE;
		srbExec.CDBByte [ 4 ] = 18;
		pfnSendASPI32Command ( ( LPSRB ) &srbExec );
	}

	if ( srbExec.SRB_Status != SS_COMP|| szBuffer[0]==0x70||szBuffer[0]==0x71)
		szReturnString="Medium scan error.";
	else{
		char s[80];
		sprintf(s,"Block:\t%d",(szBuffer[0]<<24)+(szBuffer[1]<<16)+(szBuffer[2]<<8)+szBuffer[3]);
		szReturnString=s;
		//sprintf(s,"\nBlock length :\t%d",(szBuffer[4]<<24)+(szBuffer[5]<<16)+(szBuffer[6]<<8)+szBuffer[7]);
		//szReturnString+=s;
	}
	return szReturnString;
}
//--------------------------------------------------------------------------
CString SCSI2::SCSICapabilities () {

	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 ] = SCSI_MODE_SEN6;
	srbExec.CDBByte [ 1 ] = 0x08;
	srbExec.CDBByte [ 2 ] = 0x2A;
	srbExec.CDBByte [ 4 ] = 100;

	pfnSendASPI32Command ( ( LPSRB ) &srbExec );
	while ( srbExec.SRB_Status == SS_PENDING );

	if ( srbExec.SRB_Status != SS_COMP )
		szReturnString="Mode Sense error.";
	else{
		cd_mode_page_2A *p=(cd_mode_page_2A *)(szBuffer+4);
		//BYTE* page=szBuffer+4;
		if(p->cd_r_write)
			szReturnString="CDR Writing:Yes\n";
		else
			szReturnString="CDR Writing:No\n";
		if(p->cd_rw_write)
			szReturnString+="CDRW Writing:Yes\n";
		else
			szReturnString+="CDRW Writing:No\n";
		if(p->multi_session)
			szReturnString+="Multisession:Yes\n";
		else
			szReturnString+="Multisession:No\n";
		char s[80];
		sprintf(s,"Buffer Size: %dKB\n",toInt16(p->buffer_size));
		szReturnString+=s;
		
	}
	return szReturnString;
}
//--------------------------------------------------------------------------

bool SCSI2::SCSISetSpeed(int read,int write){
	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 = 0xff;
	srbExec.SRB_BufPointer = szBuffer;
	srbExec.SRB_SenseLen = 18;
	srbExec.SRB_CDBLen = 12;

⌨️ 快捷键说明

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