Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
I/O control codes are contained in IRP_MJ_DEVICE_CONTROL and IRP_MJ_INTERNAL_DEVICE_CONTROL requests. The I/O manager creates these requests as a result of calls to DeviceIoControl and IoBuildDeviceIoControlRequest.
Because DeviceIoControl and IoBuildDeviceIoControlRequest accept both an input buffer and an output buffer as arguments, all IRP_MJ_DEVICE_CONTROL and IRP_MJ_INTERNAL_DEVICE_CONTROL requests supply both an input buffer and an output buffer. Způsob, jakým systém tyto vyrovnávací paměti popisuje, závisí na typu přenosu dat. The transfer type is specified by the TransferType value in the CTL_CODE macro that creates IOCTL code values.
The system describes buffers for each TransferType value as follows.
METHOD_BUFFERED
For this transfer type, IRPs supply a pointer to a buffer at Irp->AssociatedIrp.SystemBuffer. This buffer represents both the input buffer and the output buffer that are specified in calls to DeviceIoControl and IoBuildDeviceIoControlRequest. Ovladač přenáší data z vyrovnávací paměti a poté do ní.
For input data, the buffer size is specified by Parameters.DeviceIoControl.InputBufferLength in the driver's IO_STACK_LOCATION structure. For output data, the buffer size is specified by Parameters.DeviceIoControl.OutputBufferLength in the driver's IO_STACK_LOCATION structure.
Velikost prostoru, který systém přiděluje pro jednu vstupní/výstupní vyrovnávací paměť, je dána tou větší ze dvou hodnot délky.
METHOD_IN_DIRECT nebo METHOD_OUT_DIRECT
For these transfer types, IRPs supply a pointer to a buffer at Irp->AssociatedIrp.SystemBuffer. This represents the first buffer that is specified in calls to DeviceIoControl and IoBuildDeviceIoControlRequest. The buffer size is specified by Parameters.DeviceIoControl.InputBufferLength in the driver's IO_STACK_LOCATION structure.
For these transfer types, IRPs also supply a pointer to an MDL at Irp->MdlAddress. This represents the second buffer that is specified in calls to DeviceIoControl and IoBuildDeviceIoControlRequest. Tuto vyrovnávací paměť lze použít jako vstupní vyrovnávací paměť nebo výstupní vyrovnávací paměť následujícím způsobem:
METHOD_IN_DIRECT je zadán, pokud ovladač, který zpracovává IRP přijímá data do vyrovnávací paměti při jeho zavolání. MDL popisuje vstupní vyrovnávací paměť a zadání METHOD_IN_DIRECT zajišťuje, že spuštěné vlákno má čtecí přístup k vyrovnávací paměti.
METHOD_OUT_DIRECT je zadán, pokud ovladač, který zpracovává IRP, zapíše data do vyrovnávací paměti před dokončením IRP. Popis MDL specifikuje výstupní vyrovnávací paměť a zajišťuje, že provádějící vlákno má přístup k zápisu do vyrovnávací paměti pomocí METHOD_OUT_DIRECT.
For both of these transfer types, Parameters.DeviceIoControl.OutputBufferLength specifies the size of the buffer that is described by the MDL.
METHOD_NEITHER
Správce vstupně-výstupních operací neposkytuje žádné systémové vyrovnávací paměti ani knihovny MDLS. The IRP supplies the user-mode virtual addresses of the input and output buffers that were specified to DeviceIoControl or IoBuildDeviceIoControlRequest, without validating or mapping them.
The input buffer's address is supplied by Parameters.DeviceIoControl.Type3InputBuffer in the driver's IO_STACK_LOCATION structure, and the output buffer's address is specified by Irp->UserBuffer.
Buffer sizes are supplied by Parameters.DeviceIoControl.InputBufferLength and Parameters.DeviceIoControl.OutputBufferLength in the driver's IO_STACK_LOCATION structure.
For more information about the CTL_CODE macro and the transfer types listed above, see Defining I/O Control Codes.