WmiSystemControl 函式 (wmilib.h)
WmiSystemControl 例程是使用 WMI 連結庫支援處理 WMI IRP 例程的驅動程式分派例程。
語法
NTSTATUS WmiSystemControl(
[in] PWMILIB_CONTEXT WmiLibInfo,
[in] PDEVICE_OBJECT DeviceObject,
[in, out] PIRP Irp,
[out] PSYSCTL_IRP_DISPOSITION IrpDisposition
);
參數
[in] WmiLibInfo
WMILIB_CONTEXT 結構的指標,其中包含驅動程式數據區塊和事件區塊的註冊資訊,並定義驅動程式 WMI 連結庫回呼例程的進入點。
[in] DeviceObject
驅動程式 DEVICE_OBJECT的指標。
[in, out] Irp
IRP的指標。
[out] IrpDisposition
SYSCTL_IRP_DISPOSITION 類型的列舉值指標,指出 IRP 的處理方式。 WmiSystemControl 一律設定此值,即使它傳回非成功的 NTSTATUS 程式代碼也一樣。
SYSCTL_IRP_DISPOSITION 是 Wmilib.h 中的列舉,並包含下列值:
IrpProcessed
IRP 已處理並可能完成。 如果驅動程式的 DpWmiXxx 例程 WmiSystemControl 未完成 IRP,驅動程式必須呼叫 WmiCompleteRequest,WmiSystemControl 傳回之後完成 IRP。
IrpNotCompleted
IRP 已處理但未完成,因為 WMI 偵測到錯誤,並使用適當的錯誤碼設定 IRP,或處理 IRP_MN_REGINFO 或 IRP_MN_REGINFO_EX 要求。 驅動程式必須呼叫 IoCompleteRequest來完成 IRP。
IrpNotWmi
IRP 不是 WMI 要求(也就是 WMI 無法辨識 IRP 的次要程式代碼)。 如果驅動程式使用此 IRP_MN_XXX處理 IRP_MJ_SYSTEM_CONTROL 要求,則應該處理 IRP;否則,驅動程式應將 IRP 轉送至下一個較低的驅動程式。 如果驅動程式是最低層級的驅動程式,則必須完成 IRP。
IrpForward
IRP 是以另一個裝置對象為目標(也就是 IRP 中 Parameters.WMI.ProviderId 的裝置物件指標 不符合驅動程式在呼叫 ioWMIRegistrationControl時傳遞的指標)。 驅動程式必須將 IRP 轉送至下一個較低的驅動程式。 如果驅動程式是最低層級的驅動程式,則必須完成 IRP。
傳回值
WmiSystemControl 會傳回STATUS_SUCCESS或下列其中一個錯誤碼:
言論
當驅動程式收到具有 WMI IRP 次要程式代碼的 IRP_MJ_SYSTEM_CONTROL 要求時,它會使用驅動程式 WMILIB_CONTEXT 結構的指標、其裝置物件的指標和 IRP 的指標,呼叫 WmiSystemControl。 WMILIB_CONTEXT 結構包含驅動程序數據區塊和事件區塊的註冊資訊,並定義其WMI連結庫回呼例程的進入點。
WmiSystemControl 確認 IRP 是 WMI 要求,並判斷要求指定的區塊是否對驅動程式有效。 如果是,它會在驅動程式的 WMILIB_CONTEXT 結構中呼叫適當的 DpWmiXxx 進入點來處理 IRP。 WMI 會在 IRQL PASSIVE_LEVEL呼叫驅動程式的 DpWmiXxx 例程時執行。
當驅動程式將 IRP_MJ_SYSTEM_CONTROL 要求轉送至下一個較低的驅動程式時,必須在 IRQL PASSIVE_LEVEL執行。
要求
要求 | 價值 |
---|---|
最低支援的用戶端 | 適用於 Windows 2000 和更新版本的 Windows。 |
目標平臺 | 普遍 |
標頭 | wmilib.h (包括 Wmilib.h) |
連結庫 | Wmilib.lib |
IRQL | PASSIVE_LEVEL (請參閱一節) |
DDI 合規性規則 | WmiComplete(wdm) |