BLE Scan Interval Windows 10 - DeviceIoControl return false with Last error: 1784 - ERROR_INVALID_USER_BUFFER
BLE Scan Interval Windows 10 - DeviceIoControl return false with Last error: 1784 - ERROR_INVALID_USER_BUFFER
我们需要在 windows 10 中调整 BLE 扫描间隔并在 中找到解决方案。
然而,当调用 DeviceIoControl(handle, 0x41118c, ref req, 8, IntPtr.Zero, 0, out outsize, IntPtr.Zero);
时,它总是 return 错误,最后一个错误是 1784 - ERROR_INVALID_USER_BUFFER。并且似乎不影响扫描间隔。请问有什么解决办法吗?
请使用新结构:
struct ScanRequest1903 {
uint32_t unknown1;
uint32_t scan_type; // 0 = passive, 1 = active
uint32_t unknown2;
uint16_t scan_interval;
uint16_t scan_window;
uint32_t unknown3[2];
};
这是针对 C 的,但您可以将其重写为 C#。
我遇到了同样的问题。通过在此键下添加一些新的注册表项来解决:
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Bluetooth\WinRT\BluetoothLEAdvertisementWatcher
添加以下值:DWORD:ScanWindow、ScanInterval 并调整它以适合您的配置。
将 DeviceIoControl(..)
中的结构大小从 8 更改为 24。应该会有帮助。
DeviceIoControl(handle, 0x41118c, ref req, 24, IntPtr.Zero, 0, out outsize, IntPtr.Zero);
对于Windows Universal App,这个结构应该定义如下(在较新的windows 10 次编译中改变了):
[StructLayout(LayoutKind.Sequential)]
private struct LE_SCAN_REQUEST
{
internal uint unknown1;
internal int scanType;
internal uint unknown2;
internal ushort scanInterval;
internal ushort scanWindow;
internal uint unknown3_0;
internal uint unknown3_1;
}
当我 运行 解决这个问题时,@asier70 的回答让我最接近可行的解决方案。我唯一的变化是我认为 scanWindow 和 scanInterval 字段应该翻转成如下所示:
[StructLayout(LayoutKind.Sequential)]
private struct LE_SCAN_REQUEST
{
internal uint unknown1;
internal int scanType;
internal uint unknown2;
internal ushort scanWindow;
internal ushort scanInterval;
internal uint unknown3_0;
internal uint unknown3_1;
}
我按照@Emil 的建议运行 USBPcap/Wireshark 确认了这一点。
一般来说,当第一个ushort参数大于第二个ushort参数时,DeviceIoControl()/GetLastError() returns 0x57 ERROR_INVALID_PARAMETER.
附带说明一下,我很想知道 0x41118c DeviceIoControl 代码的来源。在此处解析该值:
https://docs.microsoft.com/en-us/windows-hardware/drivers/kernel/defining-i-o-control-codes
...导致函数代码为 0x0463。它的作用很清楚,但如果能看到它的文档就好了。
(我没有足够的声誉来发表评论,因此有一个新的答案。)
我们需要在 windows 10 中调整 BLE 扫描间隔并在
然而,当调用 DeviceIoControl(handle, 0x41118c, ref req, 8, IntPtr.Zero, 0, out outsize, IntPtr.Zero);
时,它总是 return 错误,最后一个错误是 1784 - ERROR_INVALID_USER_BUFFER。并且似乎不影响扫描间隔。请问有什么解决办法吗?
请使用新结构:
struct ScanRequest1903 {
uint32_t unknown1;
uint32_t scan_type; // 0 = passive, 1 = active
uint32_t unknown2;
uint16_t scan_interval;
uint16_t scan_window;
uint32_t unknown3[2];
};
这是针对 C 的,但您可以将其重写为 C#。
我遇到了同样的问题。通过在此键下添加一些新的注册表项来解决: HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Bluetooth\WinRT\BluetoothLEAdvertisementWatcher 添加以下值:DWORD:ScanWindow、ScanInterval 并调整它以适合您的配置。
将 DeviceIoControl(..)
中的结构大小从 8 更改为 24。应该会有帮助。
DeviceIoControl(handle, 0x41118c, ref req, 24, IntPtr.Zero, 0, out outsize, IntPtr.Zero);
对于Windows Universal App,这个结构应该定义如下(在较新的windows 10 次编译中改变了):
[StructLayout(LayoutKind.Sequential)]
private struct LE_SCAN_REQUEST
{
internal uint unknown1;
internal int scanType;
internal uint unknown2;
internal ushort scanInterval;
internal ushort scanWindow;
internal uint unknown3_0;
internal uint unknown3_1;
}
当我 运行 解决这个问题时,@asier70 的回答让我最接近可行的解决方案。我唯一的变化是我认为 scanWindow 和 scanInterval 字段应该翻转成如下所示:
[StructLayout(LayoutKind.Sequential)]
private struct LE_SCAN_REQUEST
{
internal uint unknown1;
internal int scanType;
internal uint unknown2;
internal ushort scanWindow;
internal ushort scanInterval;
internal uint unknown3_0;
internal uint unknown3_1;
}
我按照@Emil 的建议运行 USBPcap/Wireshark 确认了这一点。
一般来说,当第一个ushort参数大于第二个ushort参数时,DeviceIoControl()/GetLastError() returns 0x57 ERROR_INVALID_PARAMETER.
附带说明一下,我很想知道 0x41118c DeviceIoControl 代码的来源。在此处解析该值:
https://docs.microsoft.com/en-us/windows-hardware/drivers/kernel/defining-i-o-control-codes
...导致函数代码为 0x0463。它的作用很清楚,但如果能看到它的文档就好了。
(我没有足够的声誉来发表评论,因此有一个新的答案。)