Поделиться через


Указатели потока и отмена IRP

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

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

При необходимости. выполните следующее: Комментарии

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

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

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

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

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

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

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

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

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

Бессрочная продолжительность доступа и не может отказаться от утверждения в ответ на обратный вызов

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

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

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