Punteros de flujo y cancelación de IRP
Si un marco tiene un puntero de flujo bloqueado que hace referencia a él, no se puede cancelar el IRP que corresponde a este marco. Consulte Bloqueo y desbloqueo de punteros de flujo.
En la tabla siguiente se enumeran las técnicas que el minidriver puede usar para admitir la cancelación de IRP. La estrategia de cancelación debe basarse en los requisitos de acceso de flujo de su minidriver, como se describe en la columna situada más a la izquierda.
Si lo necesita. | Haga esto | Comentarios |
---|---|---|
Breve acceso a los datos de flujo en un único punto de acceso |
Llame a KsPinGetLeadingEdgeStreamPointer con el parámetro State establecido en KSSTREAM_POINTER_STATE_LOCKED. A continuación, llame a KsStreamPointerUnlock o KsStreamPointerAdvanceOffsetsAndUnlock inmediatamente después de completar el procesamiento. |
Proporciona una capacidad de respuesta rápida a la cancelación a menos que el subproceso se bloquee entre adquirir el puntero y desbloquearlo. |
Duración indefinida del tiempo de acceso, pero puede renunciar a la notificación en el contexto de una devolución de llamada de cancelación. |
Llame a KsStreamPointerClone para clonar un puntero de secuencia bloqueado (normalmente el borde inicial), desbloquearlo y responder a CancelCallback. La devolución de llamada se produce con el bloqueo de número de cola mantenido, por lo tanto, en DISPATCH_LEVEL. En consecuencia, la rutina CancelCallback proporcionada por el proveedor no puede realizar la manipulación de colas ni las funciones de llamada que adquieren una exclusión mutua. En su lugar, en la rutina de devolución de llamada, el minidriver comprueba que no se tendrá acceso a los datos asociados más adelante y, a continuación, llama a KsStreamPointerDelete. |
Puede ser más difícil implementar, pero a menudo proporciona el mejor equilibrio entre el acceso eficaz y la respuesta rápida a la cancelación. |
Acceso periódico a un marco y puede tolerar la desaparición del marco entre accesos |
Mantenga un clon desbloqueado y llame a KsStreamPointerLock para bloquearlo en el momento del acceso. Si se cancela el fotograma, se produce un error en el siguiente intento de bloquear el puntero de secuencia y el minidriver puede llamar a KsStreamPointerDelete. |
Al igual que con la primera opción, la capacidad de respuesta a la cancelación es una función de cuánto tiempo está bloqueado el puntero de secuencia. |
Duración indefinida del tiempo de acceso y no se puede renunciar a la notificación en respuesta a una devolución de llamada |
Mantenga un puntero de secuencia de clonación bloqueado durante cualquier período de tiempo para evitar la cancelación. Para crear un puntero de secuencia clonado, llame a KsStreamPointerClone. A continuación, llame a KsStreamPointerLock y KsStreamPointerUnlock para bloquear o desbloquear el clon. |
La capacidad de respuesta a la cancelación puede ser deficiente. Considere la posibilidad de usar tiempos de espera de puntero de secuencia con esta técnica. |
Si un marco tiene un puntero de secuencia que hace referencia a él, el minidriver puede llamar a KsStreamPointerGetIrp para acceder al IRP correspondiente a este fotograma. Para recuperar la lista de descriptores de memoria (MDL) asociada a un marco, llame a KsStreamPointerGetMdl.