Приостановка модуля фильтра
Чтобы приостановить выполнение модуля фильтра, 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 может инициировать запросы на отсоединение или перезапуск после того, как драйвер фильтра находится в состоянии Приостановлено . Дополнительные сведения о том, как отсоединить модуль фильтра, см. в разделе Отключение модуля фильтра. Дополнительные сведения о перезапуске модуля фильтра см. в разделе Запуск модуля фильтра.