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


Приостановка модуля фильтра

Чтобы приостановить выполнение модуля фильтра, NDIS вызывает функцию FilterPause драйвера фильтра. Модуль фильтра переходит в состояние Приостановка в начале выполнения функции FilterPause .

NDIS приостанавливает модуль фильтра в рамках операции Plug and Play для приостановки стека драйверов. Общие сведения о приостановке стека драйверов см. в разделе Приостановка стека драйверов.

От имени модуля фильтра, который находится в состоянии Приостановка , драйвер фильтра:

  • Не должны возникать какие-либо новые признаки получения.

    Дополнительные сведения об операциях отправки и получения см. в разделе Фильтрация операций отправки и получения модуля.

  • Если существуют операции получения, инициированные драйвером фильтра и не завершенные NDIS, драйвер фильтра должен ожидать завершения таких операций NDIS. Операция приостановки не будет завершена до тех пор, пока NDIS не вызовет функцию FilterReturnNetBufferLists для всех таких невыполненных признаков получения.

  • Должен возвращать все неоплаченные признаки получения о том, что базовые драйверы немедленно поступили в NDIS. Операция приостановки не будет завершена, пока драйвер не вызовет функцию NdisFReturnNetBufferLists для таких незавершенных признаков получения. Эти необработанные признаки получения могут существовать, если драйвер помещает в очередь буферы, полученные от базовых драйверов.

  • Должен возвращать новые признаки получения о том, что базовые драйверы поступают в NDIS немедленно путем вызова функции NdisFReturnNetBufferLists . При необходимости драйвер может скопировать признаки получения и ставить их в очередь перед их возвратом.

    Примечание. NdisFReturnNetBufferLists не следует вызывать для NBL, указанных с флагом NDIS_RECEIVE_FLAGS_RESOURCES, установленным в соответствующем вызове FilterReceiveNetBufferLists . Такие NBL возвращаются в NDIS синхронно, возвращаясь из подпрограммы FilterReceiveNetBufferLists .

  • Не следует отправлять новые запросы на отправку.

  • Если существуют операции отправки, инициированные драйвером фильтра и не завершенные NDIS, драйвер фильтра должен дождаться завершения таких операций NDIS. Операция приостановки не будет завершена, пока NDIS не вызовет функцию FilterSendNetBufferListsComplete для всех таких невыполненных запросов на отправку.

  • Должен немедленно возвращать все новые запросы на отправку, сделанные в функцию FilterSendNetBufferLists , путем вызова функции NdisFSendNetBufferListsComplete . Драйвер фильтра должен задать для элемента Status в каждой структуре NET_BUFFER_LIST значение NDIS_STATUS_PAUSED.

  • Может предоставлять указания состояния с помощью функции NdisFIndicateStatus .

    Дополнительные сведения об указаниях состояния см. в разделе Фильтрация индикаторов состояния модуля.

  • Должен обрабатывать указания состояния в функции FilterStatus .

  • Должен обрабатывать запросы OID в функции FilterOidRequest .

    Дополнительные сведения о запросах OID см. в разделе Запросы OID модуля filter.

  • Может инициировать запросы OID.

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

  • Следует отменить таймеры, если это необходимо для остановки операций отправки и получения.

    Дополнительные сведения о таймерах см. в разделе Службы таймеров NDIS 6.0.

После успешного приостановки операций отправки и получения драйвер фильтра должен завершить операцию приостановки. Драйвер фильтра может выполнить операцию приостановки синхронно или асинхронно, возвращая NDIS_STATUS_SUCCESS или NDIS_STATUS_PENDING соответственно из FilterPause.

Если драйвер возвращает NDIS_STATUS_PENDING, он должен вызвать функцию NdisFPauseComplete после завершения операции приостановки.

От имени модуля фильтра, который находится в состоянии Приостановка , драйвер фильтра:

  • Не должны возникать новые признаки получения.

  • Должен возвращать новые признаки получения о том, что базовые драйверы поступают в NDIS немедленно путем вызова функции NdisFReturnNetBufferLists . При необходимости драйвер может скопировать признаки получения и ставить их в очередь перед их возвратом.

  • Не следует отправлять новые запросы на отправку.

  • Должен немедленно возвращать все новые запросы на отправку, сделанные в функцию FilterSendNetBufferLists , путем вызова функции NdisFSendNetBufferListsComplete . Драйвер фильтра должен задать для элемента Status в каждой структуре NET_BUFFER_LIST значение NDIS_STATUS_PAUSED.

  • Может предоставлять указания состояния с помощью функции NdisFIndicateStatus .

  • Должен обрабатывать указания состояния в функции FilterStatus .

  • Должен обрабатывать запросы OID в функции FilterOidRequest .

  • Может инициировать запросы OID.

NDIS не инициирует другие операции Plug and Play, такие как присоединение, отсоединение или запросы на перезапуск, пока драйвер фильтра находится в состоянии приостановки. NDIS может инициировать запросы на отсоединение или перезапуск после того, как драйвер фильтра находится в состоянии Приостановлено . Дополнительные сведения о том, как отсоединить модуль фильтра, см. в разделе Отключение модуля фильтра. Дополнительные сведения о перезапуске модуля фильтра см. в разделе Запуск модуля фильтра.