Отправка определенной команды SCSI на устройство SCSI в Windows - PullRequest
4 голосов
/ 23 июля 2010

Имеет ли Windows особый интерфейс, с помощью которого я могу отправить определенную команду scsi, например, запрос на устройство scsi? Я искал в сети, нашел проходную ссылку на интерфейс SCSI Pass Through. Но это очень расплывчато.

Есть ли для этого API документация о том, как его использовать ??

Ответы [ 4 ]

2 голосов
/ 08 февраля 2013
#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;

}

0 голосов
/ 19 ноября 2010

Вы можете отправлять команды SCSI драйверу порта SCSI, отправив ему IRP_MJ_SCSI IRP, см. http://msdn.microsoft.com/en-us/library/ff565387(VS.85).aspx. Однако вам придется создать SCD CBD самостоятельно, и мне еще предстоит найти документ, который описывает его.

0 голосов
/ 02 июня 2012

Более того, команды SCSI разбиты на ряд спецификаций. Команда INQUIRY находится в спецификации SPC, а команды, относящиеся к типу устройства, разбиты на несколько спецификаций (например, block, ses, ...).

0 голосов
/ 07 сентября 2010

SCSI охватывает огромное количество территории. Вы говорите с CD / DVD / диском / магнитофоном / сканером или чем-то подобным.

Для CD / DVD лучший (и единственный) бесплатный справочник по командам настройки / чтения / записи находится здесь: http://www.t10.org/drafts.htm

Что касается SPTI, в старом «Руководстве для программистов по SCSI» есть некоторая базовая документация. Есть статья о преобразователе ASPI -> SPTI, которую можно найти на веб-сайте DDJ.

Имейте в виду, что SPTI - это просто API, он не навязывает и не знает ничего о содержании или формате сообщений SCSI.

  • Brian Sawert, Addison Wesley 1998.
...