Добрый день. У меня вопрос по поводу функций MPHalt() и PtUnbindAdapter(). В комментариях к исходникам и в DDK написано, что PtUnbindAdapter() может быть вызвана раньше функции MPInitialize(). В этом случае вызова MPHalt() не происходит. Но в PtUnbindAdapter() не выполняется освобождение выделенных при инициализации пакетных пулов перед очисткой памяти для структуры pAdapt. В каком порядке все-таки происходит вызов функций инициализации и завершения для минипорта и протокола? И как освобождаются пулы в описанном случае?
Доброго времени суток всем. В продолжение темы. Оказалось, что 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-драйверов сталкивался с подобными вещами, поделитесь, пожалуйста, своими соображениями.
Если ты смотрел внимательно, то регистрируется 2-а минипорта Ethernet и WAN, очевидно первый раз ты обламываешь Ethernet, и ось пытается зарегистрировать WAN. Если есть желание, стучись в аську, у меня тоже есть вопросы про NDIS, будем вместе решать