2010-07-23 246 views
3

Windows是否具有特定的接口,通過該接口我可以向scsi設備發送特定的scsi命令(如查詢)?我搜索了網絡,發現傳遞引用了SCSI Pass Through接口。但它非常模糊。向Windows中的SCSI設備發送特定的SCSI命令

有沒有關於如何使用它的API的任何文檔?

回答

0

SCSI覆蓋了大量的地面。你在和CD/DVD /磁盤/磁帶/掃描儀交談嗎?

對於CD/DVD的最佳也是唯一的免費設置參考/讀/寫命令都可以在這裏找到:http://www.t10.org/drafts.htm

重新SPTI,有舊「程序員指南,在一些非常基本的文檔SCSI」。有關ASPI - > SPTI轉換器的文章可以在DDJ網站上找到。

請記住,SPTI只是一個API,它強加或不瞭解SCSI消息內容或格式。

  • 布賴恩Sawert,艾迪生韋斯利1998年
+0

其強制SCSI磁盤用於..... – Ganesh 2010-09-08 11:04:06

0

再次,SCSI命令被分解成許多規格。 INQUIRY命令在SPC規範中,而特定於設備類型的命令被分解成幾個規格(即塊,ses,...)。

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; 

}