DeviceIoControl返回ERROR_INVALID_USER_BUFFER

时间:2012-10-15 21:40:07

标签: visual-studio bluetooth visual-studio-2012 ioctl 32feet

我正在尝试使用DeviceIoControl调用IOCTL_BTH_GET_LOCAL_INFO,我相信可以这样做(相应于Bluetooth Profile Driver IOCTLs)。

我在使用Visual Studio 2012的Windows 7 x64上(可能使用默认配置)。

句柄具有有效值(我删除了验证码)但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个字节)。过了一会儿,我读到了DeviceIoControl为你处理错误的地方,所以可能没必要担心。
  3. 上述所有解决方案都失败了。你觉得它是什么? VS有一堆Win32的配置,但之前从未给我一个问题(尽管第一次使用IOCTL)。

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

1 个答案:

答案 0 :(得分:1)

您正在将IOCTL_BTH_GET_LOCAL_INFO发送到错误的设备(蓝牙个人专区网络而不是蓝牙广播)。

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