NdisInterlockedInsertHeadList マクロ (ndis.h)

NdisInterlockedInsertHeadList 関数は、リストへのアクセスがマルチプロセッサセーフな方法で同期されるように、二重にリンクされたリストの先頭にエントリ (通常はパケット) を挿入します。

構文

void NdisInterlockedInsertHeadList(
  [in]  _ListHead,
  [in]  _ListEntry,
  [in]  _SpinLock
);

パラメーター

[in] _ListHead

エントリを挿入する二重リンク リストの先頭へのポインター。

[in] _ListEntry

リストの先頭に挿入するエントリへのポインター。

[in] _SpinLock

呼び出し元が指定したスピン ロックへのポインター。リストへのアクセスを同期するために使用されます。

戻り値

なし

解説

NdisInterlockedInsertHeadList を呼び出す前に、ドライバーは、NdisInitializeListHead 関数と NdisAllocateSpinLock 関数を使用して SpinLock の変数を使用して ListHead で変数を初期化する必要があります。 ドライバーは、これらの変数とその内部キューの常駐ストレージも提供する必要があります。

呼び出し元が指定したスピン ロックは、 NdisInterlockedInsertHeadList が指定されたエントリを挿入している間、他の関数がドライバーの内部キューにアクセスできないようにします。これは、ドライバーがマルチプロセッサ コンピューターで実行されている場合でもです。

NdisInterlockedInsertHeadList は、指定されたスピン ロックを取得し、コントロールを返す前に元の IRQL を復元すると、IRQL をDISPATCH_LEVELに発生させます。 そのため、 NdisInterlockedInsertHeadList を呼び出すドライバー関数をページング可能なコードにすることはできません。

ほとんどの NDIS ドライバーは FIFO 順にパケットを処理するため、インターロックされたキューを使用するドライバーは、次の処理を実行する傾向があります。 NdisInterlockedInsertTailList 関数は、 NdisInterlockedInsertHeadList よりもはるかに頻繁に機能します。 このようなドライバーは通常、 NdisInterlockedInsertHeadList を呼び出して、再試行操作のパケットを再キューに入れるだけです。

返された値を挿入されたエントリのアドレスに戻すには、ドライバーは CONTAINING_RECORD マクロを使用できます。

IRQL >= DISPATCH_LEVELで NdisInterlockedInsertHeadList が呼び出された場合、ListHead パラメーターとリスト エントリのストレージは常駐である必要があります。

要件

要件
サポートされている最小のクライアント Windows Vista の NDIS 6.0 および NDIS 5.1 ドライバー (「NdisInterlockedInsertHeadList (NDIS 5.1)」を参照) でサポートされています。 Windows XP の NDIS 5.1 ドライバー (NdisInterlockedInsertHeadList (NDIS 5.1) を参照) でサポートされています。
対象プラットフォーム ユニバーサル
Header ndis.h (Ndis.h を含む)
Library Ndis.lib
IRQL 任意のレベル

こちらもご覧ください

CONTAINING_RECORD

NdisAllocateSpinLock

NdisInitializeListHead

NdisInterlockedInsertTailList NdisInterlockedRemoveHeadList