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 構造の複製と断片化の両方を行う場合、親ポインターと子カウンターを管理する必要があります。

  • NDIS は、NET_BUFFER_LIST 構造を割り当てるとき、子カウントを 0 に設定し、親ポインターを NULL に設定します。 NDIS は、ドライバーが別のドライバーに NET_BUFFER_LIST 構造を渡すたびにこれらのフィールドを変更しません。

派生 NET_BUFFER_LIST 構造