IRP_MN_QUERY_ALL_DATA

支援 WMI 的所有驅動程式都必須處理此 IRP。 驅動程式可以呼叫 WmiSystemControl 或處理 IRP 本身來處理 WMI IRP,如處理 WMI 要求中所述

如果驅動程式呼叫 WmiSystemControl 來處理IRP_MN_QUERY_ALL_DATA要求,WMI 接著會呼叫該驅動程式的 DpWmiQueryDataBlock 例程。

主要程序代碼

IRP_MJ_SYSTEM_CONTROL

傳送時

WMI 會傳送此 IRP 來查詢指定數據區塊的所有實例。

WMI 會在 IRQL = PASSIVE_LEVEL任意線程內容中傳送此 IRP。

輸入參數

IRP 中驅動程式 I/O 堆疊位置的參數.WMI.ProviderId 會指向應該回應要求的驅動程式裝置物件。

Parameters.WMI.DataPath 指向識別數據區塊的 GUID。

Parameters.WMI.BufferSize 指出 Parameters.WMI.Buffer 中非分頁緩衝區 的大小上限,該緩衝區會接收來自要求的輸出數據。 緩衝區大小必須大於或等於 sizeofWNODE_ALL_DATA),以及傳回所有實例的實例名稱和數據大小。

輸出參數

如果驅動程式藉由呼叫 WmiSystemControl 來處理 WMI IRP,則 WMI 會針對驅動程式註冊的每個區塊呼叫驅動程式的 DpWmiQueryDataBlock 例程一次,填入WNODE_ALL_DATA

否則,驅動程式會在 Parameters.WMI.Buffer 填入WNODE_ALL_DATA結構,如下所示:

  • 將 WnodeHeader.BufferSize 設定為要傳回的整個WNODE_ALL_DATA位元組數目、將 WnodeHeader.Timestamp 設定為 KeQuerySystemTime傳回的值,並視需要傳回的數據設定 WnodeHeader.Flags

  • 將 InstanceCount 設定為要傳回的實例數目。

  • 如果區塊使用動態實例名稱,請將 OffsetInstanceNameOffsets 設定為從WNODE_ALL_DATA開頭到 ULONG 位移數位開始位置的位元組移。 此陣列中的每個元素都是儲存每個動態實例名稱的 WNODE_ALL_DATA 位移。 每個動態實例名稱都會儲存為計數的 Unicode 字串,其中計數是 USHORT,後面接著 Unicode 字元串。 計數不包含任何可能屬於 Unicode 字串一部分的終止 Null 字元。 如果 Unicode 字串包含終止的 Null 字元,此 Null 字元仍必須符合 WNodeHeader.BufferSize建立的大小。

  • 如果所有實體的大小都相同:

    • 設定 WnodeHeader.Flags 中的WNODE_FLAG_FIXED_INSTANCE_SIZE,並將 FixedInstanceSize 設定為該大小,以位元組為單位。
    • 寫入從 DataBlockOffset 開始的實例數據,並加上填補,讓每個實例都對齊 8 位元組界限。 例如,如果 FixedInstanceSize 為 6,驅動程式會在實例之間新增 2 個字節的填補。
  • 如果實體的大小不同:

    • 清除 WnodeHeader.Flags 中的WNODE_FLAG_FIXED_INSTANCE_SIZE,並從 OffsetInstanceDataAndLength 開始寫入 InstanceCount OFFSETINSTANCEDATAANDLENGTH 結構的數位 每個 OFFSETINSTANCEDATAANDLENGTH 結構都會指定從WNODE_ALL_DATA結構的開頭到每個實例數據的開頭以及數據長度的位元組位移。 未使用 DataBlockOffset

    • 在 OffsetInstanceDataAndLength 陣列的最後一個項目之後寫入實例數據,加上填補,讓每個實例都對齊 8 位元組界限。

如果 Parameters.WMI.Buffer 的緩衝區太小而無法接收所有數據,驅動程式會在 Parameters.WMI.Buffer 的WNODE_TOO_SMALL結構填入所需的大小。 如果緩衝區小於 sizeofWNODE_TOO_SMALL),驅動程式會失敗 IRP 並傳回STATUS_BUFFER_TOO_SMALL。

I/O 狀態區塊

如果驅動程式藉由呼叫 WmiSystemControl 來處理 IRP,WMI 會在 I/O 狀態區塊中設定 Irp-IoStatus.Status> 和 Irp-IoStatus.Information>

否則,驅動程式會將 Irp-IoStatus.Status> 設定為STATUS_SUCCESS或適當的錯誤狀態,例如:

STATUS_BUFFER_TOO_SMALL

STATUS_WMI_GUID_NOT_FOUND

成功時,驅動程式會將 Irp-IoStatus.Information> 設定為寫入至 Parameters.WMI.Buffer 之緩衝區的位元元組數目。

作業

驅動程式可以呼叫 WmiSystemControl 或處理 IRP 本身來處理 WMI IRP,如處理 WMI 要求中所述

如果驅動程式藉由呼叫 WmiSystemControl 來處理 WMI IRP,該例程會呼叫驅動程式的 DpWmiQueryDataBlock 例程。

如果驅動程式處理IRP_MN_QUERY_ALL_DATA要求,則只有在 Parameters.WMI.ProviderId 指向驅動程式傳遞至 IoWMIRegistrationControl 的相同裝置物件時,才應該這麼做。 否則,驅動程式必須將要求轉送至下一個較低的驅動程式。

處理要求之前,驅動程式必須判斷Parameters.WMI.DataPath是否指向驅動程序支援的 GUID。 如果沒有,驅動程式必須失敗 IRP 並傳回STATUS_WMI_GUID_NOT_FOUND。

如果驅動程式支援數據區塊,它必須執行下列動作:

  • 確認 Parameters.WMI.BufferSize 指定足以接收驅動程式傳回之所有數據的緩衝區。

  • 在 Parameters.WMI.Buffer 填入WNODE_ALL_DATA結構,並填入該數據區塊所有實例的數據。

需求

頁首

Wdm.h (包括 Wdm.h、Ntddk.h 或 Ntifs.h)

另請參閱

DpWmiQueryDataBlock

IoWMIRegistrationControl

KeQuerySystemTime

WMILIB_CONTEXT

WmiSystemControl

WNODE_ALL_DATA