passthru из WinDDK

Тема в разделе "WASM.WIN32", создана пользователем gilg, 19 май 2005.

  1. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Добрый день.

    У меня вопрос по поводу функций MPHalt() и PtUnbindAdapter(). В комментариях к исходникам и в DDK написано, что PtUnbindAdapter() может быть вызвана раньше функции MPInitialize(). В этом случае вызова MPHalt() не происходит. Но в PtUnbindAdapter() не выполняется освобождение выделенных при инициализации пакетных пулов перед очисткой памяти для структуры pAdapt.

    В каком порядке все-таки происходит вызов функций инициализации и завершения для минипорта и протокола? И как освобождаются пулы в описанном случае?
     
  2. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Доброго времени суток всем. В продолжение темы.

    Оказалось, что NDIS несколько оригинально ведет себя при вызове функций промежуточного драйвера. Причем в DDK я не нашел упоминаний о таком ее поведении.



    Если по порядку (=> - вход в функцию; <= - выход из функции):

    => DriverEntry()

    <= DriverEntry()

    => PtPnPEvent() с кодом NetEventReconfigure - индикация того, что изменилась конфигурация сетевых компонент. Промежуточный драйвер ДОЛЖЕН при обработке этого события вызвать функцию NdisReEnumerateProtocolBindings()



    => PtBindAdapter() - привязка драйвера к нижележащему минипорту. Здесь вызывается Функция NdisIMInitializeDeviceInstanceEx(), которая сообщает NDIS, что надо инициализировать минипорт промежуточного драйвера. Она выполняет синхронный вызов MinportInitialize().



    => MinportInitialize() - функция инициализации минипорта моего промежуточного драйвера. Здесь я ее обламываю, возвращая статус NDIS_STATUS_FAILURE.

    <= MinportInitialize()



    => PtPnPEvent() с кодом NetEventBindsComplete, говорящим о том, что выполнены все привязки к нижележащим устройствам.

    <= PtBindAdapter() - освобождены все выделенные ресурсы и закрыт нижележащий адаптер.

    <= PtPnPEvent()

    <= PtPnPEvent()





    Теперь начинается самое интересное. В системе установлен только одна сетвая карта, тем не менее происходит второй вызов:

    => PtBindAdapter() - причем вызов относится к ТОЙ ЖЕ САМОЙ сетевой карте.

    => DriverUnload() - вызов внутри PtBindAdapter() при обращении к DbgPrint()



    Если выполнять в SoftIce пошаговую трассировку, то открыть нижележащий минипорт не удается, статус - NDIS_STATUS_CLOSING, все ресурсы очищаются и функции завершаются:

    <= PtBindAdapter()

    <= DriverUnload()



    При исполнении кода драйвера в нормальном режиме внутри PtBindAdapter() УСПЕШНО ОТКРЫВАЕТСЯ драйвер минипорта сетевой карты.

    NdisIMInitializeDeviceInstanceEx() здесь выполняется асинхронно.

    После успешного завершения работы PtBindAdapter() вызывается PtUnbindAdapter(), в которой отменяется вызов NdisIMInitializeDeviceInstanceEx() и подчищается мусор.



    Теперь:

    => PtPnPEvent() NetEventBindsComplete

    <= PtPnPEvent()

    <= DriverUnload()



    Первое, что получается: при исполнении драйвера в нормальном режиме пример из DDK не чистит за собой память, так как не вызывается функция остановки минипорта MiniportHalt().



    Возникающие вопросы:

    1) почему второй раз вызывается PtBindAdapter() для одной сетевой карты;

    2) почему дважды вызывается PtPnPEvent() с одним и тем же кодом NetEventBindsComplete;

    3) по какой причине разные результаты дает вызов функции NdisOpenAdapter() открытия нижележащего минипорта при трассировке и в обычном режиме;

    4) почему в первом случае NdisIMInitializeDeviceInstanceEx() вызывает MinportInitialize() синхронно, а во втором асинхронно.



    Если кто-нибудь при разработке NDIS-драйверов сталкивался с подобными вещами, поделитесь, пожалуйста, своими соображениями.
     
  3. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    Если ты смотрел внимательно, то регистрируется 2-а минипорта Ethernet и WAN, очевидно первый раз ты обламываешь Ethernet, и ось пытается зарегистрировать WAN. Если есть желание, стучись в аську, у меня тоже есть вопросы про NDIS, будем вместе решать :)