次の方法で共有


NdisScheduleWorkItem 関数 (ndis.h)

メモ NDIS 5。 x は非推奨となり、NDIS 6 に置き換えられます。 x があります。 新しい NDIS ドライバーの開発については、「 Windows Vista 以降のネットワーク ドライバー」を参照してください。 NDIS 5 の移植について説明します。 x ドライバーを NDIS 6 に設定します。 x については、「 NDIS 5.x ドライバーを NDIS 6.0 に移植する」を参照してください。

NdisScheduleWorkItem は、特定の作業項目をキューに挿入します。このキューから、システム ワーカー スレッドは項目を削除し、ドライバーが以前 に NdisInitializeWorkItem に提供したコールバック関数を制御します。

構文

NDIS_STATUS NdisScheduleWorkItem(
  [in] __drv_aliasesMem PNDIS_WORK_ITEM WorkItem
);

パラメーター

[in] WorkItem

NdisInitializeWorkItem の前の呼び出しによって設定された作業項目へのポインター。

戻り値

NdisScheduleWorkItem は常に 成功するため、常にNDIS_STATUS_SUCCESSを返します。

注釈

NdisScheduleWorkItem を呼び出すと、NDIS ドライバーは、現在ワーカー スレッド コールバック関数に対して実行されている IRQL よりも低い IRQL で実行できる、または実行する必要があるドライバーによって決定された操作を延期できます。

ドライバーのコールバックは、IRQL = PASSIVE_LEVEL後のシステム スレッド コンテキスト内で実行されます。 この呼び出し元から提供される関数は、ドライバーが WorkItem に割り当てたストレージを再利用する役割を担います。 たとえば、NdisAllocateMemoryWithTag というドライバーが NdisInitializeWorkItem にコンテキスト領域を提供する場合、そのコールバック関数は、コントロールを返す前に、WorkItem を使用して NdisFreeMemory を逆呼び出す必要があります。

ドライバーは、1 つの同期オブジェクトを既に保持していて、別の同期オブジェクトを取得しようとする可能性がある場合に、そのコールバック ルーチンが操作を完了するのを待つ必要はありません。 たとえば、NDIS ドライバーは、 NdisScheduleWorkItem を呼び出す前に、現在保持されているスピン ロックなどを解放する必要があります。 最上位レベルの NDIS プロトコル ドライバーは、 NdisScheduleWorkItem を呼び出す前に、現在保持されているセマフォ、ミューテックス、リソース変数などを解放する必要もあります。 同期ワーカー スレッド操作をキューに格納する前にすべての同期リソースを解放すると、デッドロックが回避されます。

シリアル化されたミニポート ドライバーは、ワーカー スレッド コールバック ルーチンをキューに登録しないでください。このようなドライバーが NIC コンテキスト領域へのアクセスをワーカー スレッド コールバックと同期させる方法がないためです。 そのため、このようなシリアル化された NDIS ドライバーは、断続的なシステム クラッシュを引き起こすことなく、ワーカー スレッド コールバック関数でアダプターごとのコンテキスト領域で何も共有できません。

  • ターゲット プラットフォーム: ユニバーサル
  • バージョン: Windows Vista の NDIS 6.0 ドライバーではサポートされていません。 代わりに NdisQueueIoWorkItem を使用してください。 Windows Vista および Windows XP の NDIS 5.1 ドライバーでサポートされています。

要件

要件
Header ndis.h (Ndis.h を含む)
IRQL IRQL <= DISPATCH_LEVEL

こちらもご覧ください