Windows是否具有特定的接口,通过该接口我可以向scsi设备发送特定的scsi命令(如查询)?我搜索了网络,发现传递引用了SCSI Pass Through接口。但它非常模糊。向Windows中的SCSI设备发送特定的SCSI命令
有没有关于如何使用它的API的任何文档?
Windows是否具有特定的接口,通过该接口我可以向scsi设备发送特定的scsi命令(如查询)?我搜索了网络,发现传递引用了SCSI Pass Through接口。但它非常模糊。向Windows中的SCSI设备发送特定的SCSI命令
有没有关于如何使用它的API的任何文档?
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规范中,而特定于设备类型的命令被分解成几个规格(即块,ses,...)。
#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磁盘用于..... – Ganesh 2010-09-08 11:04:06