改的WDK上的diskperf例子,看到在
if (irpStack->MajorFunction==IRP_MJ_INTERNAL_DEVICE_CONTROL)
{
//DbgPrint(("liushuanglin tested for cdb ############################"));
CurSrb=irpStack->Parameters.Scsi.Srb;
cdb = (PCDB)CurSrb->Cdb;
opCode=cdb->CDB6GENERIC.OperationCode;
iqCode = cdb->CDB6INQUIRY.OperationCode;
//gPrint("======================r cdb : %x\n", iqCode);
if (opCode==SCSIOP_MODE_SENSE)
{
DbgPrint("观察:进入U盘写保护\n");
modeData = (PMODE_PARAMETER_HEADER)CurSrb->DataBuffer;
if( IsReadOnly )
{
DbgPrint("U盘写保护\n");
modeData->DeviceSpecificParameter |= MODE_DSP_WRITE_PROTECT;
}
}
//liushuanglin added for capture 12 begin
if(iqCode == 12 ){
DbgPrint(("---------------capture 12 code \n"));
inquiryDate= (PINQUIRYDATA)CurSrb->DataBuffer;
DbgPrint("---------------inquiry data device type=%d\n",inquiryDate->DeviceType);
}
iqCode = cdb->CDB6INQUIRY3.OperationCode;
DbgPrint("@@@@@@@@@@@@@@@@@@@@@@@@@liushuanglin tested for cdb : %x\n", iqCode);
//liushuanglin added for capture 12 end
}
为啥得不到12,看到dbgview里面能得到25,28,0这些SCSI,为啥得不到12呢?
没用过该例子。
但是看了WDK, INQUIRY命令应该是通过IRP_MJ_DEVICE_CONTROL/IOCTL_SCSI_GET_INQUIRY_DATA来获取的。
所以,有可能是你的跟踪代码加的地方不对,不应该监控irpStack->MajorFunction==IRP_MJ_INTERNAL_DEVICE_CONTROL下的命令。
这个驱动是加到了类的lowerfilters,不是应用发的啊
即使是Lower Level Filter Driver,也可以过滤IRP_MJ_DEVICE_CONTROL啊。你过滤一下IRP_MJ_DEVICE_CONTROL看看,确认一下。
你可以Filter一下IOCTL_STORAGE_QUERY_PROPERTY。
Only Plug and Play drivers can issue IOCTL_STORAGE_QUERY_PROPERTY requests. Legacy driver should use IOCTL_SCSI_GET_INQUIRY_DATA and IOCTL_SCSI_GET_CAPABILITIES to get inquiry and capabilities data.
"难道所有的SCSI不是在一起处理的吗"
->没有这样的硬性规定。不同的SCSI命令会有不同的处理方式和发生时间。