DeviceIoControl возвращает ERROR_INVALID_USER_BUFFER

Я пытаюсь вызвать IOCTL_BTH_GET_LOCAL_INFO с помощью DeviceIoControl, что, как мне кажется, можно сделать (соответственно IOCTL драйвера профиля Bluetooth).

Я использую Windows 7 x64, используя Visual Studio 2012 (вероятно, с конфигурацией по умолчанию).

Дескриптор имеет допустимое значение (я удалил код проверки), но 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, так что, вероятно, это просто моя ошибка (я не вижу никакой разницы).


person rnunes    schedule 15.10.2012    source источник


Ответы (1)


Вы отправляете IOCTL_BTH_GET_LOCAL_INFO не на то устройство (персональная сеть Bluetooth вместо радио Bluetooth).

Поэтому я предлагаю вам использовать BluetoothFindFirstRadio , BluetoothFindNextRadio< /a> и BluetoothFindRadioClose просто перебирать локальные радиомодули Bluetooth, а не угадывать для них правильные имена устройств DOS.

person Nikolay Khil    schedule 16.10.2012