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


Управление буферами драйвера фильтра

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

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

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