2010-07-23 17 views

Répondre

0

SCSI couvre une grande quantité de terrain. Parlez-vous à un CD/DVD/disque/bande/scanner ou quoi.

Pour les CD/DVD le meilleur (et seulement) référence gratuit pour les commandes setup/lecture/écriture se trouvent ici: http://www.t10.org/drafts.htm

Re SPTI, il y a une documentation très basique dans l'ancien « guide de programmation à SCSI '. Il y a un article sur un convertisseur ASPI -> SPTI qui peut être trouvé sur le site Web de DDJ. Gardez à l'esprit que SPTI est simplement une API, elle n'impose et ne sait rien sur le contenu ou le format des messages SCSI.

  • Brian Sawert, Addison Wesley 1998.
+0

Son SCSI jus pour les disques ..... – Ganesh

0

En outre, les commandes SCSI sont décomposées en un certain nombre de spécifications. La commande INQUIRY est dans la spécification SPC, tandis que les commandes spécifiques au type de périphérique sont décomposées en plusieurs spécifications (par exemple, block, 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; 

}