Relaciones entre generaciones de NET_BUFFER_LIST
Los escritores de controladores deben comprender y mantener la relación entre las estructuras primarias (originales) NET_BUFFER_LIST y las estructuras secundarias (derivadas) resultantes de las operaciones clonadas, fragmentadas y reasemble.
El llamador de una función clone/fragment/reassemble mantiene la relación primario/secundario, incluido el puntero primario en la estructura de NET_BUFFER_LIST secundaria y un recuento de elementos secundarios. El recuento de elementos secundarios garantiza que el autor de la llamada libere al elemento primario después de que se hayan liberado todos los elementos secundarios. Se aplican las reglas siguientes:
Después de que un controlador cree estructuras secundarias a partir de una estructura de NET_BUFFER_LIST , debe conservar la propiedad de la estructura primaria y debe pasar las estructuras secundarias a otros controladores. El controlador nunca debe pasar la estructura de NET_BUFFER_LIST primaria a otro controlador.
Un controlador solo debe actualizar el recuento de elementos secundarios en la estructura de NET_BUFFER_LIST primaria. Dado que la estructura primaria nunca se pasa a otro controlador, no existe ningún riesgo de que se pueda sobrescribir el valor del recuento de elementos secundarios. El controlador debe establecer el puntero primario en las estructuras secundarias para que apunten a la estructura primaria.
Cuando un controlador recibe un NET_BUFFER_LIST de otro controlador, el controlador no debe sobrescribir el puntero primario. Si la estructura NET_BUFFER_LIST recibida es un elemento secundario, su puntero primario ya debe establecerse. El controlador puede usar el NET_BUFFER_LIST recibido de otro controlador como una estructura primaria.
NDIS no aplica las reglas anteriores. El propietario actual de una estructura de NET_BUFFER_LIST debe administrar el recuento de elementos secundarios y el puntero primario. Por ejemplo, si el propietario actual clonará y fragmentará una estructura de NET_BUFFER_LIST, debe administrar el puntero primario y el contador secundario.
NDIS establece el recuento secundario en cero y el puntero primario en NULL cuando asigna una estructura de NET_BUFFER_LIST. NDIS no cambia estos campos cada vez que un controlador pasa una estructura de NET_BUFFER_LIST a otro controlador.