Windows有特定的接口,我可以通过它发送特定的scsi命令,例如查询到scsi设备? 我search了networking,find了传递SCSI Pass Through接口的参考。 但它非常模糊。
有没有关于如何使用它的API的任何文档?
#include <iostream> #include <windows.h> #include <winioctl.h> #define ULONG_PTR ULONG #include <ntddscsi.h> //from SDK #include <spti.h> //from DDK using namespace std; int demo() { HANDLE hDisk; SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER sptdwb; ULONG length = 0; DWORD bytesReturn; BYTE bufDataRead[64*1024+10]; int iRet; hDisk = CreateFile(path,GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,OPEN_EXISTING,0,NULL ); if (hDisk ==INVALID_HANDLE_VALUE) { return 0; } ZeroMemory(&sptdwb, sizeof(SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER)); sptdwb.sptd.Length = sizeof(SCSI_PASS_THROUGH_DIRECT); sptdwb.sptd.PathId = 0; sptdwb.sptd.TargetId = 1; sptdwb.sptd.Lun = 0; sptdwb.sptd.CdbLength = 6; sptdwb.sptd.DataIn = SCSI_IOCTL_DATA_IN; sptdwb.sptd.SenseInfoLength = 24; sptdwb.sptd.DataTransferLength = 8; sptdwb.sptd.TimeOutValue = 2; sptdwb.sptd.DataBuffer = bufDataRead; sptdwb.sptd.SenseInfoOffset = offsetof(SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER,ucSenseBuf); sptdwb.sptd.Cdb[0] = 0x12; sptdwb.sptd.Cdb[1] = 0x00; sptdwb.sptd.Cdb[2] = 0x00; sptdwb.sptd.Cdb[3] = 0x00; sptdwb.sptd.Cdb[4] = 0xFF; sptdwb.sptd.Cdb[5] = 0x00; length = sizeof(SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER); iRet = DeviceIoControl(hDisk, IOCTL_SCSI_PASS_THROUGH_DIRECT, &sptdwb, length, &sptdwb, length, &bytesReturn, NULL); if (0 == iRet) { printf("inquiry fail"); return 0; } else { //Check returned data in sptdwb.sptd.DataBuffer. } return 0;
}
SCSI覆盖了大量的地面。 你正在与CD / DVD /磁盘/磁带/扫描仪或什么谈话。
对于CD / DVD,最好(也是唯一的)用于设置/读/写命令的免费参考资料可以在这里找到: http : //www.t10.org/drafts.htm
关于SPTI,在“SCSI编程人员指南”中有一些非常基本的文档。 有关ASPI – > SPTI转换器的文章可以在DDJ网站上找到。
请记住,SPTI只是一个API,它强加或者不了解SCSI消息内容或格式。
您可以通过向SCSI端口驱动程序发送一个IRP_MJ_SCSI IRP来发送SCSI命令,请参阅http://msdn.microsoft.com/en-us/library/ff565387(VS.85).aspx 。 但是,您将不得不自己构建SCSI CBD,我还没有找到描述它的文档。
SCSI命令被分解成许多规格。 INQUIRY命令在SPC规范中,而特定于设备类型的命令被分解成几个规格(即block,ses,…)。