функция обратного вызова WMI_QUERY_DATABLOCK_CALLBACK (wmilib.h)
Подпрограмма DpWmiQueryDataBlock возвращает один экземпляр или все экземпляры блока данных. Эта подпрограмма является обязательной.
Синтаксис
WMI_QUERY_DATABLOCK_CALLBACK WmiQueryDatablockCallback;
NTSTATUS WmiQueryDatablockCallback(
[in] PDEVICE_OBJECT DeviceObject,
[in] PIRP Irp,
[in] ULONG GuidIndex,
[in] ULONG InstanceIndex,
[in] ULONG InstanceCount,
[in, out] PULONG InstanceLengthArray,
[in] ULONG BufferAvail,
[out] PUCHAR Buffer
)
{...}
Параметры
[in] DeviceObject
Указатель на структуру WDM драйвера DEVICE_OBJECT .
[in] Irp
Указатель на IRP.
[in] GuidIndex
Задает блок данных путем предоставления отсчитываемого от нуля индекса в список идентификаторов GUID, предоставленных драйвером в WMILIB_CONTEXT структуре, переданной в WmiSystemControl.
[in] InstanceIndex
Если DpWmiQueryDataBlock вызывается в ответ на запрос IRP_MN_QUERY_SINGLE_INSTANCE , InstanceIndex задает индекс с отсчитываемым от нуля, который указывает экземпляр указанного блока данных, к которому будет выполняться запрос. Если dpWmiQueryDataBlock вызывается в ответ на запрос IRP_MN_QUERY_ALL_DATA , instanceIndex равен нулю.
[in] InstanceCount
Если DpWmiQueryDataBlock вызывается в ответ на запрос IRP_MN_QUERY_SINGLE_INSTANCE , instanceCount имеет значение 1. Если DpWmiQueryDataBlock вызывается в ответ на запрос IRP_MN_QUERY_ALL_DATA , InstanceCount — это количество возвращаемых экземпляров.
[in, out] InstanceLengthArray
Указатель на предоставленный вызывающим массивом элементов ULONG размера InstanceCount. Драйвер заполняет каждый элемент массива, чтобы указать длину каждого возвращенного экземпляра. Если bufferAvail равно нулю, InstanceLengthArray имеет значение NULL.
[in] BufferAvail
Указывает максимальное количество байтов, доступных для получения данных в буфере в буфере. Если это значение равно нулю, вызывающий объект запрашивает, чтобы драйвер указал требуемый размер буфера в вызове WmiCompleteRequest. Дополнительные сведения см. в разделе "Примечания".
[out] Buffer
Указатель на буфер для получения данных экземпляра. Если буфер достаточно велик для получения всех данных, драйвер записывает данные экземпляра в буфер, при этом каждый экземпляр выравнивается по 8-байтовой границе. Если буфер слишком мал для получения всех данных, драйвер вызывает WmiCompleteRequest с параметром BufferUsed , равным требуемому размеру.
Возвращаемое значение
DpWmiQueryDataBlock возвращает STATUS_SUCCESS или состояние ошибки, например следующее:
Если драйвер не может выполнить запрос немедленно, он может вернуть STATUS_PENDING.
Комментарии
WMI вызывает подпрограмму DpWmiQueryDataBlock драйвера после того, как драйвер вызывает WmiSystemControl в ответ на запрос IRP_MN_QUERY_SINGLE_INSTANCE или IRP_MN_QUERY_ALL_DATA . Драйвер должен поместить адрес своей подпрограммы DpWmiQueryDataBlock в структуру WMILIB_CONTEXT , которая передается в WmiSystemControl.
Драйвер отвечает за проверку всех входных аргументов. В частности, драйвер должен выполнить следующие действия.
- Убедитесь, что значение GuidIndex находится в диапазоне от нуля до GuidCount-1 на основе элемента GuidCountструктуры WMILIB_CONTEXT .
- Убедитесь, что драйвер не помечает указанный блок данных для удаления. Если драйвер недавно указал флаг WMIREG_FLAG_REMOVE_GUID в структуре WMIGUIDREGINFO , содержащейся в структуре WMILIB_CONTEXT , запрос может быть получен до удаления.
- Убедитесь, что значения InstanceIndex и InstanceCount вместе указывают количество экземпляров блоков данных, находящихся в диапазоне, поддерживаемом драйвером блока данных. Если параметр InstanceIndex не равен нулю, параметр InstanceCount должен иметь значение 1. Если instanceIndex имеет значение 0, значение InstanceCount не должно превышать число поддерживаемых экземпляров.
- Убедитесь, что буфер, описанный в разделах Buffer и BufferAvail , достаточно велик для хранения всех запрошенных экземпляров блока данных. Каждый экземпляр должен начинаться с 8-байтовой границы, и между элементами данных в каждом экземпляре может существовать дополнительное заполнение.
Эта подпрограмма может быть страничной.
Дополнительные сведения о реализации этой процедуры см. в разделе Вызов WmiSystemControl для обработки ИРП WMI.
Требования
Требование | Значение |
---|---|
Целевая платформа | Персональный компьютер |
Верхняя часть | wmilib.h (включая Wmilib.h) |
IRQL | Звонил на PASSIVE_LEVEL. |