Funzione IoBuildDeviceIoControlRequest (wdm.h)

La routine IoBuildDeviceIoControlRequest alloca e configura un'istanza di IRP per una richiesta di controllo del dispositivo sincronamente elaborata.

Sintassi

__drv_aliasesMem PIRP IoBuildDeviceIoControlRequest(
  [in]            ULONG            IoControlCode,
  [in]            PDEVICE_OBJECT   DeviceObject,
  [in, optional]  PVOID            InputBuffer,
  [in]            ULONG            InputBufferLength,
  [out, optional] PVOID            OutputBuffer,
  [in]            ULONG            OutputBufferLength,
  [in]            BOOLEAN          InternalDeviceIoControl,
  [in, optional]  PKEVENT          Event,
  [out]           PIO_STATUS_BLOCK IoStatusBlock
);

Parametri

[in] IoControlCode

Fornisce il codice di controllo I/O (IOCTL) da usare nella richiesta. Per informazioni sui codici di controllo I/O specifici dei tipi di dispositivo, vedere sezioni specifiche del tipo di dispositivo nel Kit driver di Windows (WDK).

[in] DeviceObject

Fornisce un puntatore alla struttura DEVICE_OBJECT per l'oggetto dispositivo del driver inferiore successivo, che rappresenta il dispositivo di destinazione.

[in, optional] InputBuffer

Fornisce un puntatore a un buffer di input da passare al driver inferiore o NULL se la richiesta non passa i dati di input ai driver inferiori.

[in] InputBufferLength

Fornisce la lunghezza, in byte, del buffer di input. Se InputBuffer è NULL, InputBufferLength deve essere zero.

[out, optional] OutputBuffer

Fornisce un puntatore a un buffer di output in cui il driver inferiore restituisce dati o NULL se la richiesta non richiede driver inferiori per restituire i dati.

[in] OutputBufferLength

Fornisce la lunghezza, in byte, del buffer di output. Se OutputBuffer è NULL, OutputBufferLength deve essere zero.

[in] InternalDeviceIoControl

Se TRUE, la routine imposta il codice della funzione principale dell'IRP su IRP_MJ_INTERNAL_DEVICE_CONTROL. In caso contrario, la routine imposta il codice di funzione principale di IRP su IRP_MJ_DEVICE_CONTROL.

[in, optional] Event

Fornisce un puntatore a un oggetto evento allocato dal chiamante e inizializzato. Gestione I/O imposta l'evento sullo stato segnalato quando un driver di livello inferiore completa l'operazione richiesta. Dopo aver chiamato IoCallDriver, il driver può attendere l'oggetto evento. Il parametro Event è facoltativo e può essere impostato su NULL. Tuttavia, se Event è NULL, il chiamante deve fornire una routine IoCompletion per l'IRP per notificare al chiamante al termine dell'operazione.

[out] IoStatusBlock

Specifica un blocco di stato di I/O da impostare quando la richiesta viene completata da driver inferiori.

Valore restituito

Se l'operazione ha esito positivo, IoBuildDeviceIoControlRequest restituisce un puntatore a un'IRP, con la posizione dello stack I/O del driver inferiore successivo configurata dai parametri forniti. In caso contrario, la routine restituisce NULL.

Commenti

Un driver può chiamare IoBuildDeviceIoControlRequest per configurare irP per le richieste di controllo del dispositivo che invia in modo sincrono ai driver di livello inferiore.

Dopo aver chiamato IoBuildDeviceIoControlRequest per creare una richiesta, il driver deve chiamare IoCallDriver per inviare la richiesta al driver inferiore successivo. Se IoCallDriver restituisce STATUS_PENDING, il driver deve attendere il completamento dell'IRP chiamando KeWaitForSingleObjectnell'evento specificato. La maggior parte dei driver non deve impostare una routine IoCompletion per l'IRP .

Gli IRP creati da IoBuildDeviceIoControlRequest devono essere completati dalla chiamata di un driver a IoCompleteRequest. Un driver che chiama IoBuildDeviceIoControlRequest non deve chiamare IoFreeIrp, perché il gestore I/O libera questi IRP sincroni dopo la chiamata di IoCompleteRequest .

IoBuildDeviceIoControlRequest accoda gli indirizzi IP creati in una coda IRP specifica del thread corrente. Se il thread viene chiuso, il gestore di I/O annulla l'IRP.

Se il chiamante fornisce un parametro InputBuffer o OutputBuffer , questo parametro deve puntare a un buffer che risiede nella memoria di sistema. Il chiamante è responsabile della convalida di tutti i valori dei parametri copiati nel buffer di input da un buffer in modalità utente. Il buffer di input può contenere valori di parametro interpretati in modo diverso a seconda che l'origine della richiesta sia un'applicazione in modalità utente o un driver in modalità kernel. Nell'IRP restituito da IoBuildDeviceIoControlRequest , il campo RequestorMode è sempre impostato su KernelMode. Questo valore indica che la richiesta e tutte le informazioni contenute nella richiesta provengono da un componente in modalità kernel attendibile.

Se il chiamante non può convalidare i valori dei parametri copiati da un buffer in modalità utente al buffer di input oppure se questi valori non devono essere interpretati come provenienti da un componente in modalità kernel, il chiamante deve impostare il campo RequestorMode in UserMode. Questa impostazione informa il driver che gestisce la richiesta di controllo I/O che il buffer contiene dati in modalità utente non attendibili.

Il metodo effettivo in base al quale i contenuti dei parametri InputBuffer e OutputBuffer vengono archiviati in IRP dipendono dal valore TransferType per IOCTL. Per altre informazioni su questo valore, vedere Descrizioni del buffer per i codici di controllo I/O.

Requisiti

Requisito Valore
Client minimo supportato Disponibile a partire da Windows 2000.
Piattaforma di destinazione Universale
Intestazione wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
Libreria NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= APC_LEVEL
Regole di conformità DDI HwStorPortProhibitedDDDIs(storport), IoAllocateIrpSignalEventInCompletion(wdm), IoAllocateIrpSignalEventInCompletion2(wdm), IoAllocateIrpSignalEventInCompletion3(wdm), IoBuildDeviceControlNoFree(wdm), IoBuildDeviceControlWait(wdm), IoBuildDeviceControlWaitTimeout(wdm), IoBuildDeviceIoControlSetEvent(wdm), IrqlIoPassive1(wdm), PowerIrpDDis(wdm),SignalEventInCompletion(wdm)

Vedi anche

IO_STACK_LOCATION

IRP

IoAllocateIrp

IoBuildAsynchronousFsdRequest

IoBuildSynchronousFsdRequest

IoCallDriver

IoCompleteRequest

KeInitializeEvent

KeWaitForSingleObject