IOCTL_ATA_PASS_THROUGH IOCTL (ntddscsi.h)

Consente a un'applicazione di inviare quasi tutti i comandi 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 di 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, un conflitto per il controllo del dispositivo può verificarsi tra il driver della classe e l'applicazione.
  • Questa richiesta non può essere usata se il comando richiede il 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.
L'applicazione chiamante fornisce il contenuto del file di attività ATA per il comando previsto nella struttura ATA_PASS_THROUGH_EX . Il sistema esegue il doppio buffer di tutti i trasferimenti di dati. Questa richiesta viene in genere usata per il trasferimento di piccole quantità di dati (minore di 16 KB).

Codice principale

IRP_MJ_DEVICE_CONTROL

Buffer di input

Il buffer in Irp-AssociatedIrp.SystemBuffer> deve contenere una struttura ATA_PASS_THROUGH_EX, che include un set di registri di input dei file di attività che indicano l'ordinamento di comando da eseguire e i relativi parametri. Il chiamante deve inizializzare tutti i membri di questa struttura, ad eccezione di PathId, TargetId e Lun, che il driver di porta inserisce. Per un comando di dataout, il membro DataBufferOffset 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 sizeof (ATA_PASS_THROUGH_EX), il driver della porta ha esito negativo sulla richiesta di I/O e restituisce un errore.

Buffer di output

Il driver di porta formatta i dati restituiti usando una struttura ATA_PASS_THROUGH_EX e archivia i dati nel buffer in Irp-AssociatedIrp.SystemBuffer>.

Il driver di 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 dati, il driver di porta archivia i dati trasferiti in un buffer allineato alla cache che si trova in un offset di byte di DataBufferOffset 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 di 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 dello stato

Il membro Information è impostato sul numero di byte restituiti nel buffer di output in Irp-AssociatedIrp.SystemBuffer>. Il membro Status è 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.

Requisiti

Requisito Valore
Client minimo supportato Disponibile a partire da Windows Server 2003.
Intestazione ntddscsi.h (include Ntddscsi.h)

Vedi anche

ATA_PASS_THROUGH_EX

IOCTL_ATA_PASS_THROUGH_DIRECT