Фильтрация управления буфером драйвера

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

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

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

Чтобы создать эти пулы, драйверы вызывают следующие функции:

NdisAllocateNetBufferListPool

NdisAllocateNetBufferPool

Драйверы фильтров могут использовать следующие функции для выделения структур из пулов:

NdisAllocateNetBufferAndNetBufferList

NdisAllocateNetBufferList

NdisAllocateNetBuffer

Вызов NdisAllocateNetBufferAndNetBufferList более эффективен, чем вызов NdisAllocateNetBufferList и NdisAllocateNetBuffer. Однако NdisAllocateNetBufferAndNetBufferList создает только одну NET_BUFFER структуру NET_BUFFER_LIST. Чтобы использовать NdisAllocateNetBufferAndNetBufferList, драйвер должен задать для параметра AllocateNetBuffer значение TRUE при вызове NdisAllocateNetBufferListPool.

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

Драйверы фильтров используют следующие функции для освобождения пулов:

NdisFreeNetBufferListPool

NdisFreeNetBufferPool

Драйверы фильтров используют следующие функции для освобождения структур, выделенных из пулов:

NdisFreeNetBufferList

NdisFreeNetBuffer

Драйверы должны освободить NET_BUFFER структуры, выделенные с помощью NdisAllocateNetBuffer , прежде чем освобождать связанную структуру NET_BUFFER_LIST. NET_BUFFER структуры, выделенные с помощью NdisAllocateNetBufferAndNetBufferList , освобождаются, когда драйвер вызывает NdisFreeNetBufferList для связанной структуры NET_BUFFER_LIST.