функция WDF_WMI_BUFFER_APPEND_STRING (wdfwmi.h)
[Относится только к KMDF]
Функция WDF_WMI_BUFFER_APPEND_STRING копирует указанную строку Юникода в указанный буфер в формате, который требуется WMI.
Синтаксис
NTSTATUS WDF_WMI_BUFFER_APPEND_STRING(
[out] PVOID Buffer,
[in] ULONG BufferLength,
[in] PCUNICODE_STRING String,
[out] PULONG RequiredSize
);
Параметры
[out] Buffer
Указатель на буфер назначения, который получает строку.
[in] BufferLength
Длина в байтах буфера назначения, получающего строку.
[in] String
Указатель на структуру UNICODE_STRING , содержащую копируемые строки.
[out] RequiredSize
Указатель на расположение, которое получает количество байтов, необходимых для хранения указанной строки в буфере назначения.
Возвращаемое значение
WDF_WMI_BUFFER_APPEND_STRING возвращает STATUS_SUCCESS, если операция выполнена успешно. Если буфер назначения слишком мал для хранения строки Юникода, указанной параметром String , функция возвращает STATUS_BUFFER_TOO_SMALL.
Комментарии
WMI требует, чтобы строки, возвращаемые функцией обратного вызова EvtWmiInstanceQueryInstance , были предшествуют числу байтов. Функция WDF_WMI_BUFFER_APPEND_STRING вычисляет число байтов, сохраняет его в буфере назначения, а затем копирует строку из структуры UNICODE_STRING в целевой буфер.
Когда WDF_WMI_BUFFER_APPEND_STRING возвращается, расположение, на которое указывает параметр RequiredSize , содержит общее количество байтов, записанных в буфер. Чтобы найти первый адрес буфера, следующий за строкой, драйвер может передать значение RequiredSize в макрос WDF_PTR_ADD_OFFSET, определенный в Wdfcore.h.
Примеры
Следующий пример кода получен из примера драйвера Serial . В этом примере показана функция обратного вызова EvtWmiInstanceQueryInstance , которая получает символьное имя устройства и копирует его в выходной буфер функции обратного вызова.
NTSTATUS
EvtWmiQueryPortName(
IN WDFWMIINSTANCE WmiInstance,
IN ULONG OutBufferSize,
IN PVOID OutBuffer,
OUT PULONG BufferUsed
)
{
WDFDEVICE device;
PSERIAL_DEVICE_EXTENSION pDevExt;
WCHAR pRegName[SYMBOLIC_NAME_LENGTH];
UNICODE_STRING string;
USHORT nameSize = sizeof(pRegName);
NTSTATUS status;
PAGED_CODE();
device = WdfWmiInstanceGetDevice(WmiInstance);
pDevExt = SerialGetDeviceExtension(device);
status = SerialReadSymName(
device,
pRegName,
&nameSize
);
if (!NT_SUCCESS(status)) {
return status;
}
RtlInitUnicodeString(
&string,
pRegName
);
return WDF_WMI_BUFFER_APPEND_STRING(
OutBuffer,
OutBufferSize,
&string,
BufferUsed
);
}
Требования
Требование | Значение |
---|---|
Целевая платформа | Универсальное |
Минимальная версия KMDF | 1,0 |
Верхняя часть | wdfwmi.h (включая Wdf.h) |
Библиотека | None |