Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: NDIS драйвер протокола и UnbindAdapterHandler  (Прочитано 7672 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
cppdev
Интересующийся

ru
Offline Offline

« : 08-08-2013 06:18 » 

Пишу драйвер протокола, NDIS 5.0. Тестирую на Win 7 x86. В обработчике DriverUnload вызывается NdisDeregisterProtocol,
что в свою очередь приводит к вызову UnbindAdapterHandler для всех привязанных адаптеров. Как узнать для какого адаптера
был произведен вызов, т.е. например узнать его DeviceName.
Записан
sss
Специалист

ru
Offline Offline

« Ответ #1 : 09-08-2013 03:16 » 

Вы должны поддерживать список привязанных адаптеров..

Код:
typedef struct _ADAPT
{
PADAPT Next;
NDIS_HANDLE BindingHandle;           // Для нижнего минипорта
NDIS_HANDLE MiniportHandle;           // NDIS хэндл для вызова минипорта
PDEVICE_OBJECT PDO;                      // Physical Device Object
NDIS_HANDLE SendPacketPoolHandle;
NDIS_HANDLE RecvPacketPoolHandle;

Новая структура создается в PtBindAdapter и передается как контекстный параметр в
MPInitialize - обработчик инициализации, который вызывается запросом
NdisIMInitializeDeviceInstanceEx( DriverHandle, &Param->ParameterData.StringData, pAdapt)

Код:
PtBindAdapter (...) {
...
::NdisAllocateMemoryWithTag( (void**) &(pAdapt->BundleUniString.Buffer), MAX_BUNDLEID_LENGTH, TAG);
...
::NdisIMInitializeDeviceInstanceEx( DriverHandle, &Param->ParameterData.StringData, pAdapt);



Код:
MPInitialize (...)

//
// Вставка в наш глобальный pAdapt список (push front)
//
KeAcquireSpinLock (&pAdapt->SpinLock, &OldIrql);

pAdapt->Next = pAdaptList;
pAdaptList = pAdapt;

KeReleaseSpinLock (&pAdapt->SpinLock, OldIrql);

NdisReleaseSpinLock( &GlobalLock);

Далее это всё отслеживается PtUnbindAdapter
Записан

while (8==8)
cppdev
Интересующийся

ru
Offline Offline

« Ответ #2 : 09-08-2013 05:25 » 

Про BindContext мне известно. Дело вот в чем: я в BindAdapterHandler вызываю NdisOpenAdapter и затем, после нескольких NdisRequest, NdisCloseAdapter. Все функции отрабатывают без ошибок, тем не менее UnbindAdapterHandler все равно вызывается — хочу узнать для какого именно адаптера.
Записан
sss
Специалист

ru
Offline Offline

« Ответ #3 : 09-08-2013 07:15 » 

Что значит для какого именно? Т.е. не твою pAdapt, а некую инфо про адаптер?
Записан

while (8==8)
cppdev
Интересующийся

ru
Offline Offline

« Ответ #4 : 09-08-2013 07:21 » 

На момент вызова UnbindAdapterHandler привязок ни к одному адаптеру уже нет, тк ранее NdisCloseAdapter уже успешно отработал для каждого адаптера. Тем не менее UnbindAdapterHandler все равно вызывается - хочу узнать почему/для какого именно адаптера произошел вызов.
Записан
sss
Специалист

ru
Offline Offline

« Ответ #5 : 09-08-2013 07:25 » new

UnbindAdapterHandler  вызывается после NdisCloseAdapter ?
Записан

while (8==8)
cppdev
Интересующийся

ru
Offline Offline

« Ответ #6 : 09-08-2013 07:30 » 

Да. NdisCloseAdapter  вызывается в конце BindAdapterHandler. UnbindAdapterHandler вызывается после вызова NdisDeregisterProtocol при выгрузке драйвера.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines