4

Windowsには、照会などの特定のscsiコマンドをscsiデバイスに送信できる特定のインターフェイスがありますか?ネットを検索したところ、SCSIパススルーインターフェイスへの参照が渡されていることがわかりました。しかし、それは非常に曖昧です。

そのAPIの使用方法に関するドキュメントはありますか?

4

4 に答える 4

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

}

于 2013-02-08T02:45:05.977 に答える
0

もう、SCSI コマンドはいくつかの仕様に分割されています。INQUIRY コマンドは SPC 仕様に含まれていますが、デバイス タイプ固有のコマンドは複数の仕様 (つまり、block、ses、...) に分割されています。

于 2012-06-02T04:20:34.477 に答える
0

IRP_MJ_SCSI IRP を送信することにより、SCSI ポート ドライバーに SCSI コマンドを送信できます。 http://msdn.microsoft.com/en-us/library/ff565387(VS.85).aspxを参照してください。ただし、SCSI CBD は自分で作成する必要があり、それについて説明しているドキュメントはまだ見つかっていません。

于 2010-11-19T14:38:27.937 に答える
0

SCSI は広大な分野をカバーしています。CD/DVD/ディスク/テープ/スキャナーまたは何と話しているのですか。

CD/DVD については、セットアップ/読み取り/書き込みコマンドの最良の (そして唯一の) 無料リファレンスがここにあります: http://www.t10.org/drafts.htm

SPTI に関しては、古い「Programmers guide to SCSI」に非常に基本的なドキュメントがいくつかあります。DDJ の Web サイトに、ASPI -> SPTI コンバーターに関する記事があります。

SPTI は単なる API であり、SCSI メッセージの内容や形式について何も課したり認識したりしないことに注意してください。

  • ブライアン・サワート、アディソン・ウェズリー 1998.
于 2010-09-07T15:14:55.753 に答える