Condividi tramite


IOCTL_ATA_PASS_THROUGH_DIRECT IOCTL (ntddscsi.h)

IOCTL_ATA_PASS_THROUGH_DIRECT 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 solo se non è presente alcun driver di classe per il dispositivo.

  • L'applicazione deve usare questa richiesta anziché IOCTL_ATA_PASS_THROUGH se il comando ATA incorporato potrebbe richiedere al driver miniport sottostante di accedere direttamente alla memoria.

Se il comando ATA richiede un'operazione di trasferimento dei dati, il chiamante deve configurare un buffer allineato alla cache da cui o in cui il driver può trasferire direttamente i dati. Il chiamante deve garantire quanto segue:

  • La lunghezza del trasferimento dei dati soddisfa il requisito di allineamento dell'I/O del dispositivo; in caso contrario, questo IOCTL ha esito negativo con STATUS_INVALID_PARAMETER.
  • La lunghezza del trasferimento dei dati non deve essere maggiore della lunghezza massima del trasferimento di I/O del dispositivo; in caso contrario, è previsto che il dispositivo non riuscirà a eseguire la richiesta.

La richiesta di IOCTL_ATA_PASS_THROUGH_DIRECT viene in genere usata per trasferire grandi quantità di dati (più di 16 KB).

Codice principale

IRP_MJ_DEVICE_CONTROL

Buffer di input

Il buffer in corrispondenza di Irp->AssociatedIrp.SystemBuffer contiene una struttura ATA_PASS_THROUGH_DIRECT che include un set di registri di input del file di attività che indicano l'ordinamento del comando da eseguire. 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 membro databuffer di ATA_PASS_THROUGH_DIRECT 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. Il valore di inputBufferLength è fisso e non dipende dalla quantità di dati trasferiti. È uguale a sizeof(ATA_PASS_THROUGH_DIRECT). Se le dimensioni del buffer sono inferiori a sizeof(ATA_PASS_THROUGH_DIRECT), 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_DIRECT archiviata nel buffer in Irp->AssociatedIrp.SystemBuffer.

Il driver della porta archivia i dati trasferiti nel buffer allineato alla cache a cui punta il membro databuffer di ATA_PASS_THROUGH_DIRECT.

Il driver della porta riempie il currentTaskFile membro di ATA_PASS_THROUGH_DIRECT con i valori presenti nei registri di output del dispositivo al completamento del comando ATA. 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 DataTransferLength membro della struttura ATA_PASS_THROUGH_DIRECT per indicare la quantità di dati trasferiti dal dispositivo.

Buffer di input/output

Nessuno.

Lunghezza del buffer di input/output

Non applicabile.

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 lunghezza di input in ATA_PASS_THROUGH_DIRECT è impostato in modo non corretto.

Fabbisogno

Requisito Valore
client minimo supportato Windows Server 2003
intestazione ntddscsi.h (include Ntddscsi.h)

Vedere anche

ATA_PASS_THROUGH_DIRECT

IOCTL_ATA_PASS_THROUGH