关于C++ 使用ASPI 向光驱发送SCSI命令遇到的问题

奔跑的大象 2013-07-18 03:26:51
先贴代码
这段代码是获取硬件类型为CDROM的硬件名称,
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;
}



再看下面的代码,这段代码是获取类型为CDROM硬件的转速
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]);
}


问题请教:
1.向硬件发送的SRB_ExecSCSICmd这个结构体里的CDBByte Byte数组到底是怎样设置的,通过上面两段代码可以看到,获取硬件不同属性就是通过设置这个数组来获取的,
获取硬件名称这样设置的,

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;


我现在就是不明白这些参数为什么要这样设置,有什么标准文档吗,赐教。
...全文
355 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
奔跑的大象 2013-09-18
  • 打赏
  • 举报
回复
暂时没什么好的解决方案,先沉贴。
奔跑的大象 2013-08-04
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
没搞过,建议在google上搜搜看有没有开源的刻录软件啥的。
引用 5 楼 max_min_ 的回复:
这些有开源的东西 就找google 或者 赵老师
这个相当于是获取硬件的状态,而不是软件的状态,因为记录软件有很多,windows下开发的,第三方库开发的等,只有得到硬件的状态,也就完成了对所有刻录软件的获取。
max_min_ 2013-08-04
  • 打赏
  • 举报
回复
这些有开源的东西 就找google 或者 赵老师
赵4老师 2013-08-04
  • 打赏
  • 举报
回复
没搞过,建议在google上搜搜看有没有开源的刻录软件啥的。
奔跑的大象 2013-08-04
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
搜“devcon”
这个是查找设备的吧,我需要的是获取刻录机的状态,获取到刻录机的刻录状态,然后等待刻录结束,接着获取刻录的数据。
赵4老师 2013-07-30
  • 打赏
  • 举报
回复
搜“devcon”
奔跑的大象 2013-07-19
  • 打赏
  • 举报
回复
自己顶一个。

65,140

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧