IRP_MN_ENABLE_EVENTS
1 つ以上のイベント ブロックを登録するすべての WMI ドライバーは、この IRP を処理する必要があります。 ドライバーは、「WMI 要求の処理」で説明されているように、WmiSystemControl を呼び出すか、ドライバー自身で IRP を処理することによって、WMI IRP を処理できます。
ドライバーが IRP_MN_ENABLE_EVENTS 要求を処理するために WmiSystemControl を呼び出すと、WMI はそのドライバーの DpWmiFunctionControl ルーチンを呼び出します。
主要なコード
送信時
WMI は、データ コンシューマーがイベントの通知を要求したことをドライバーに通知するために、この IRP を送信します。
WMI は任意のスレッド コンテキストで、IRQL = PASSIVE_LEVEL でこの IRP を送信します。
入力パラメーター
Parameters.WMI.ProviderId は、要求に応答する必要があるドライバーのデバイス オブジェクトを指します。 このポインターは、IRP のドライバーの I/O スタックの場所にあります。
Parameters.WMI.DataPath は、有効にするイベント ブロックを識別する GUID を指します。
Parameters.WMI.BufferSize は、Parameters.WMI.Buffer の非ページ バッファーのサイズを示します。これは sizeof(WNODE_HEADER) 以上である必要があります。 トレース ブロック (WMIREG_FLAG_TRACED_GUID) を登録しないドライバーは、このパラメーターを無視することができます。
Parameters.WMI.Buffer は、イベントをトレース (WMI_FLAGS_TRACED_GUID) する必要があるかどうかを示す WNODE_HEADER を指し、システム ロガーへのハンドルを提供します。 トレース ブロック (WMIREG_FLAG_TRACED_GUID) を登録しないドライバーは、このパラメーターを無視することができます。
出力パラメーター
なし。
I/O 状態ブロック
ドライバーが WmiSystemControl を呼び出して IRP を処理する場合、WMI は I/O 状態ブロックで Irp->IoStatus.Status と Irp->IoStatus.Information を設定します。
それ以外の場合、ドライバーは Irp->IoStatus.Status を STATUS_SUCCESS または次のような適切なエラー状態に設定します。
STATUS_WMI_GUID_NOT_FOUND
STATUS_INVALID_DEVICE_REQUEST
成功した場合、ドライバーは Irp->IoStatus.Information を 0 に設定します。
操作
ドライバーは、「WMI 要求の処理」で説明されているように、WmiSystemControl を呼び出すか、ドライバー自身で IRP を処理することによって、WMI IRP を処理できます。
ドライバーが WmiSystemControl を呼び出して WMI IRP を処理する場合、そのルーチンは、ドライバーの DpWmiFunctionControl ルーチンを呼び出すか、ドライバーがルーチンを定義していない場合は STATUS_SUCCESS を返します。
ドライバー自身が IRP_MN_ENABLE_EVENTS 要求を処理する場合については、Parameters.WMI.ProviderId が、ドライバーが IoWMIRegistrationControl に渡したポインターと同じデバイス オブジェクトを指している場合にのみ、ドライバーがこの処理を行う必要があります。 それ以外の場合、ドライバーは、次の下位ドライバーに要求を転送する必要があります。
ドライバーは、要求を処理する前に、Parameters.WMI.DataPath がドライバーがサポートしている GUID を指しているかどうかを判断する必要があります。 指してない場合は、ドライバーは IRP に失敗し、STATUS_WMI_GUID_NOT_FOUND を返す必要があります。
ドライバーがイベント ブロックをサポートしている場合、そのデータ ブロックのすべてのインスタンスに対してイベントが有効になります。
WMI は、最初のデータ コンシューマーがイベントを有効にするときに、イベント ブロックに対して有効にする 1 つの要求を送信するため、ドライバーは、イベント ブロックに対してイベントが既に有効になっているかどうかをチェックする必要があります。 WMI は、無効化要求が介入しない限り、別の有効化の要求を送信しません。
トレース ブロック (WMIREG_FLAG_TRACED_GUID) を登録するドライバーは、イベントを WMI またはトレース用のシステム ロガーに送信するかどうかを判断する必要もあります。 トレースが要求されると、Parameters.WMI.Buffer が、フラグ が WNODE_FLAG_TRACED_GUID で設定されており、HistoricalContext にロガーへのハンドルが含まれる WNODE_HEADER 構造体を指します。
イベント ブロックの定義、イベントの送信、およびトレースの詳細については、「Windows Management Instrumentation」を参照してください。
要件
ヘッダー |
Wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む) |