Punteros de flujo y cancelación de IRP

Si un marco tiene un puntero de secuencia bloqueado que hace referencia a él, no se puede cancelar el IRP que corresponde a este marco. Véase Bloqueo y desbloqueo de punteros de flujo.

En la tabla siguiente se enumeran las técnicas que tu minidriver puede usar para soportar la cancelación de IRP. La estrategia de cancelación debe establecerse según los requisitos de acceso al flujo del minidriver, tal como se describe en la columna más a la izquierda.

Si lo necesita. Haga esto Comentarios

Acceso breve 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 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 reclamación en el contexto de una devolución de llamada de cancelación

Llame a KsStreamPointerClone para clonar un puntero de flujo bloqueado (normalmente el borde inicial), desbloquearlo y responder a CancelCallback. La devolución de llamada se produce con el bloqueo de giro de la 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 llamar a funciones 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 de 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 cuadro y puede tolerar la desaparición del cuadro entre accesos.

Mantenga un clon desbloqueado y llame a KsStreamPointerLock para bloquearlo en el momento del acceso. Si se cancela el marco, 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 del tiempo que el puntero de secuencia está bloqueado.

Duración indefinida del tiempo de acceso y no puede renunciar al derecho en respuesta a una devolución de llamada

Mantenga bloqueado un puntero de flujo clonado 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 fotograma tiene un puntero de secuencia que lo referencia, 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.