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


Управление буферами драйверов Miniport

Драйверы минипорта обычно вызывают NdisAllocateNetBufferListPool из MiniportInitializeEx для создания пула структур NET_BUFFER_LIST. Драйверы минипорта используют эти структуры для указания полученных данных.

Как правило, мини-драйвер, который выделяет структуру NET_BUFFER_LIST, выделяет и помещает в очередь одну NET_BUFFER структуру на эту структуру NET_BUFFER_LIST. Более эффективно предварительно выделить структуры NET_BUFFER при выделении пула структур NET_BUFFER_LIST, чем выделять структуры NET_BUFFER_LIST и структуры NET_BUFFER отдельно.

Драйверы минипорта могут вызывать NdisAllocateNetBufferListPool и установить значение параметра AllocateNetBuffer в TRUE, чтобы указать, что структуры NET_BUFFER выделены заранее. В этом случае структура NET_BUFFER предварительно выделяется вместе с каждой структурой NET_BUFFER_LIST, которую драйвер выделяет из пула. Такие драйверы должны вызывать NdisAllocateNetBufferAndNetBufferList, чтобы выделить структуры из этого пула.

Как правило, драйвер минипорта вызывает NdisAllocateNetBufferAndNetBufferList из MiniportInitializeEx, чтобы выделить столько буферов, сколько потребуется для последующих операций приема. В этом случае драйвер управляет внутренним списком свободных буферов.

Функция MiniportReturnNetBufferLists может подготовить возвращаемую структуру NET_BUFFER_LIST для повторного использования в последующей индикации приёма. Хотя MiniportReturnNetBufferLists может возвращать структуры NET_BUFFER_LIST в пул (например, он может вызывать NdisFreeNetBufferList), можно более эффективно использовать структуры, не возвращая их в пул.

Минипорт-драйвер должен освободить все структуры NET_BUFFER_LIST и связанные данные, когда NDIS останавливает адаптер. Драйвер может вызывать NdisFreeNetBufferList для освобождения структур и функции NdisFreeNetBufferListPool для освобождения пула NET_BUFFER_LIST.