簡體   English   中英

BLE 掃描間隔 Windows 10 - DeviceIoControl 返回 false,最后一個錯誤:1784 - ERROR_INVALID_USER_BUFFER

[英]BLE Scan Interval Windows 10 - DeviceIoControl return false with Last error: 1784 - ERROR_INVALID_USER_BUFFER

我們需要在 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。 並且似乎不影響掃描間隔。 請問有什么建議可以解決嗎?

我遇到了同樣的問題。 通過在此鍵下添加一些新的注冊表項來解決: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 通用應用程序,此結構應定義如下(在較新的 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;
}

請使用新結構:

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

當我遇到這個問題時,@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://docs.microsoft.com/en-us/windows-hardware/drivers/kernel/defining-io-control-codes

...導致 function 代碼為 0x0463。 很清楚它的作用,但很高興看到它的文檔。

(我沒有足夠的聲譽發表評論,因此有一個新的答案。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM