Открыть Ndis-устройство

Тема в разделе "WASM.NETWORKS", создана пользователем babandr, 18 авг 2009.

  1. babandr

    babandr New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2005
    Сообщения:
    29
    Адрес:
    Voronesh
    Добрый день, уважаемые форумцы!

    Суть проблемы:
    Нужно программно работать с 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), что вполне логично...

    Буду безмерно благодарен, если кто-либо подскажет, как корректно открыть устройство или же работать с ним, не открывая (если такое возможно).
     
  2. o14189

    o14189 New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2009
    Сообщения:
    320
    желательно бы привести код
     
  3. mansurv

    mansurv New Member

    Публикаций:
    0
    Регистрация:
    19 авг 2009
    Сообщения:
    38
    Добрый день, вы писали:

    >
    >CreateFile("\\\\.\\\\Ndisuio"...) и некоторых несущественных предварительных действий пытаюсь
    >

    Драйвер Ndisuio.sys используется системой, нужно в исходниках DDK изменить его имя, переcобрать и установить в систему.
    С уважением mansur.
     
  4. babandr

    babandr New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2005
    Сообщения:
    29
    Адрес:
    Voronesh
    Код наверняка мало что даст, но...
    Код (Text):
    1. DWORD byteRet;
    2. HANDLE mHandle = CreateFile("\\\\.\\\\Ndisuio",GENERIC_READ | GENERIC_WRITE, 0, NULL,OPEN_EXISTING,
    3.                        FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, INVALID_HANDLE_VALUE);
    4.  
    5. DeviceIoControl(mHandle,IOCTL_NDISPROT_BIND_WAIT,NULL,0,NULL,0,&byteRet,NULL);
    6.  
    7. unsigned char buf[4000];
    8. PNDISPROT_QUERY_BINDING pQueryBinding = (PNDISPROT_QUERY_BINDING) buf;
    9. DeviceIoControl(mHandle,IOCTL_NDISPROT_QUERY_BINDING,pQueryBinding,sizeof(NDISPROT_QUERY_BINDING),
    10.       buf,sizeof(buf),&byteRet,NULL);
    11.  
    12. //в char device_name[] - строка с именем устройства
    13. int WNameLen = 0;
    14. unsigned int i;
    15. for (i = 0; i < strlen(device_name) && i < 199;i++)
    16. {
    17.  wNdisDeviceName[i] = (WCHAR)device_name[i];
    18.  WNameLen++;
    19. }
    20. wNdisDeviceName[i] = L'\0';
    21.  
    22. //и вот тут начинаются проблемы
    23. DeviceIoControl(mHandle, IOCTL_NDISPROT_OPEN_DEVICE,(LPVOID)&wNdisDeviceName[0],
    24.                  WNameLen*sizeof(WCHAR),NULL,0,&byteRet,NULL);
    Извиняюсь, что на С написано...
    А насчет переименования и пересборки драйвера...вот тут
    http://www.techtalkz.com/microsoft-device-drivers/252572-ndisprot-multiple-handles-same-device.html
    утверждается что якобы без этого можно обойтись, но я попробовал и ничего не вышло. Уж не знаю, что и делать. все идеи кончились.
     
  5. mansurv

    mansurv New Member

    Публикаций:
    0
    Регистрация:
    19 авг 2009
    Сообщения:
    38
    Добрый день, вы писали:

    >
    >//в char device_name[] - строка с именем устройства
    >

    Как получена эта строка? У меня так:
    Код (Text):
    1. wsprintf(szTempBuff, "\\DEVICE\\");
    2. strcat(szTempBuff, strAdapterName); // имя адаптера вида {GUID} из реестра
    И ещё: первый вызов DeviceIoControl в моём примере такой:
    Код (Text):
    1. DeviceIoControl(
    2.             Handle,
    3.             IOCTL_NDISPROT_BIND_WAIT, // вместо IOCTL_NDISPROT_QUERY_BINDING
    4.             NULL,
    5.             0,
    6.             NULL,
    7.             0,
    8.             &BytesReturned,
    9.             NULL))
    С уважением mansur.
     
  6. babandr

    babandr New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2005
    Сообщения:
    29
    Адрес:
    Voronesh
    Не, я вроде все правильно делаю...Сначала CreateFile, потом DeviceIoControl(mHandle,IOCTL_NDISPROT_BIND_WAIT...) - это действие, как я понимаю, собирает в кучу зависимые от драйвера устройства; потом DeviceIoControl(mHandle,IOCTL_NDISPROT_QUERY_BINDING...) - запрос списка этих самых устройств. Этот список в минимальном недетализированном виде - набор строк типа
    "\DEVICE\{F28D03D7-05FB-4C8F-97C9-C48593FB837C}" - удобно и не надо лазить в реестр.

    Ну а потом уже делаю из обычной строки юникодную строку и пытаюсь открыть устройство...
     
  7. mansurv

    mansurv New Member

    Публикаций:
    0
    Регистрация:
    19 авг 2009
    Сообщения:
    38
    Ну значит система не даёт открыть устройство. У меня с переименованным драйвером всё ок.
     
  8. babandr

    babandr New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2005
    Сообщения:
    29
    Адрес:
    Voronesh
    А переименование файла драйвера без пересборки прокатит, как думаешь?
     
  9. mansurv

    mansurv New Member

    Публикаций:
    0
    Регистрация:
    19 авг 2009
    Сообщения:
    38
    Часть имени драйвера ndisuio.sys, а именно ndisuio зашита в коде драйвера...

    babandr, рассказал бы, какую проблему решаешь, может чё и подскажут.
     
  10. babandr

    babandr New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2005
    Сообщения:
    29
    Адрес:
    Voronesh
    Проблему мониторинга уровня сигнала на wifi-антенне, наводимого разными точками доступа...
    И корень проблемы в том, что все существующие на данный момент методики работы с wlan-устройствами выдают по запросу список сетей, которые видит адаптер, с их характеристиками,но....этот список выдается явно кэшированный. И скорость обновления информации удручающе мала(в рамках моей задачи). вот я и залез в поисках решения на низкий уровень - надеялся найти решение, которое бы позволяло управлять частотой сканирования обнаруженных устройством точек доступа.
     
  11. mansurv

    mansurv New Member

    Публикаций:
    0
    Регистрация:
    19 авг 2009
    Сообщения:
    38
    стучись в аську 430-062-523
     
  12. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    //оффтоп

    За что извиняться? А на чем еще дрова писать-то?
     
  13. mansurv

    mansurv New Member

    Публикаций:
    0
    Регистрация:
    19 авг 2009
    Сообщения:
    38
    хотел шепнуть где взять переименованный драйвер, не при всех же такое разглашать...
     
  14. babandr

    babandr New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2005
    Сообщения:
    29
    Адрес:
    Voronesh
    Да я, собственно, не дрова пишу...из user-mode оперирую. А извиняюсь потому, что тут вроде ассемблерщики собираются, а им положено Ц++ не любить :)