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 |