Поделиться через


Функция ScsiPortWmiSetData (scsiwmi.h)

Подпрограмма ScsiPortWmiSetData обновляет структуру WNODE_ALL_DATA в контексте запроса, чтобы указать положение и длину данных для экземпляра.

Примечание В будущем модели драйвера портов SCSI и драйвера для минипорта SCSI могут быть изменены или недоступны. Вместо этого рекомендуется использовать модели драйверов Storport и драйверов для мини-портов Storport .
 

Синтаксис

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 :

ScsiPortWmiSetInstanceCount

ScsiPortWmiSetData

ScsiPortWmiSetInstanceName

Драйвер мини-порта должен сначала вызвать 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)

См. также раздел

SCSIWMI_REQUEST_CONTEXT

WNODE_ALL_DATA

WNODE_SINGLE_INSTANCE