在Windows中将特定SCSI命令发送到SCSI设备

在Windows中将特定SCSI命令发送到SCSI设备,windows,winapi,device-driver,scsi,Windows,Winapi,Device Driver,Scsi,windows是否有特定的接口,通过该接口我可以向scsi设备发送特定的scsi命令,如查询?我搜索了网络,找到了对SCSI传递接口的传递引用。但它非常模糊 有关于如何使用该API的文档吗???SCSI涵盖了大量领域。你是在和CD/DVD/磁盘/磁带/扫描仪或其他什么东西说话 对于CD/DVD,安装/读/写命令的最佳(也是唯一)免费参考可在此处找到: 关于SPTI,在旧的“SCSI程序员指南”中有一些非常基本的文档。DDJ网站上有一篇关于ASPI->SPTI转换器的文章 请记住,SPTI只是一个

windows是否有特定的接口,通过该接口我可以向scsi设备发送特定的scsi命令,如查询?我搜索了网络,找到了对SCSI传递接口的传递引用。但它非常模糊


有关于如何使用该API的文档吗???

SCSI涵盖了大量领域。你是在和CD/DVD/磁盘/磁带/扫描仪或其他什么东西说话

对于CD/DVD,安装/读/写命令的最佳(也是唯一)免费参考可在此处找到:

关于SPTI,在旧的“SCSI程序员指南”中有一些非常基本的文档。DDJ网站上有一篇关于ASPI->SPTI转换器的文章

请记住,SPTI只是一个API,它对SCSI消息内容或格式没有任何规定,也不知道

  • Brian Sawert,Addison Wesley,1998年
您可以通过向SCSI端口驱动程序发送IRP_MJ_SCSI IRP来向其发送SCSI命令,请参阅。但是,您必须自己构造SCSI CBD,我还没有找到描述它的文档。

SCSI命令也被分解为许多规范。查询命令在SPC规范中,而特定于设备类型的命令被分解为多个规范(即块、ses等)。

#包括
#包括
#包括
#定义ULONG_PTR ULONG
#包含//来自SDK
#包括//来自DDK
使用名称空间std;
int demo()
{
处理hDisk;
SCSI_PASS_THROUGH_DIRECT_与_缓冲区sptdwb;
ULONG长度=0;
德沃德·拜特斯;
字节bufDataRead[64*1024+10];
国际互联网;
hDisk=CreateFile(路径、通用读取、通用写入、,
文件共享读取文件共享写入,NULL,打开,0,NULL
);
如果(hDisk==无效的句柄值){
返回0;
}
ZeroMemory(&sptdwb,sizeof(带缓冲区的SCSI_PASS_THROUGH_DIRECT_));
sptdwb.sptd.Length=sizeof(SCSI通过\u直接);
sptdwb.sptd.PathId=0;
sptdwb.sptd.TargetId=1;
sptdwb.sptd.Lun=0;
sptdwb.sptd.CdbLength=6;
sptdwb.sptd.DataIn=SCSI\u IOCTL\u DATA\u IN;
sptdwb.sptd.senseInfo长度=24;
sptdwb.sptd.DataTransferLength=8;
sptdwb.sptd.TimeOutValue=2;
sptdwb.sptd.DataBuffer=bufDataRead;
sptdwb.sptd.SENSEINFOFFSET=偏移量(SCSI_PASS_THROUGH_DIRECT_,带_缓冲区,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;
长度=sizeof(SCSI通过带缓冲区的直接);
iRet=设备控制(hDisk,
IOCTL\u SCSI\u通过\u直接,
&sptdwb,
长度,
&sptdwb,
长度,
&bytesReturn,
无效);
如果(0==iRet){
printf(“查询失败”);
返回0;
}否则{
//检查sptdwb.sptd.DataBuffer中返回的数据。
}       
返回0;
}

#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;