Я пытаюсь вызвать 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/4/8 байт (с опциями VS);
- Использование значений, выровненных по 8 байтам (позже я узнал, что это уже происходит, даже с типами данных меньше 8 байт). Через какое-то время я где-то прочитал, что DeviceIoControl справляется с несоответствием для вас, так что, вероятно, не стоит об этом беспокоиться.
Все вышеперечисленные решения не увенчались успехом. Что вы думаете, что это? У VS есть куча конфигураций для Win32, но это никогда не доставляло мне проблем раньше (хотя впервые с IOCTL).
Я видел часть этого кода на 32feet.NET, так что, вероятно, это просто моя ошибка (я не вижу никакой разницы).