我开发了一个大容量存储设备,我就像一个PC应用程序来发送/接收一些自定义命令。通常会为此创建一个复合USB设备(MSC + HID)并通过HID发送命令。但是只有大容量存储类可以做到这一点吗?我想到的一些事情:
有人可以想到任何其他黑客,这可以用于此目的吗?或者是创建HID设备的唯一选择?
答案 0 :(得分:1)
您提到的MSC也是“USB”大容量存储设备?
如果是,那么您可以使用SCSI_PATH_THROUGH与此USB MSC进行通信!
实施例。向USB MSC发出写命令可以通过下面的代码片段来实现:
BOOL LogicalWriteCmd(HANDLE fileHandle,ULONG LBA,ULONG SectorCnt,PVOID DataBuffer)
{
SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER sptdwb;
ULONG returned,length;
BOOL status;
ZeroMemory(&sptdwb, sizeof(SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER));
length = SectorCnt<<SECTOR_SIZE_SHIFT_BIT;
sptdwb.sptd.Length = sizeof(SCSI_PASS_THROUGH_DIRECT);
sptdwb.sptd.PathId = 0;
sptdwb.sptd.TargetId = 0;
sptdwb.sptd.Lun = 0;
sptdwb.sptd.CdbLength = CDB10GENERIC_LENGTH;
sptdwb.sptd.DataIn = SCSI_IOCTL_DATA_OUT;
sptdwb.sptd.SenseInfoLength = SPT_SENSE_LENGTH;
sptdwb.sptd.DataTransferLength = length;
sptdwb.sptd.TimeOutValue = g_ulTimeOut;
sptdwb.sptd.DataBuffer = DataBuffer;
sptdwb.sptd.SenseInfoOffset =
offsetof(SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER,ucSenseBuf);
sptdwb.sptd.Cdb[0] = SCSIOP_WRITE;
sptdwb.sptd.Cdb[2] = (UCHAR)(LBA>>24);
sptdwb.sptd.Cdb[3] = (UCHAR)(LBA>>16);
sptdwb.sptd.Cdb[4] = (UCHAR)(LBA>>8);
sptdwb.sptd.Cdb[5] = (UCHAR)(LBA);
sptdwb.sptd.Cdb[7] = SectorCnt>>8;
sptdwb.sptd.Cdb[8] = (UCHAR)SectorCnt;
length = sizeof(SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER);
status = DeviceIoControl(fileHandle,
IOCTL_SCSI_PASS_THROUGH_DIRECT,
&sptdwb,
length,
&sptdwb,
length,
&returned,
FALSE);
if ((sptdwb.sptd.ScsiStatus == 0) && (status != 0)) {
return TRUE;
}
return FALSE;
}
您可以创建自己的供应商/自定义命令,然后通过上述方式将其发送到USB MSC。但是你的设备应该正确识别它们!