Отмена указателей потоков и IRP

Если кадр имеет заблокированный указатель потока, ссылающийся на него, IRP, соответствующий этому кадру, не может быть отменен. См. раздел "Блокировка и разблокировка указателей потока".

В следующей таблице перечислены методы, которые минидрайвер может использовать для отмены IRP. Стратегия отмены должна формироваться исходя из требований минидрайвера к доступу к потоку, как описано в левом столбце.

Если вам нужно.. Сделай это Комментарии

Краткий доступ к потоку данных в одной точке доступа

Вызовите KsPinGetLeadingEdgeStreamPointer с параметром State, равным KSSTREAM_POINTER_STATE_LOCKED. Затем вызовите KsStreamPointerUnlock или KsStreamPointerAdvanceOffsetsAndUnlock сразу после завершения обработки.

Обеспечивает быструю реакцию на отмену, если поток блокируется между получением указателя и его разблокировкой.

Неограниченное время доступа, но может отказаться от права в контексте коллбэка отмены

Вызовите KsStreamPointerClone , чтобы клонировать заблокированный указатель потока (обычно ведущий край), разблокировать его и ответить на CancelCallback. Обратный вызов происходит с удержанием спин-блокировки очереди, поэтому на уровне DISPATCH_LEVEL. Соответственно, подпрограмма CancelCallback , предоставляемая поставщиком, не может выполнять операции с очередью или вызывать функции, которые получают мьютекс. Вместо этого минидрайвер в подпрограмме обратного вызова проверяет, что связанные данные не будут доступны позже, а затем вызывает KsStreamPointerDelete.

Может быть сложнее реализовать, но часто обеспечивает лучший баланс между эффективным доступом и быстрым ответом на отмену.

Периодический доступ к кадру и возможность допущения исчезновения кадра между доступами.

Сохраняйте разблокированный клон и вызовите KsStreamPointerLock , чтобы заблокировать его во время доступа. Если кадр отменен, следующая попытка заблокировать указатель потока завершается ошибкой, и минидрайвер может вызвать KsStreamPointerDelete.

Как и при первом варианте, скорость реагирования на отмену является функцией того, как долго указатель потока заблокирован.

Неопределённая длительность времени доступа и не может снять претензию в ответ на обратный вызов.

Сохраняйте заблокированный указатель клонированного потока на неопределённый срок, чтобы предотвратить отмену. Чтобы создать указатель потока клона, вызовите KsStreamPointerClone. Затем вызовите KsStreamPointerLock и KsStreamPointerUnlock , чтобы заблокировать или разблокировать клон.

Чувствительность к отмене может быть низкой. Рассмотрите возможность использования времени ожидания указателя потока с помощью этого метода.

Если указатель потока ссылается на кадр, минидрайвер может вызвать KsStreamPointerGetIrp для доступа к IRP, соответствующему этому кадру. Чтобы получить список дескрипторов памяти (MDL), связанный с кадром, вызовите KsStreamPointerGetMdl.