IRP_MJ_DEVICE_CONTROL (controladores de filtro y FS)

Cuándo se envió

El Administrador de E/S, otros componentes del sistema operativo y otros controladores en modo kernel envían IRP_MJ_DEVICE_CONTROL solicitudes. Normalmente, este IRP se envía en nombre de una aplicación en modo de usuario que ha llamado a la función DeviceIoControl de Win32 o en nombre de un componente en modo kernel que ha llamado ZwDeviceIoControlFile.

Operación: controladores del sistema de archivos

El controlador del sistema de archivos debe extraer y descodificar el objeto de archivo para determinar si la solicitud se ha emitido en un identificador que es un volumen abierto. Si es así, el controlador del sistema de archivos debe pasar el IRP al controlador de dispositivo para el dispositivo de almacenamiento en el que se monta el volumen. Si no es así, el controlador debe producir un error en el IRP.

Operación: controladores de filtro del sistema de archivos heredados

El controlador de filtro debe realizar cualquier procesamiento necesario y, dependiendo de la naturaleza del filtro, complete el IRP o páselo al controlador siguiente inferior de la pila.

Parámetros

Un controlador de filtro o sistema de archivos llama a IoGetCurrentIrpStackLocation para que el IRP determinado obtenga un puntero a su propia ubicación de pila en el IRP. En los parámetros siguientes, Irp apunta al IRP e IrpSp apunta al IO_STACK_LOCATION. El controlador puede usar la información establecida en los siguientes miembros del IRP y la ubicación de la pila irP para procesar una solicitud de control de dispositivo.

  • DeviceObject es un puntero al objeto de dispositivo de destino.

  • Irp->AssociatedIrp.SystemBuffer apunta a un búfer de entrada proporcionado por el sistema que se pasará al controlador de dispositivo para el dispositivo de destino. Se usa para METHOD_BUFFERED o E/S de METHOD_DIRECT. Si este parámetro es necesario depende del código de control de E/S específico.

  • Irp->IoStatus apunta a una estructura de IO_STATUS_BLOCK que recibe el estado de finalización final e información sobre la operación solicitada. Para obtener más información, vea la descripción del parámetro IoStatusBlock en ZwDeviceIoControlFile.

  • Irp->MdlAddress es la dirección de una lista de descriptores de memoria (MDL) que describe un búfer de salida que se va a pasar al controlador de dispositivo para el dispositivo de destino. Se usa para METHOD_DIRECT E/S. Si este parámetro es necesario depende del código de control de E/S específico.

  • Irp->RequestorMode indica el modo de ejecución del proceso que solicitó la operación, ya sea KernelMode o UserMode.

  • Irp->UserBuffer apunta a un búfer de salida proporcionado por el autor de la llamada que se pasará al controlador de dispositivo para el dispositivo de destino. Se usa para METHOD_BUFFERED o E/S de METHOD_NEITHER. Si este parámetro es opcional o necesario depende del código de control de E/S específico.

  • IrpSp->FileObject apunta al objeto de archivo asociado a DeviceObject.

    El parámetro IrpSp-FileObject> contiene un puntero al campo RelatedFileObject, que también es una estructura de FILE_OBJECT. El campo RelatedFileObject de la estructura FILE_OBJECT no es válido durante el procesamiento de IRP_MJ_DEVICE_CONTROL y no se debe usar.

  • IrpSp->MajorFunction se establece en IRP_MJ_DEVICE_CONTROL.

  • IrpSp->Parameters.DeviceIoControl.InputBufferLength es el tamaño en bytes del búfer al que apunta Irp-AssociatedIrp.SystemBuffer>.

  • IrpSp->Parameters.DeviceIoControl.IoControlCode es el código de función IOCTL que se pasará al controlador de dispositivo para el dispositivo de destino.

    Para obtener información detallada sobre las solicitudes IOCTL, consulte Uso de códigos de control de E /S y "Códigos de control de entrada y salida de dispositivo" en la documentación de Windows SDK.

  • IrpSp->Parameters.DeviceIoControl.OutputBufferLength es el tamaño en bytes del búfer al que apunta Irp-UserBuffer>.

  • IrpSp->Parameters.DeviceIoControl.Type3InputBuffer es el búfer de entrada para las solicitudes en modo kernel que usan METHOD_NEITHER.

Consulte también

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoBuildDeviceIoControlRequest

IoGetCurrentIrpStackLocation

IoGetFunctionCodeFromCtlCode

IRP

IRP_MJ_DEVICE_CONTROL (referencia del kernel de WDK)

Uso de códigos de control de E/S

ZwDeviceIoControlFile