NDIS и ProtocolBindAdapter

Тема в разделе "WASM.NT.KERNEL", создана пользователем Mika0x65, 9 мар 2011.

  1. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Мое почтение всем.

    Пробую написать простейший NDIS драйвер протокола. Возникла пара вопросов.

    Код (Text):
    1. #include <ntddk.h>
    2. #include <ndis.h>
    3. #include "dbgmsg.h"
    4.  
    5. NDIS_HANDLE ProtocolHandle;
    6.  
    7. VOID NdisTestBindAdapter(__out  PNDIS_STATUS Status,
    8.                          __in   NDIS_HANDLE BindContext,
    9.                          __in   PNDIS_STRING DeviceName,
    10.                          __in   PVOID SystemSpecific1,
    11.                          __in   PVOID SystemSpecific2)
    12. {
    13.     DBG_TRACE("NdisTestBindAdapter", "Called");
    14.     *Status = NDIS_STATUS_SUCCESS;
    15. }
    16.  
    17. VOID NdisTestUnbindAdapter(__out  PNDIS_STATUS Status,
    18.                            __in   NDIS_HANDLE ProtocolBindingContext,
    19.                            __in   NDIS_HANDLE UnbindContext)
    20. {
    21.     DBG_TRACE("NdisTestUnbindAdapter", "Called");
    22.     *Status = NDIS_STATUS_SUCCESS;
    23. }
    24.  
    25. NDIS_STATUS NdisTestPnPEvent(__in  NDIS_HANDLE ProtocolBindingContext,
    26.                              __in  PNET_PNP_EVENT NetPnPEvent)
    27. {
    28.     DBG_TRACE("NdisTestPnPEvent", "Called");
    29.     return NDIS_STATUS_SUCCESS;
    30. }
    31.  
    32. NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegPath)
    33. {
    34.     NDIS_STATUS                   NdisStatus;
    35.     NTSTATUS                      status = STATUS_SUCCESS;
    36.     NDIS_STRING                   ProtocolName = NDIS_STRING_CONST("NDISTest");
    37.     NDIS_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics;
    38.  
    39.     DBG_TRACE("DriverEntry", "Loading");
    40.  
    41.     NdisZeroMemory(&ProtocolCharacteristics, sizeof(ProtocolCharacteristics));
    42.  
    43.     ProtocolCharacteristics.MajorNdisVersion = 0x05;
    44.     ProtocolCharacteristics.MinorNdisVersion = 0x00;
    45.     ProtocolCharacteristics.Name = ProtocolName;
    46.     ProtocolCharacteristics.BindAdapterHandler = NdisTestBindAdapter;
    47.     ProtocolCharacteristics.UnbindAdapterHandler = NdisTestUnbindAdapter;
    48.     ProtocolCharacteristics.PnPEventHandler = NdisTestPnPEvent;
    49.    
    50.     NdisRegisterProtocol(&NdisStatus, &ProtocolHandle, &ProtocolCharacteristics, sizeof(ProtocolCharacteristics));
    51.     if (NdisStatus != NDIS_STATUS_SUCCESS)
    52.     {
    53.         DBG_PRINT2("NdisRegisterProtocol: %X\n", NdisStatus);
    54.         status = STATUS_UNSUCCESSFUL;
    55.     }
    56.  
    57.     return status;
    58. }
    В WinDbg вижу:
    Почему-то не вызывается ProtocolBindAdapter. Насколько я понял, она должна вызываться NDIS'ом сразу после успешной регистрации. Кроме того, не совсем ясна роль параметра BindContext.
    Код (Text):
    1. VOID ProtocolBindAdapter(
    2.   __out  PNDIS_STATUS Status,
    3.   __in   NDIS_HANDLE BindContext,
    4.   __in   PNDIS_STRING DeviceName,
    5.   __in   PVOID SystemSpecific1,
    6.   __in   PVOID SystemSpecific2
    7. )
    Его надо просто передать в NdisCompleteBindAdapter в случае отложенной привязки к NIC'у?

    Заранее благодарен.
     
  2. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    Mika0x65
    1) Девайс создай (FILE_DEVICE_NETWORK).
    2) Где остальные обработчики типа OpenAdapterCompleteHandler \ CloseAdapterCompleteHandler, и так далее.
    3) Возможно еще ошибка в inf описалове.
    4) Какая ось ? если виста и выше, то нужно 6 версию протокола.
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    видел такое раньше: грузишь драйвер просто через звлоаддрайвер? )
    грузи по-нормальному через инф
     
  4. ntkernelspawn

    ntkernelspawn New Member

    Публикаций:
    0
    Регистрация:
    17 дек 2010
    Сообщения:
    61
    - не обязательно ...

    - надо

    Скорее всего проблема в ProtocolCharacteristics.Name

    не обязательно ...

    Mika0x65
    Добавь фукнции и проверь "HKR,Ndi,Service,ProtoName" в inf файле!
     
  5. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Отвечу сразу всем :).

    Устройство не создаю -- общения с UserMode нет, драйвер отчитывается только с помощью DbgPrint. Насколько я понимаю, NDIS6.0 поддерживает NDIS 5.X. Драйвер запускается в XP с помощью sc.exe. Попробую загрузить через .inf. Насчет обработчиков: хочется написать самый минимальный драйвер, чтобы не утонуть в деталях. Поэтому старался добавить только минимум обработчиков. Попробую добавить ProtocolOpenAdapter, ProtocolOpenAdapterComplete, ProtocolCloseAdapter и ProtocolCloseAdapterComplete. Вообще, я думал, что NDIS скажет, что драйверу не хватает обработчиков при попытке его зарегистрировать. Видимо, не говорит. И еще один вопрос. Насколько я понимаю, последовательность вызовов ф-ий должна быть такова:

    1. Драйвер регистрируется с помощью NdisRegisterProtocol, NDIS вызывает ProtocolBindAdapter для каждого NIC'а.
    2. Ф-ия ProtocolBindAdapter вызывает NdisOpenAdapter. ProtocolBindAdapter может вернуть NDIS_STATUS_SUCCESS в случае если все завершено успешно, ошибку в случае если что-то пошло не так, или отложить привязку к адаптеру возвратом NDIS_STATUS_PENDING. В последнем случае необходимо вызвать NdisCompleteBindAdapter.
    3. В случае если ProtocolBindAdapter вернула NDIS_STATUS_SUCCESS или была вызвана NdisCompleteBindAdapter, NDIS вызывает ф-ию ProtocolOpenAdapterComplete.
    4. NDIS вызывает PnPEventHandler с параметром NetEventBindsComplete в случае завершения привязки ко всем NIC'ам.

    Насчет последнего пункта я не очень уверен, т.к. судя по логу, ф-ия была вызвана даже если привязки не произошло. И еще: для чего нужен параметр NdisBindingContext в ProtocolBindAdapter? Мне сказали, что это что-то вроде PVOID Context для ф-ии создания потока -- параметр будет передан ф-ии ProtocolOpenAdapterComplete. Я не против, но зачем его передавать в ProtocolBindAdapter?.. Подозреваю, что это просто какая-то несогласованность, но лучше спросить.

    Спасибо за ответы :).
     
  6. ntkernelspawn

    ntkernelspawn New Member

    Публикаций:
    0
    Регистрация:
    17 дек 2010
    Сообщения:
    61
    NdisBindingContext в ProtocolBindAdapter?
    Но практического применения я не знаю и не где не видел , обычно UNREFERENCED_PARAM.

    В dispatcher "ProtocolBindAdapter" когда идет вызов "NdisOpenAdapter" может вернуть PENDING, тогда тебе требуется дождаться вызова dispatcher "ProtocolOpenAdapterComplete" (EVENT'ом). Так что вызов может быть одновременно(ProtocolBindAdapter, ProtocolOpenAdapterComplete) ...

    4) Да
     
  7. ntkernelspawn

    ntkernelspawn New Member

    Публикаций:
    0
    Регистрация:
    17 дек 2010
    Сообщения:
    61
    НА счет ProtocolBindAdapter BindContext:
    Dispatcher ProtocolBindAdapter возврощает PENDING, тогда делаешь вызов NdisCompleteBindAdapter c этим BindContext
    This function completes a binding operation for which the caller's ProtocolBindAdapter function previously returned NDIS_STATUS_PENDING.
     
  8. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    ntkernelspawn
    В общем, как я понимаю, это просто способ передать что-то в ProtocolOpenAdapterComplete.

    Почитал MSDN, еще вопрос созрел:
    Это из описания ProtocolOpenAdapterComplete. В примере NdisProt ProtocolOpenAdapterComplete не вызывает NdisCompleteBindAdapter. Я так понимаю, что ее можно и не вызывать?
     
  9. ntkernelspawn

    ntkernelspawn New Member

    Публикаций:
    0
    Регистрация:
    17 дек 2010
    Сообщения:
    61
    Из вашего "Dispatcher ProtocolBindAdapter" возврощает PENDING, то и есть вы еще не сказали что bind завершен, но из диспатчера вышли, но когда то вы его завершите, и тогда надо будет вызывать NdisCompleteBindAdapter с BindContext который получили в ProtocolBindAdapter. На пабликах такого кода я не встречал(Так как он на сколько я понял используется для тонкой оптимизации инициализации протокола, а на паблике сильной оптимизации драйверов я не встречал) так что рекомендую временно на него забить ...
     
  10. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Ну, вопрос немного не в этом был. Саму схему взаимодействия я, вроде, понял. Просто MSDN говорит, что NdisCompleteBindAdapter надо вызвать из ProtocolOpenAdapterComplete, а ProtocolOpenAdapterComplete, как я понял, вызовется только после того, как будет завершена привязка. Т.е. будет вызвана NdisCompleteBindAdapter. Получается замкнутый круг.

    А если говорить про практику, то, вроде, у меня все получилось. Добавил обработчики открытия и закрытия адаптера и загрузил драйвер через .inf. ProtocolBindAdapter успешно вызвалась, а за ней PnPEventHandler. Мне просто хочется не только чтобы работало, но чтобы и правильно было.
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Нужно создавать inf файл для протокола и биндить его к нужным нижележащим (см. Specifying Binding Interfaces).

    Summary of Changes Required to Port a Protocol Driver to NDIS 6.0
     
  12. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Great
    Ага, спасибо, с этим уже разобрался. С последним вопросом тоже.
     
  13. neutronion

    neutronion New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2010
    Сообщения:
    1.100
    Обработчики я бы ввел все, просто поставил на них бы функции заглушки. Что это дает? Дает, то что можно установить в функция _asm int 3 или DbgPrint, это уж как хочеться и по этим сообщениям получать последовательность вызовов Обработчиков, как только последовательность вызовов обработчиков будет понятна это даст пищу для размышлений.
    Какие обработчики и когда вызываются. Простой дедуктивный метод, поможет по поведению обработчиков, понять где копать.
     
  14. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    neutronion
    Проблема была в том, что драйвер загружался не через .inf файл.