DeviceIoControl returns ERROR_INVALID_USER_BUFFER



我正在尝试使用DeviceIoControl调用IOCTL_BTH_GET_LOCAL_INFO,我相信这是可以做到的(相应于蓝牙配置文件驱动程序IOCTL)。

我使用的是使用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为您处理错误照明,所以可能不需要担心

上述所有解决方案都失败了。你觉得是什么?VS有一堆Win32配置,但这以前从未给我带来过问题(不过是第一次使用IOCTL)。

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

您将IOCTL_BTH_GET_LOCAL_INFO发送到错误的设备(蓝牙个人局域网而不是蓝牙收音机)。

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

最新更新