首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Windows中向SCSI设备发送特定的SCSI命令

在Windows中向SCSI设备发送特定的SCSI命令
EN

Stack Overflow用户
提问于 2010-07-23 15:52:50
回答 4查看 9.6K关注 0票数 4

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

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

EN

回答 4

Stack Overflow用户

发布于 2013-02-08 10:45:06

代码语言:javascript
复制
#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;

}

票数 2
EN

Stack Overflow用户

发布于 2010-09-07 23:14:56

SCSI复盖了大量的内容。你说的是CD/DVD/磁盘/磁带/扫描仪还是别的什么。

对于CD/DVD,安装/读/写命令的最佳(也是唯一的)免费参考可以在这里找到:http://www.t10.org/drafts.htm

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

请记住,SPTI只是一个API,它强加也不知道关于SCSI消息内容或格式的任何内容。

  • 布莱恩·索沃特,Addison Wesley 1998。
票数 0
EN

Stack Overflow用户

发布于 2010-11-19 22:38:28

您可以通过发送SCSI IRP将IRP_MJ_SCSI命令发送到SCSI端口驱动程序,请参见http://msdn.microsoft.com/en-us/library/ff565387(VS.85).aspx。但是,您必须自己构建SCSI CBD,而我还没有找到描述它的文档。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3316284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档