Compartir a través de


IRP_MJ_INTERNAL_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 solicitudes IRP_MJ_INTERNAL_DEVICE_CONTROL.

A diferencia de las solicitudes de IRP_MJ_DEVICE_CONTROL , las solicitudes de IRP_MJ_INTERNAL_DEVICE_CONTROL solo se usan para la comunicación entre los componentes del modo kernel. Aunque una solicitud de IRP_MJ_DEVICE_CONTROL normalmente se origina con una llamada a DeviceIoControl o ZwDeviceIoControlFile, estas rutinas no pueden crear solicitudes IRP_MJ_INTERNAL_DEVICE_CONTROL. Sin embargo, ambos tipos de IRP se pueden crear llamando a IoBuildDeviceIoControlRequest.

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 representa 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, en función 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 con el IRP especificado para obtener un puntero a su propia ubicación de pila en irP, que se muestra en la lista siguiente como IrpSp. (IrP se muestra como Irp). El controlador puede usar la información que se establece en los siguientes miembros del IRP y la ubicación de pila de IRP en el procesamiento de 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 METHOD_DIRECT E/S. 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. Este parámetro se usa para METHOD_BUFFERED o METHOD_NEITHER E/S. 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 FILE_OBJECT. El campo RelatedFileObject de la estructura FILE_OBJECT no es válido durante el procesamiento de IRP_MJ_INTERNAL_DEVICE_CONTROL y no se debe usar.

  • IrpSp->MajorFunction se establece en IRP_MJ_INTERNAL_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 Using I/O Control Codes (Uso de códigos de control de E/ S) y "Device Input and Output Control Codes" (Códigos de control de entrada y salida del 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 mediante METHOD_NEITHER.

Consulte también

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoBuildDeviceIoControlRequest

IoGetCurrentIrpStackLocation

IoGetFunctionCodeFromCtlCode

IRP

IRP_MJ_DEVICE_CONTROL

IRP_MJ_INTERNAL_DEVICE_CONTROL (referencia del kernel de WDK)

Usar códigos de control de E/S

ZwDeviceIoControlFile