WdfFdoInitQueryProperty 函数 (wdffdo.h)

[适用于 KMDF 和 UMDF]

WdfFdoInitQueryProperty 方法检索指定的设备属性。

语法

NTSTATUS WdfFdoInitQueryProperty(
  [in]  PWDFDEVICE_INIT          DeviceInit,
  [in]  DEVICE_REGISTRY_PROPERTY DeviceProperty,
  [in]  ULONG                    BufferLength,
  [out] PVOID                    PropertyBuffer,
  [out] PULONG                   ResultLength
);

参数

[in] DeviceInit

指向驱动程序从其 EvtDriverDeviceAdd 回调函数获取的 WDFDEVICE_INIT 结构的指针。

[in] DeviceProperty

标识要检索的设备属性 的DEVICE_REGISTRY_PROPERTY类型的枚举器值。

[in] BufferLength

PropertyBuffer 指向的缓冲区的大小(以字节为单位)。

[out] PropertyBuffer

调用方提供的指针,指向调用方分配的缓冲区,该缓冲区接收请求的设备属性。 如果 BufferLength 参数为零,则此指针可以为 NULL

[out] ResultLength

调用方提供的位置,返回时包含 WdfFdoInitQueryProperty 存储在 PropertyBuffer 中的信息的大小(以字节为单位)。 如果此方法的返回值 STATUS_BUFFER_TOO_SMALL,ResultLength 将接收所需的缓冲区大小。

返回值

如果操作成功,该方法将返回STATUS_SUCCESS。 其他返回值包括:

返回代码 说明
STATUS_BUFFER_TOO_SMALL
提供的缓冲区太小,无法接收信息。
STATUS_INVALID_PARAMETER_2
指定的 DeviceProperty 值无效。
STATUS_INVALID_DEVICE_REQUEST
WDFDEVICE_INIT 结构不是从驱动程序的 EvtDriverDeviceAdd 回调函数获取的。
 

该方法还可能返回其他 NTSTATUS 值

注解

在接收设备属性数据之前,驱动程序通常必须对 WdfFdoInitQueryProperty 进行初始调用,以获取所需的缓冲区大小。 对于某些属性,数据大小可以在返回所需大小的时间与驱动程序再次调用此例程的时间之间发生更改。 因此,驱动程序应在循环中调用 WdfFdoInitQueryProperty ,该循环将一直执行,直到返回状态不STATUS_BUFFER_TOO_SMALL。

最好仅在所需的缓冲区大小已知且不变时才使用 WdfFdoInitQueryProperty ,因为在这种情况下,驱动程序只需调用 WdfFdoInitQueryProperty 一次。 如果所需的缓冲区大小未知或变化,驱动程序应调用 WdfFdoInitAllocAndQueryProperty

驱动程序只能在调用 WdfDeviceCreate 之前调用 WdfFdoInitQueryProperty。 有关调用 WdfDeviceCreate 的详细信息,请参阅 创建框架设备对象

调用 WdfDeviceCreate 后,驱动程序可以通过调用 WdfDeviceQueryProperty 来获取设备属性信息。

有关 WdfFdoInitQueryProperty 方法的详细信息,请参阅 在函数驱动程序中创建设备对象

或者,可以使用 WdfFdoInitQueryPropertyEx 访问通过统一属性模型公开的设备属性。

示例

下面的代码示例获取一个 Unicode 字符串,该字符串表示设备的枚举器的名称,如果字符串为“PCI”,则返回 TRUE

NTSTATUS  status = STATUS_SUCCESS;
WCHAR  enumeratorName[64] = {0};
ULONG  returnSize;
UNICODE_STRING  unicodeEnumName, temp;

status = WdfFdoInitQueryProperty(
                                 DeviceInit,
                                 DevicePropertyEnumeratorName,
                                 sizeof(enumeratorName),
                                 enumeratorName,
                                 &returnSize
                                 );
if(!NT_SUCCESS(status)){
    return status;
}

RtlInitUnicodeString(
                     &unicodeEnumName,
                     enumeratorName
                     );
RtlInitUnicodeString(
                     &temp,
                     L"PCI"
                     );
if(RtlCompareUnicodeString(
                           &unicodeEnumName,
                           &temp,
                           TRUE
                           ) == 0) {
    //
    // This device is a PCI device.
    //
    return TRUE;
}

要求

要求
目标平台 通用
最低 KMDF 版本 1.0
最低 UMDF 版本 2.0
标头 wdffdo.h (包括 Wdf.h)
Library Wdf01000.sys (KMDF) ;WUDFx02000.dll (UMDF)
IRQL PASSIVE_LEVEL
DDI 符合性规则 DeviceInitAPI (kmdf) DriverCreate (kmdf) KmdfIrql (kmdf) KmdfIrql2 (kmdf) 、KmdfIrqlExplicit (kmdf)

另请参阅

WdfDeviceQueryProperty

WdfFdoInitAllocAndQueryProperty