Puntos a tener en cuenta para las rutinas StartIo
Tenga en cuenta los siguientes puntos al implementar una rutina StartIo :
Una rutina StartIo debe sincronizar su acceso a un dispositivo físico y a cualquier información de estado compartido o recursos que el controlador mantiene en la extensión del dispositivo con las demás rutinas del controlador que acceden al mismo dispositivo, ubicación de memoria o recursos.
Si la rutina StartIo comparte el dispositivo o el estado con el ISR, debe usar KeSynchronizeExecution para llamar a una rutina SynchCritSection proporcionada por el controlador para programar el dispositivo o para acceder al estado compartido. Para obtener más información, consulte Uso de secciones críticas.
Si la rutina StartIo comparte el estado o los recursos con rutinas que no sean el ISR, debe proteger el estado compartido o los recursos con un bloqueo de giro ejecutivo inicializado por el controlador para el que el controlador proporciona el almacenamiento. Para obtener más información, consulte Bloqueos de número.
Si un controlador de dispositivo no WDM monolítico configura un objeto de controlador, su rutina StartIo puede usar el objeto controller para sincronizar las operaciones a través de un dispositivo físico compartido con dispositivos conectados (similares).
Consulte Objetos de controlador para obtener más información.
A menos que un controlador de nivel superior estrechamente acoplado presplits las solicitudes de transferencia de DMA grandes para su controlador de dispositivo subyacente, la rutina StartIo del controlador del dispositivo subyacente debe dividir las solicitudes de transferencia grandes en intervalos de transferencia parcial y el controlador debe llevar a cabo una secuencia de operaciones de dispositivo de transferencia parcial. Cada transferencia parcial debe ajustarse a las capacidades del hardware: las funcionalidades del dispositivo del controlador o, para un dispositivo DMA subordinado, las funcionalidades del controlador DMA del sistema, que tenga restricciones más estrictas.
Consulte Adapter Objects and DMA (Objetos de adaptador y DMA ) para obtener más información sobre el uso de DMA del sistema o del bus-master.
La rutina StartIo de un controlador que usa DMA debe sincronizar las transferencias mediante un objeto de adaptador.
Se ejecuta una rutina StartIo en IRQL = DISPATCH_LEVEL, lo que restringe el conjunto de rutinas de soporte técnico a las que puede llamar.
Por ejemplo, una rutina StartIo no puede tener acceso ni asignar memoria paginable y no puede esperar a que un objeto distribuidor se establezca en el estado señalado. Por otro lado, una rutina StartIo puede adquirir y liberar un bloqueo de giro ejecutivo asignado por el controlador con KeAcquireSpinLockAtDpcLevel y KeReleaseSpinLockFromDpcLevel, que se ejecutan más rápido que KeAcquireSpinLock y KeReleaseSpinLock.
Consulte Administración de prioridades de hardware y bloqueos de número para obtener más información.
Si el controlador contiene IRP en un estado cancelable, su rutina StartIo debe comprobar si el IRP de entrada ya se ha cancelado antes de comenzar cualquier procesamiento de esa solicitud en su dispositivo. Para obtener más información, consulte Cancelación de IRP.