BLE 扫描间隔 Windows 10 - DeviceIoControl 返回 false,最后一个错误:1784 - ERROR_INVALID_USER_BUFFER

问题描述 投票:0回答:5

我们需要调整 Windows 10 中的 BLE 扫描间隔,并在 BLE Scan Interval Windows 10 中找到解决方案。

但是,当调用

DeviceIoControl(handle, 0x41118c, ref req, 8, IntPtr.Zero, 0, out outsize, IntPtr.Zero);
时,它总是返回 false,最后一个错误是 1784 - ERROR_INVALID_USER_BUFFER。并且似乎不影响扫描间隔。请问有什么建议可以解决吗?

c# windows bluetooth-lowenergy
5个回答
1
投票

我也遇到了同样的问题。通过在该键下添加一些新的注册表项来解决: HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Bluetooth\WinRT\BluetoothLEAdvertisementWatcher 添加以下值:DWORD:ScanWindow、ScanInterval 并调整它以适合您的配置。


1
投票

DeviceIoControl(..)
中的结构大小从 8 更改为 24。这应该会有帮助。

DeviceIoControl(handle, 0x41118c, ref req, 24, IntPtr.Zero, 0, out outsize, IntPtr.Zero);

对于 Windows 通用应用程序,此结构应定义如下(在较新的 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;
}

0
投票

请使用新结构:

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#。


0
投票

当我遇到这个问题时,@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() 返回 0x57 ERROR_INVALID_PARAMETER。

顺便说一下,我很想知道 0x41118c DeviceIoControl 代码来自哪里。在这里解析该值:

https://learn.microsoft.com/en-us/windows-hardware/drivers/kernel/defining-i-o-control-codes

...导致功能代码为 0x0463。它的作用很清楚,但很高兴看到它的文档。

(我没有足够的声誉来发表评论,因此有一个新答案。)


0
投票

将 Windows 11 升级到版本 24H2 后,这个技巧对我不再起作用了。 函数 DeviceIoControl() 返回 false,GetLastWin32Error() 返回 87 (0x57) - 参数不正确。我尝试了结构上的各种改变,但没有好的结果。 有谁知道现在的结构应该是什么样子?

© www.soinside.com 2019 - 2024. All rights reserved.