Добрый день, уважаемые форумцы! Суть проблемы: Нужно программно работать с Ndis-устройством (wifi-адаптер) - опрос параметров и все такое... После получения хендла посредстом CreateFile("\\\\.\\\\Ndisuio"...) и некоторых несущественных предварительных действий пытаюсь открыть устройство при помощи вызова DeviceIoControl(mHandle, IOCTL_NDISPROT_OPEN_DEVICE,...). Функция возвращается с ошибкой,а код ошибки, полученный GetLastError(), равен 170 - устройство занято. На этом все, собственно, и заканчивается. Дальнейшие попытки обратиться к устройству по хендлу методом DeviceIoControl для запроса(IOCTL_NDISPROT_QUERY_OID_VALUE) или команды(IOCTL_NDISPROT_SET_OID_VALUE) кончаются возвратами кода 1167 (DEVICE_NOT_CONNECT), что вполне логично... Буду безмерно благодарен, если кто-либо подскажет, как корректно открыть устройство или же работать с ним, не открывая (если такое возможно).
Добрый день, вы писали: > >CreateFile("\\\\.\\\\Ndisuio"...) и некоторых несущественных предварительных действий пытаюсь > Драйвер Ndisuio.sys используется системой, нужно в исходниках DDK изменить его имя, переcобрать и установить в систему. С уважением mansur.
Код наверняка мало что даст, но... Код (Text): DWORD byteRet; HANDLE mHandle = CreateFile("\\\\.\\\\Ndisuio",GENERIC_READ | GENERIC_WRITE, 0, NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, INVALID_HANDLE_VALUE); DeviceIoControl(mHandle,IOCTL_NDISPROT_BIND_WAIT,NULL,0,NULL,0,&byteRet,NULL); unsigned char buf[4000]; PNDISPROT_QUERY_BINDING pQueryBinding = (PNDISPROT_QUERY_BINDING) buf; DeviceIoControl(mHandle,IOCTL_NDISPROT_QUERY_BINDING,pQueryBinding,sizeof(NDISPROT_QUERY_BINDING), buf,sizeof(buf),&byteRet,NULL); //в char device_name[] - строка с именем устройства int WNameLen = 0; unsigned int i; for (i = 0; i < strlen(device_name) && i < 199;i++) { wNdisDeviceName[i] = (WCHAR)device_name[i]; WNameLen++; } wNdisDeviceName[i] = L'\0'; //и вот тут начинаются проблемы DeviceIoControl(mHandle, IOCTL_NDISPROT_OPEN_DEVICE,(LPVOID)&wNdisDeviceName[0], WNameLen*sizeof(WCHAR),NULL,0,&byteRet,NULL); Извиняюсь, что на С написано... А насчет переименования и пересборки драйвера...вот тут http://www.techtalkz.com/microsoft-device-drivers/252572-ndisprot-multiple-handles-same-device.html утверждается что якобы без этого можно обойтись, но я попробовал и ничего не вышло. Уж не знаю, что и делать. все идеи кончились.
Добрый день, вы писали: > >//в char device_name[] - строка с именем устройства > Как получена эта строка? У меня так: Код (Text): wsprintf(szTempBuff, "\\DEVICE\\"); strcat(szTempBuff, strAdapterName); // имя адаптера вида {GUID} из реестра И ещё: первый вызов DeviceIoControl в моём примере такой: Код (Text): DeviceIoControl( Handle, IOCTL_NDISPROT_BIND_WAIT, // вместо IOCTL_NDISPROT_QUERY_BINDING NULL, 0, NULL, 0, &BytesReturned, NULL)) С уважением mansur.
Не, я вроде все правильно делаю...Сначала CreateFile, потом DeviceIoControl(mHandle,IOCTL_NDISPROT_BIND_WAIT...) - это действие, как я понимаю, собирает в кучу зависимые от драйвера устройства; потом DeviceIoControl(mHandle,IOCTL_NDISPROT_QUERY_BINDING...) - запрос списка этих самых устройств. Этот список в минимальном недетализированном виде - набор строк типа "\DEVICE\{F28D03D7-05FB-4C8F-97C9-C48593FB837C}" - удобно и не надо лазить в реестр. Ну а потом уже делаю из обычной строки юникодную строку и пытаюсь открыть устройство...
Часть имени драйвера ndisuio.sys, а именно ndisuio зашита в коде драйвера... babandr, рассказал бы, какую проблему решаешь, может чё и подскажут.
Проблему мониторинга уровня сигнала на wifi-антенне, наводимого разными точками доступа... И корень проблемы в том, что все существующие на данный момент методики работы с wlan-устройствами выдают по запросу список сетей, которые видит адаптер, с их характеристиками,но....этот список выдается явно кэшированный. И скорость обновления информации удручающе мала(в рамках моей задачи). вот я и залез в поисках решения на низкий уровень - надеялся найти решение, которое бы позволяло управлять частотой сканирования обнаруженных устройством точек доступа.
Да я, собственно, не дрова пишу...из user-mode оперирую. А извиняюсь потому, что тут вроде ассемблерщики собираются, а им положено Ц++ не любить