📄 scsi2.cpp.bak
字号:
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 + -