Функция ScsiPortWmiSetData (scsiwmi.h)
Подпрограмма ScsiPortWmiSetData обновляет структуру WNODE_ALL_DATA в контексте запроса, чтобы указать положение и длину данных для экземпляра.
Синтаксис
PVOID ScsiPortWmiSetData(
[in] PSCSIWMI_REQUEST_CONTEXT RequestContext,
[in] ULONG InstanceIndex,
[in] ULONG DataLength,
[out] PULONG BufferAvail,
[in, out] PULONG SizeNeeded
);
Параметры
[in] RequestContext
Указатель на структуру типа SCSIWMI_REQUEST_CONTEXT , которая содержит контекст запроса для WMI SRB.
[in] InstanceIndex
Содержит индекс, указывающий экземпляр, для которого необходимо указать положение и длину данных экземпляра.
[in] DataLength
Указывает количество байтов данных, необходимых для описания экземпляра.
[out] BufferAvail
Должен содержать количество байтов буферного пространства в WNODE_ALL_DATA структуре, которую можно использовать для описания имен и данных экземпляров. При возврате этот элемент содержит количество оставшихся байтов буферного пространства.
Существует три подпрограммы WMI портов SCSI, которые возвращают значение для доступного размера буфера в параметре BufferAvail :
ScsiPortWmiSetData
Драйвер мини-порта должен сначала вызвать ScsiPortWmiSetInstanceCount , но после вызова ScsiPortWmiSetInstanceCount не имеет значения, в каком порядке мини-драйвер вызывает ScsiPortWmiSetData и ScsiPortWmiSetInstanceName. При вызове ScsiPortWmiSetData или ScsiPortWmiSetInstanceName значение, передаваемое подпрограмме в параметре BufferAvail , должно совпадать со значением, возвращенным в параметре BufferAvail последней подпрограммой WMI порта SCSI. Например, предположим, что minidriver сначала вызывает ScsiPortWmiSetInstanceCount , и эта подпрограмма возвращает значение 1000 в параметре BufferAvail . Затем мини-накопитель вызывает ScsiPortWmiSetData , который возвращает значение 500 в параметре BufferAvail . Наконец, мини-диск вызывает ScsiPortWmiSetInstanceName , который возвращает значение 200 в параметре BufferAvail . Начальное значение 1000 должно быть передано в ScsiPortWmiSetData в BufferAvail, а значение 500 — в ScsiPortWmiSetInstanceName.
Если недостаточно доступной памяти для добавления новых данных экземпляра размером DataLength байт, в элементе BufferAvail будет возвращен ноль.
[in, out] SizeNeeded
Указывает при входных данных количество байтов, необходимых для описания всего WNODE перед добавлением описательных данных для экземпляра, указанного instanceIndex. При возврате этот элемент будет содержать размер WNODE, включая данные для нового экземпляра.
Возвращаемое значение
Подпрограмма ScsiPortWmiSetData возвращает указатель на буфер, в котором вызывающий объект может хранить описательные сведения об экземпляре, определяемом InstanceIndex. Если ScsiPortWmiSetData не может выделить достаточно памяти для данных экземпляра или если WNODE, содержащийся в контексте запроса, не относится к типу WNODE_ALL_DATA, ScsiPortWmiSetData возвращает значение NULL.
Комментарии
Мини-накопитель должен вызвать ScsiPortWmiSetInstanceCount перед вызовом ScsiPortWmiSetData.
Параметр RequestContext указывает на структуру контекста запроса , SCSIWMI_REQUEST_CONTEXT, которая содержит сведения, связанные с блоком запросов SCSI (SRB) инструментария управления Windows (WMI). Структура контекста запроса, в свою очередь, содержит одну из структур WMI WNODE_XXX , которая используется системой WMI для передачи данных между потребителями данных в пользовательском режиме и поставщиками данных в режиме ядра, такими как драйверы.
Подпрограмма ScsiPortWmiSetData требует, чтобы структура WNODE, определенная в контексте запроса, была типа WNODE_ALL_DATA. Это связано с тем , что ScsiPortWmiSetData может указать расположение и длину буферов данных для любого экземпляра, связанного с блоком данных WMI. В отличие от структуры WNODE_SINGLE_INSTANCE , содержащей сведения об одном экземпляре, структура WNODE_ALL_DATA содержит массив указателей на буферные области для нескольких экземпляров, а ScsiPortWmiSetData использует параметр InstanceIndex в качестве индекса в этом массиве для инициализации соответствующего элемента массива для конкретного экземпляра. Каждый элемент массива после инициализации содержит размер и расположение буферной области для экземпляра.
Память, выделенная для контекста запроса, должна оставаться действительной до тех пор, пока драйвер мини-порта не вызовет ScsiPortWmiPostProcess, а ScsiPortWmiPostProcess не вернет окончательное состояние SRB и размер буфера. Если SRB может выполняться, память для контекста запроса должна быть выделена из расширения SRB. Если SRB не удается выполнить, память может быть выделена из кадра стека, который не выходит из область.
Требования
Требование | Значение |
---|---|
Целевая платформа | Персональный компьютер |
Верхняя часть | scsiwmi.h (включая Miniport.h, Scsi.h) |