65,140
社区成员
发帖
与我相关
我的任务
分享
BYTE __fastcall getDriveName( BYTE hostadapter, BYTE target, char* stringbuffer )
{
SRB_ExecSCSICmd s;
BYTE buf[100];
memset( &s, 0, sizeof( s ) );
memset( buf, 0, 100 );
s.SRB_Cmd = SC_EXEC_SCSI_CMD;
s.SRB_HaId = hostadapter;
s.SRB_Target = target;
s.SRB_Lun = 0;
s.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY;
s.SRB_BufLen = 100;
s.SRB_BufPointer = buf;
s.SRB_SenseLen = SENSE_LEN;
s.SRB_CDBLen = 6;
s.CDBByte[0] = SCSI_INQUIRY;
s.CDBByte[1] = 0;
s.CDBByte[2] = 0;
s.CDBByte[3] = 0;
s.CDBByte[4] = 100;
s.CDBByte[5] = 0;
BYTE byStatus = ExecSCSICommand(&s); //ExecSCSICommand封装SendASPI32Command即为发送方法
if( byStatus != SS_COMP )
{
//cout << "getDriveName returned status:" << LookupASPIStatus(byStatus).c_str() << endl;
}
if( byStatus == SS_ERR && s.SRB_TargStat == STATUS_CHKCOND )
{
BYTE SenseKey = s.SenseArea[2] & (BYTE)15;
BYTE ASC = s.SenseArea[12];
BYTE ASCQ = s.SenseArea[13];
}
//if the command was successful
if( byStatus == SS_COMP )
{
//extract the whole string identifying the drive
for( int i = 8; i < 36; i++ )
{
stringbuffer[i-8] = buf[i];
}
//the part I wish to extract is 28 characters long
stringbuffer[28] = NULL;
}
return byStatus;
}
int __fastcall getCDSpeed(BYTE hostadapter, BYTE target)
{
SRB_ExecSCSICmd s;
unsigned char b[256];
memset( &s, 0, sizeof( s ) );
memset( b, 0xFF, 256 );
s.SRB_Cmd = SC_EXEC_SCSI_CMD;
s.SRB_HaId = hostadapter;
s.SRB_Target = target;
s.SRB_Lun = 0;
s.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY;
s.SRB_BufLen = 256;
s.SRB_BufPointer = b;
s.SRB_CDBLen = 12;
s.CDBByte[0] = SCSI_MODESENSE;
s.CDBByte[2] = 0x2A; //mode page 0x2A contains the speed
s.CDBByte[7] = 0x01;
s.CDBByte[8] = 0x00;
BYTE byStatus = ExecSCSICommand(&s);
if( byStatus == SS_COMP )
{
}
if( byStatus == SS_ERR && s.SRB_TargStat == STATUS_CHKCOND )
{
BYTE SenseKey = s.SenseArea[2] & (BYTE)15;
BYTE ASC = s.SenseArea[12];
BYTE ASCQ = s.SenseArea[13];
}
//speed is stored in bytes 22 & 23 of mode page 0x2A
return (int)((b[22] << 8) + b[23]);
}
s.CDBByte[0] = SCSI_INQUIRY;
s.CDBByte[1] = 0;
s.CDBByte[2] = 0;
s.CDBByte[3] = 0;
s.CDBByte[4] = 100;
s.CDBByte[0] = SCSI_MODESENSE;
s.CDBByte[2] = 0x2A; //mode page 0x2A contains the speed
s.CDBByte[7] = 0x01;
s.CDBByte[8] = 0x00;