Указатели потока и отмена 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.