IOCTL_ATA_PASS_THROUGH IOCTL (ntddscsi.h)
Consente a un'applicazione di inviare quasi qualsiasi comando ATA a un dispositivo di destinazione, con le restrizioni seguenti:
- Se esiste un driver di classe per il tipo di dispositivo di destinazione, l'applicazione deve inviare la richiesta al driver di classe. Pertanto, un'applicazione può inviare questa richiesta direttamente al driver della porta di sistema per un'unità logica di destinazione (LU) solo se non è presente alcun driver di classe per il tipo di dispositivo connesso a tale lu. Il driver della porta di sistema non verifica se un dispositivo è stato richiesto da un driver di classe prima di elaborare una richiesta pass-through. Pertanto, se un'applicazione ignora un driver di classe che ha richiesto un dispositivo e invia una richiesta pass-through per tale dispositivo direttamente al driver della porta, può verificarsi un conflitto per il controllo del dispositivo tra il driver di classe e l'applicazione.
- Questa richiesta non può essere usata se il comando richiede al driver sottostante di accedere direttamente alla memoria. Se il comando del chiamante potrebbe richiedere l'accesso diretto alla memoria, usare IOCTL_ATA_PASS_THROUGH_DIRECT.
- Le applicazioni non devono tentare di inviare una richiesta pass-through in modo asincrono. Tutte le richieste pass-through devono essere sincrone.
- Le applicazioni non richiedono privilegi amministrativi per inviare una richiesta pass-through a un dispositivo, ma devono avere accesso in lettura/scrittura al dispositivo.
Codice principale
Buffer di input
Il buffer in corrispondenza di Irp->AssociatedIrp.SystemBuffer deve contenere una struttura ATA_PASS_THROUGH_EX, che include un set di registri di input del file di attività che indicano l'ordinamento del comando da eseguire e i relativi parametri. Il chiamante deve inizializzare tutti i membri di questa struttura ad eccezione di PathId, TargetIde Lun, in cui viene compilato il driver della porta. Per un comando di dataout, il DataBufferOffset membro della struttura deve puntare a un buffer allineato alla cache contenente i dati da scrivere.
Lunghezza del buffer di input
Parameters.DeviceIoControl.InputBufferLength indica le dimensioni in byte del buffer in Irp->AssociatedIrp.SystemBuffer. Se il comando ATA incorporato è un'operazione di scrittura, le dimensioni del buffer di input devono essere la somma di sizeof(ATA_PASS_THROUGH_EX) e il valore nel membro DataTransferLength di ATA_PASS_THROUGH_EX. Nell'esempio di pseudocodice seguente viene illustrato come calcolare le dimensioni del buffer:ULONG buffsize; // size of the buffer
ATA_PASS_THROUGH_EX hdr;
hdr.DataTransferLength = size in bytes of the data transfer
buffsize = sizeof (ATA_PASS_THROUGH_EX) + hdr.DataTransferLength
Se il comando ATA incorporato è un'operazione di lettura o un'operazione di controllo del dispositivo che non comporta il trasferimento dei dati, inputBufferLength deve essere uguale a sizeof (ATA_PASS_THROUGH_EX).
In entrambi i casi, se InputBufferLength è minore di dimensioni di (ATA_PASS_THROUGH_EX), il driver della porta non riesce la richiesta di I/O e restituisce un errore.
Buffer di output
Il driver della porta formatta i dati restituiti usando una struttura di ATA_PASS_THROUGH_EX e archivia i dati nel buffer in corrispondenza di Irp->AssociatedIrp.SystemBuffer.
Il driver della porta riempie il membro CurrentTaskFile con i valori presenti nei registri di output del dispositivo al completamento del comando ATA incorporato. Se il comando era un trasferimento dei dati, il driver della porta archivia i dati trasferiti in un buffer allineato alla cache che si trova in corrispondenza di un offset di DataBufferOffset byte dall'inizio della struttura. L'applicazione è responsabile dell'interpretazione del contenuto dei registri di output per determinare quali errori, se presenti, sono stati restituiti dal dispositivo.
Lunghezza del buffer di output
Il driver della porta aggiorna il membro DataTransferLength di ATA_PASS_THROUGH_EX per indicare la quantità di dati effettivamente trasferiti dal dispositivo. Se il comando ATA incorporato è un'operazione di scrittura o un'operazione di controllo del dispositivo che non trasferisce i dati, OutputBufferLength è uguale a sizeof(ATA_PASS_THROUGH_EX). Se il comando ATA incorporato è un'operazione di lettura, OutputBufferLength è uguale a sizeof(ATA_PASS_THROUGH_EX) + DataTransferLength.
Blocco di stato
Il membro Information è impostato sul numero di byte restituiti nel buffer di output in Irp->AssociatedIrp.SystemBuffer. Il membro stato è impostato su STATUS_SUCCESS o eventualmente su STATUS_BUFFER_TOO_SMALL o STATUS_INVALID_PARAMETER se il valore stato di input in ATA_PASS_THROUGH_EX è impostato in modo non corretto.
Fabbisogno
Requisito | Valore |
---|---|
client minimo supportato | Disponibile a partire da Windows Server 2003. |
intestazione | ntddscsi.h (include Ntddscsi.h) |