Descrizioni del buffer per i codici di controllo I/O

I codici di controllo I/O sono contenuti nelle richieste di IRP_MJ_DEVICE_CONTROL e IRP_MJ_INTERNAL_DEVICE_CONTROL . La gestione I/O crea queste richieste come risultato delle chiamate a DeviceIoControl e IoBuildDeviceIoControlRequest.

Poiché DeviceIoControl e IoBuildDeviceIoControlRequest accettano sia un buffer di input che un buffer di output come argomenti, tutte le richieste di IRP_MJ_DEVICE_CONTROL e IRP_MJ_INTERNAL_DEVICE_CONTROL forniscono sia un buffer di input che un buffer di output. Il modo in cui il sistema descrive questi buffer dipende dal tipo di trasferimento dei dati. Il tipo di trasferimento viene specificato dal valore TransferType nella macro CTL_CODE che crea valori di codice IOCTL.

Il sistema descrive i buffer per ogni valore TransferType come indicato di seguito.

METHOD_BUFFERED

Per questo tipo di trasferimento, i provider di servizi di integrazione forniscono un puntatore a un buffer in Irp-AssociatedIrp.SystemBuffer>. Questo buffer rappresenta sia il buffer di input che il buffer di output specificato nelle chiamate a DeviceIoControl e IoBuildDeviceIoControlRequest. Il driver trasferisce i dati fuori e quindi in questo buffer.

Per i dati di input, le dimensioni del buffer sono specificate da Parameters.DeviceIoControl.InputBufferLength nella struttura di IO_STACK_LOCATION del driver. Per i dati di output, la dimensione del buffer viene specificata da Parameters.DeviceIoControl.OutputBufferLength nella struttura IO_STACK_LOCATION del driver.

La dimensione dello spazio allocato dal sistema per il singolo buffer di input/output è maggiore dei due valori di lunghezza.

METHOD_IN_DIRECT o METHOD_OUT_DIRECT

Per questi tipi di trasferimento, i provider di servizi di integrazione forniscono un puntatore a un buffer in Irp-AssociatedIrp.SystemBuffer>. Questo rappresenta il primo buffer specificato nelle chiamate a DeviceIoControl e IoBuildDeviceIoControlRequest. Le dimensioni del buffer sono specificate da Parameters.DeviceIoControl.InputBufferLength nella struttura di IO_STACK_LOCATION del driver.

Per questi tipi di trasferimento, i provider di integrazione forniscono anche un puntatore a un MDL in Irp-MdlAddress>. Questo rappresenta il secondo buffer specificato nelle chiamate a DeviceIoControl e IoBuildDeviceIoControlRequest. Questo buffer può essere usato come buffer di input o buffer di output, come indicato di seguito:

  • METHOD_IN_DIRECT viene specificato se il driver che gestisce l'IRP riceve i dati nel buffer quando viene chiamato. MDL descrive un buffer di input e specifica METHOD_IN_DIRECT garantisce che il thread in esecuzione abbia accesso in lettura al buffer.

  • METHOD_OUT_DIRECT viene specificato se il driver che gestisce l'IRP scriverà i dati nel buffer prima di completare l'IRP. MDL descrive un buffer di output e specificando METHOD_OUT_DIRECT garantisce che il thread in esecuzione abbia accesso in scrittura al buffer.

Per entrambi questi tipi di trasferimento, Parameters.DeviceIoControl.OutputBufferLength specifica le dimensioni del buffer descritto da MDL.

METHOD_NEITHER

Il gestore di I/O non fornisce buffer di sistema o MDL. L'IRP fornisce gli indirizzi virtuali in modalità utente dei buffer di input e output specificati in DeviceIoControl o IoBuildDeviceIoControlRequest, senza convalidarli o mapping.

L'indirizzo del buffer di input viene fornito da Parameters.DeviceIoControl.Type3InputBuffernella struttura IO_STACK_LOCATION del driver e l'indirizzo del buffer di output viene specificato da Irp-UserBuffer>.

Le dimensioni del buffer vengono fornite da Parameters.DeviceIoControl.InputBufferLength e Parameters.DeviceIoControl.OutputBufferLength nella struttura IO_STACK_LOCATION del driver.

Per altre informazioni sulla macro CTL_CODE e sui tipi di trasferimento elencati in precedenza, vedere Definizione dei codici di controllo di I/O.