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


Связи между поколениями NET_BUFFER_LIST

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

Вызывающий объект функции clone/fragment/reassemble поддерживает связь "родитель-потомок", включая родительский указатель в дочерней NET_BUFFER_LIST структуре и число дочерних элементов. Счетчик дочерних элементов гарантирует, что вызывающий объект освобождает родительский объект после освобождения всех дочерних элементов. Применяются следующие правила.

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

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

  • Когда драйвер получает NET_BUFFER_LIST от другого драйвера, драйвер не должен перезаписывать родительский указатель. Если полученная NET_BUFFER_LIST структура является дочерней, ее родительский указатель должен быть уже задан. Драйвер может использовать NET_BUFFER_LIST, полученные от другого драйвера, в качестве родительской структуры.

  • NDIS не применяет указанные выше правила. Текущий владелец структуры NET_BUFFER_LIST должен управлять числом дочерних элементов и родительским указателем. Например, если текущий владелец будет клонировать и фрагментировать структуру NET_BUFFER_LIST, он должен управлять родительским указателем и дочерним счетчиком.

  • При выделении NET_BUFFER_LIST структуры NDIS задает для числа дочерних элементов ноль, а для родительского указателя — значение NULL . NDIS не изменяет эти поля каждый раз, когда драйвер передает структуру NET_BUFFER_LIST другому драйверу.

Производные структуры NET_BUFFER_LIST