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/4/8字节(与VS选项);
- 使用这8个字节对齐值(后来我发现,这 已经发生,即使有数据类型小于8个字节)。过了一会儿,我读过某处misaligment是DeviceIoControl的交易给你,所以可能没有必要担心。
的解决方案,上述所有都失败了。你觉得它是什么? VS有一堆为Win32配置的,但(虽然第一次与IOCTL),从来没有给我之前的一个问题。
我在32feet.NET上看到过一些代码,所以可能只是我的错误(我看不出有什么区别)。
答
您发送IOCTL_BTH_GET_LOCAL_INFO
到错误的设备(蓝牙个人区域网络,而不是蓝牙无线电)。
因此,我建议您使用BluetoothFindFirstRadio
,BluetoothFindNextRadio
和BluetoothFindRadioClose
来简单地遍历本地蓝牙无线电,而不是为它们猜测正确的DOS设备名称。