DeviceIoControl返回ERROR_INVALID_USER_BUFFER

问题描述:

我试图使用DeviceIoControl调用IOCTL_BTH_GET_LOCAL_INFO,我相信它可以完成(相应地Bluetooth Profile Driver IOCTLs)。DeviceIoControl返回ERROR_INVALID_USER_BUFFER

我在使用Visual Studio 2012(可能与默认配置)在Windows 7 64位系统。

手柄有一个有效的值(我去掉了验证码),但总的DeviceIoControl返回ERROR_INVALID_USER_BUFFER(错误1784)。

下面的代码:

int main() { 

    BTH_LOCAL_RADIO_INFO buffer; 
    BOOL fStatus; 
    HANDLE h; 
    DWORD returned = 0; 

    h = CreateFile(
     TEXT("\\\\.\\BthPan"), 
     GENERIC_READ | GENERIC_WRITE , 
     FILE_SHARE_READ | FILE_SHARE_WRITE, 
     NULL, 
     OPEN_EXISTING, 
     0, 
     NULL); 


    fStatus = DeviceIoControl(
      h, 
      IOCTL_BTH_GET_LOCAL_INFO, 
      NULL, 0, 
      (LPVOID)&buffer, sizeof(BTH_LOCAL_RADIO_INFO), 
      &returned, 
      (LPOVERLAPPED) NULL 
      ); 
(...) 

经过一番研究,我尝试以下解决方案:

  1. 改变结构包对准1/4/8字节(与VS选项);
  2. 使用这8个字节对齐值(后来我发现,这 已经发生,即使有数据类型小于8个字节)。过了一会儿,我读过某处misaligment是DeviceIoControl的交易给你,所以可能没有必要担心。

的解决方案,上述所有都失败了。你觉得它是什么? VS有一堆为Win32配置的,但(虽然第一次与IOCTL),从来没有给我之前的一个问题。

我在32feet.NET上看到过一些代码,所以可能只是我的错误(我看不出有什么区别)。

您发送IOCTL_BTH_GET_LOCAL_INFO到错误的设备(蓝牙个人区域网络,而不是蓝牙无线电)。

因此,我建议您使用BluetoothFindFirstRadio,BluetoothFindNextRadioBluetoothFindRadioClose来简单地遍历本地蓝牙无线电,而不是为它们猜测正确的DOS设备名称。