【问题标题】:HidD_GetManufacturerString and similar functions return success, but do not modify the bufferHidD_GetManufacturerString 和类似函数返回成功,但不修改缓冲区
【发布时间】:2016-07-11 08:45:57
【问题描述】:

我遇到了 3 个函数(HidD_GetManufacturerStringHidD_GetProductStringHidD_GetSerialNumberString)的问题。问题是它们返回TRUE(表示成功),但不修改缓冲区(甚至不添加终止符)。

功能的 MSDN 页面:

HidD_GetManufacturerString:https://msdn.microsoft.com/en-us/library/windows/hardware/ff538959%28v=vs.85%29.aspx

HidD_GetProductString:https://msdn.microsoft.com/en-us/library/windows/hardware/ff539681%28v=vs.85%29.aspx

HidD_GetSerialNumberString:https://msdn.microsoft.com/en-us/library/windows/hardware/ff539683%28v=vs.85%29.aspx

下面是实际调用方法的代码:

wchar_t manufacturer[MAX_SERIAL_LEN];
wchar_t product[MAX_SERIAL_LEN];
wchar_t serial[MAX_SERIAL_LEN];

ZeroMemory(manufacturer, MAX_SERIAL_LEN);
ZeroMemory(product, MAX_SERIAL_LEN);
ZeroMemory(serial, MAX_SERIAL_LEN);

HidD_GetManufacturerString(hFile, manufacturer, MAX_SERIAL_LEN);
HidD_GetProductString(hFile, product, MAX_SERIAL_LEN);
HidD_GetSerialNumberString(hFile, serial, MAX_SERIAL_LEN);

printf("Information for device %s\nManufacturer: %S\nProduct: %S\nSerial: %S\n\n", 
    DevIntfDetailData->DevicePath, 
    manufacturer, product, serial
);

hFile 是这样打开的:

HANDLE hFile = CreateFile(DevIntfDetailData->DevicePath, 0, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);

DevIntfDetailData 使用 SetupDiGetDeviceInterfaceDetail 填充

MAX_SERIAL_LEN 定义为

sizeof(wchar_t)*127

【问题讨论】:

  • 呃,你用ZeroMemory怎么知道它不只是一个空字符串?删除这些呼叫,然后重试。
  • 就像我在第一段中所说的那样,它甚至没有添加终止符,它会在零字符串上添加。缓冲区真的没有被触及
  • 也许你没抓住重点。当缓冲区已经包含零时,如何检测它写入零字符?
  • 因为我专门将内存归零,因为它没有添加终结符

标签: c++ winapi usb hid


【解决方案1】:

可能是驱动程序错误。

我有一个类似的问题:函数返回TRUE,但缓冲区要么根本没有被触及,要么被随机垃圾填满。

这里有一个问题:这只发生在我的耳机上,而且只有当我通过 Skype/Teams/等主动使用它的麦克风时。一旦我离开电话,这些函数又开始返回普通名称。

这让我相信您看到的驱动程序有问题。我的是 Windows 10 1907 上的 Windows 标准耳机驱动程序。

【讨论】:

    猜你喜欢
    • 2010-12-17
    • 1970-01-01
    • 2014-08-29
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 2017-01-01
    • 1970-01-01
    • 2015-06-01
    相关资源
    最近更新 更多