0

我开发了一个大容量存储设备,我想要一个 PC 应用程序来向它发送/接收一些自定义命令。通常会为此创建一个复合 USB 设备 (MSC+HID) 并通过 HID 发送命令。但是仅使用大容量存储类可以做到这一点吗?我想到的一些事情:

  • 在未使用的 SCSI 命令中发送数据(Vista 需要管理员权限)
  • 将数据写入“魔术”扇区,并在设备注意到特定扇区也被写入后立即在设备上对其进行解析(某些 Windows 版本不允许原始磁盘访问)
  • 通过将数据放在磁盘上的 .txt 文件中发送数据(非常复杂,因为设备需要解析 FAT 表才能读取文件,并且无法在 .txt 文件更新时收到通知)

有人能想到任何其他可以为此目的工作的黑客吗?或者是创建 HID 设备的唯一选择?

4

1 回答 1

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。但是您的设备应该正确识别它们!

于 2013-01-17T10:43:35.967 回答