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

标签 windows winapi device-driver scsi

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

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

关于windows - 在 Windows 中向 SCSI 设备发送特定的 SCSI 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3316284/

相关文章:

windows - 如何在批处理文件中的for循环中做可变长度的子字符串?

winapi - 如何通过程序发送硬件级键盘输入?

windows - 示例代码 : A service calls CreateProcessAsUser() I want the process to run in the user's session, 不是 session 0

c# - 以编程方式安装设备驱动程序

linux - Linux 设备驱动程序开发书籍/教程/视频讲座

macos - USB,火线和串行端口的唯一设备标识符

windows - 轮转由 nxlog 创建的文件

css - Windows 上的 Sass(Ruby CSS 压缩器)绝对路径参数

windows编程: grab audio without the driver supporting "Stereo Mix

C++ RegEnumValue() - 无法迭代到每个值