Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Записи драйверов должны понимать и поддерживать связь между родительскими (исходными) 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, он должен управлять родительским указателем и дочерним счетчиком.
NDIS задает для дочернего счетчика нулевое значение, а родительский указатель NULL при выделении структуры NET_BUFFER_LIST. NDIS не изменяет эти поля каждый раз, когда драйвер передает NET_BUFFER_LIST структуру другому драйверу.