Share via


Escribir rutinas DPC

Las principales responsabilidades de las rutinas DpcForIsr y CustomDpc garantizan que la siguiente operación de E/S del dispositivo se inicie rápidamente y complete el IRP actual.

El trabajo adicional realizado por cualquier rutina DpcForIsr o CustomDpc depende del diseño del controlador y de la naturaleza del dispositivo. Por ejemplo, una rutina DpcForIsr o CustomDpc también puede realizar cualquiera de las siguientes acciones:

  • Vuelva a intentar una operación que ha agotado el tiempo de espera o ha producido un error.

  • Llame a IoAllocateErrorLogEntry, configure un paquete de registro de errores para notificar un error de E/S del dispositivo y llame a IoWriteErrorLogEntry.

    Para obtener más información sobre el control de errores de E/S, consulte Registro de errores.

  • Si el controlador usa E/S almacenada en búfer o si el IRP especifica una operación de control de dispositivo, transfiera los datos leídos desde el dispositivo al búfer del sistema en Irp-AssociatedIrp.SystemBuffer> antes de completar el IRP.

  • Si el controlador usa E/S directa y debe dividir las transferencias grandes en partes más pequeñas, guarde el estado sobre cada operación de transferencia parcial recién completada, calcule el siguiente intervalo de transferencia parcial y use una rutina SynchCritSection suministrada por el controlador para programar el dispositivo para la siguiente operación de transferencia parcial.

    Incluso un controlador que usa E/S almacenada en búfer podría tener que dividir una solicitud de transferencia si su dispositivo tiene funcionalidades de transferencia limitadas.

  • Si el controlador usa DMA basado en paquetes, llama a FlushAdapterBuffers después de cada operación de transferencia del dispositivo y llama a FreeAdapterChannel o FreeMapRegisters cuando se realiza una secuencia de transferencias parciales y se satisface la solicitud de transferencia completa.

    Si una transferencia solicitada solo se satisface parcialmente mediante una sola operación DMA, la rutina DpcForIsr o CustomDpc suele ser responsable de configurar una o varias operaciones DMA hasta que el número especificado de bytes del IRP se haya transferido por completo.

    Para obtener más información sobre el uso de DMA, vea Objetos de adaptador y DMA.

  • Si el controlador usa E/S programada (PIO), llame a KeFlushIoBuffers al final de cada operación de transferencia si el IRP actual solicita una lectura.

    Si una transferencia solicitada solo se satisface parcialmente mediante una única operación PIO, la rutina DpcForIsr o CustomDpc suele ser responsable de configurar una o varias operaciones de transferencia hasta que se haya transferido completamente el número especificado de bytes del IRP.

    Para obtener más información sobre el uso de PIO, consulte Uso de E/S directa.

  • Si un controlador que no es WDM tiene una rutina ControllerControl , llame a IoFreeController cuando se complete una operación solicitada.

Tenga en cuenta que una rutina DpcForIsr o CustomDpc normalmente realiza la mayor parte del procesamiento de E/S del dispositivo del controlador para satisfacer los IRP. Estas rutinas también comparten parte de la responsabilidad de poner en cola los IRP en el dispositivo con las rutinas de envío del controlador.

Tenga en cuenta las siguientes directrices generales de diseño.

  • Cualquier rutina DpcForIsr o CustomDpc debe llamar a IoStartNextPacket tan pronto como pueda realizar esta llamada de forma segura: es decir, sin causar posiblemente un conflicto de recursos o una condición de carrera con la rutina StartIo del controlador o con cualquier otra rutina que la rutina StartIo provoque la ejecución.

  • Si un controlador administra su propia cola de IRP, su rutina DpcForIsr o CustomDpc debe notificar al controlador tan pronto como sea seguro quitar de la cola el siguiente IRP y configurar el dispositivo para la siguiente solicitud.

Una rutina DpcForIsr o CustomDpc debe llamar a IoStartNextPacket o, de lo contrario, notificar a la rutina de controlador adecuada cuando se pueda iniciar el procesamiento de E/S del dispositivo para la siguiente solicitud. Según el controlador y su dispositivo, esto puede ocurrir bien antes de que la rutina DpcForIsr o CustomDpc complete el IRP actual con IoCompleteRequest, o puede producirse inmediatamente antes de que esta rutina complete el IRP actual y devuelva el control.