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 已處理且可能已完成。 如果 WmiSystemControl 所呼叫的驅動程式 DpWmiXxx 例程未完成 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 中使用。 |
目標平台 | Universal |
標頭 | wmilib.h (包含 Wmilib.h) |
程式庫 | Wmilib.lib |
IRQL | PASSIVE_LEVEL (请参阅一节) |
DDI 合規性規則 | WmiComplete (wdm) |