Descripciones del búfer para códigos de control de E/S

Los códigos de control de E/S se incluyen en solicitudes de IRP_MJ_DEVICE_CONTROL y IRP_MJ_INTERNAL_DEVICE_CONTROL . El administrador de E/S crea estas solicitudes como resultado de las llamadas a DeviceIoControl y IoBuildDeviceIoControlRequest.

Dado que DeviceIoControl y IoBuildDeviceIoControlRequest aceptan un búfer de entrada y un búfer de salida como argumentos, todas las solicitudes IRP_MJ_DEVICE_CONTROL y IRP_MJ_INTERNAL_DEVICE_CONTROL proporcionan un búfer de entrada y un búfer de salida. La forma en que el sistema describe estos búferes depende del tipo de transferencia de datos. El tipo de transferencia se especifica mediante el valor TransferType de la macro CTL_CODE que crea valores de código IOCTL.

El sistema describe los búferes para cada valor TransferType de la siguiente manera.

METHOD_BUFFERED

Para este tipo de transferencia, los IRP proporcionan un puntero a un búfer en Irp-AssociatedIrp.SystemBuffer>. Este búfer representa tanto el búfer de entrada como el búfer de salida que se especifican en llamadas a DeviceIoControl e IoBuildDeviceIoControlRequest. El controlador transfiere datos de y, a continuación, a este búfer.

Para los datos de entrada, el tamaño del búfer se especifica mediante Parameters.DeviceIoControl.InputBufferLength en la estructura de IO_STACK_LOCATION del controlador. Para los datos de salida, el tamaño del búfer se especifica mediante Parameters.DeviceIoControl.OutputBufferLength en la estructura IO_STACK_LOCATION del controlador.

El tamaño del espacio que asigna el sistema para el único búfer de entrada y salida es mayor de los dos valores de longitud.

METHOD_IN_DIRECT o METHOD_OUT_DIRECT

Para estos tipos de transferencia, los IRP proporcionan un puntero a un búfer en Irp-AssociatedIrp.SystemBuffer>. Representa el primer búfer especificado en llamadas a DeviceIoControl e IoBuildDeviceIoControlRequest. El tamaño del búfer se especifica mediante Parameters.DeviceIoControl.InputBufferLength en la estructura de IO_STACK_LOCATION del controlador.

Para estos tipos de transferencia, los IRP también proporcionan un puntero a un MDL en Irp-MdlAddress>. Representa el segundo búfer especificado en llamadas a DeviceIoControl y IoBuildDeviceIoControlRequest. Este búfer se puede usar como un búfer de entrada o un búfer de salida, como se indica a continuación:

  • METHOD_IN_DIRECT se especifica si el controlador que controla el IRP recibe datos en el búfer cuando se llama a . MdL describe un búfer de entrada y especificando METHOD_IN_DIRECT garantiza que el subproceso en ejecución tenga acceso de lectura al búfer.

  • METHOD_OUT_DIRECT se especifica si el controlador que controla el IRP escribirá datos en el búfer antes de completar el IRP. MdL describe un búfer de salida y especificando METHOD_OUT_DIRECT garantiza que el subproceso en ejecución tenga acceso de escritura al búfer.

Para ambos tipos de transferencia, Parameters.DeviceIoControl.OutputBufferLength especifica el tamaño del búfer descrito por MDL.

METHOD_NEITHER

El administrador de E/S no proporciona ningún búfer del sistema ni MDL. IRP proporciona las direcciones virtuales en modo de usuario de los búferes de entrada y salida especificados en DeviceIoControl o IoBuildDeviceIoControlRequest, sin validarlos ni asignarlos.

Parameters.DeviceIoControl.Type3InputBuffer proporciona la dirección del búfer de entrada en la estructura de IO_STACK_LOCATION del controlador y irp-UserBuffer> especifica la dirección del búfer de salida.

Parameters.DeviceIoControl.InputBufferLength y Parameters.DeviceIoControl.OutputBufferLength proporcionan tamaños de búfer en la estructura IO_STACK_LOCATION del controlador.

Para obtener más información sobre la macro de CTL_CODE y los tipos de transferencia enumerados anteriormente, vea Definición de códigos de control de E/S.