【问题标题】:How DeviceIoControl Returns a Null Terminated String from a Device DriverDeviceIoControl 如何从设备驱动程序返回空终止字符串
【发布时间】:2011-04-08 10:04:33
【问题描述】:

一些驱动程序通过 DeviceIoControl 返回一个结构,该结构包含一个以 null 结尾的字符串,比如符号名称。该字符串的位置应该在哪里?例如,USB 主控制器接受 IOCTL_USB_GET_ROOT_HUB_NAME (http://msdn.microsoft.com/en-us/library/ff537326(v=VS.85).aspx),它接受 USB_HCD_DRIVERKEY_NAME 结构的缓冲区作为输出。仔细观察,该结构http://msdn.microsoft.com/en-us/library/ff539325(v=VS.85).aspx 的 DriverKeyName 字段只是一个具有 1 个 WCHAR 类型元素的数组。实际的驱动程序密钥名称应该在哪里?

【问题讨论】:

    标签: winapi usb driver device wdk


    【解决方案1】:

    这是 Windows 上相当常见的模式。结构将有类似WCHAR SomeNameOrPath[1] 作为最后一个字段。这允许为结构分配一个大缓冲区,以便结构之后的字节可以包含字符串的其余部分。

    【讨论】:

    • 对于 IOCTL_USB_GET_ROOT_HUB_NAME 示例,这是否意味着我需要在 DeviceIoControl 调用中分配一个非常大的输出缓冲区,而不仅仅是一个 size = sizeof(USB_HCD_DRIVERKEY_NAME) 的简单缓冲区?如果是,应该有多大?
    • 是的,它需要足够大以容纳 USB_HCD_DRIVERKEY_NAME 结构和随附的字符串。您可以尝试分配一个大缓冲区并希望它足够大,但是使用这种模式您通常会调用该函数两次 - 一次是为了获得所需的大小,然后在分配缓冲区后再次调用。 MSDN 在 IOCTL_GET_HCD_DRIVERKEY_NAME 页面 (msdn.microsoft.com/en-us/library/ff537236.aspx) 上有一个示例。
    • 在链接显示的示例中,第二步检查是否 (nBytes
    • 我想这只是一个健全的检查。注释说ActualLength是结构体的大小加上名字的大小。
    猜你喜欢
    • 2016-07-18
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多