NDIS - циклический вызов ProtocolUnbindAdapter
От: ClickF1 http://kz-clickf1.livejournal.com
Дата: 21.02.08 04:46
Оценка:
Проблема в том, что при выгрузке драйвера, после регистрации протокола, идет вызов NdisDeregisterProtocol. Затем NDIS вызывает ProtocolUnbindAdapter моего протокола, куда ,по идее DDK, передается

ProtocolBindingContext
Specifies the handle to a protocol-allocated context area in which the protocol driver maintains per-binding run-time state. The driver supplied this handle when it called NdisOpenAdapter.

Т.е. хендл открытого мною адаптера.
Брякаемся на ProtocolUnbindAdapter, и смотрим переменные :

kd> dt 0x80dfef78 _IP_INTERFACE ( моя структура в которой я храню открытые мной интерфейсы )
driver!_IP_INTERFACE
+....
+0x008 hAdapterHandle : 0x80e0c670 <------------ открытый адаптер 1
+0x008 hOpenBlock : _NDIS_OPEN_BLOCK
+....
+0x078 pinterfaceDeviceName : 0x80e7bb20 _UNICODE_STRING "\DEVICE\{57403648-7F3C-4ED9-8C2A-172B662BE050}"
+....

kd> dt 0x81288250 _IP_INTERFACE
driver!_IP_INTERFACE
+....
+0x008 hAdapterHandle : 0x80e7ba58 <------------ открытый адаптер 2
+0x008 hOpenBlock : _NDIS_OPEN_BLOCK
+....
+0x078 pinterfaceDeviceName : 0x80e7b708 _UNICODE_STRING "\DEVICE\{68F6C03C-7AEA-4200-9012-FEA19B07B93D}"

kd> p
driver!DriverUnload+0x17:
f7f7b0e7 e8b4ffffff call driver!DeInitLayer (f7f7b0a0)
kd> p
log : DeInitProtocol->NdisFreePacketPool((NDIS_HANDLE)81304780)
log : DeInitProtocol->NdisDeregisterProtocol((NDIS_HANDLE)812D3AA0)
log : On ProtocolUnbindAdapter

kd> dd ProtocolHandle <--------- HANDLE моего протокола
f7f7b554 812d3aa0 00000000 00000000 81599c80
f7f7b564 f8438891 00000000 00000000 00000000

kd> dt 0x812d3aa0 _NDIS_PROTOCOL_BLOCK
driver!_NDIS_PROTOCOL_BLOCK
+0x000 OpenQueue : 0x80e7ba58 _NDIS_OPEN_BLOCK
+0x004 Ref : _REFERENCE
+0x00c DeregEvent : 0xf9e9ed24 _KEVENT
+0x010 NextProtocol : 0x815c0548 _NDIS_PROTOCOL_BLOCK
+0x014 ProtocolCharacteristics : _NDIS50_PROTOCOL_CHARACTERISTICS
+0x080 WorkItem : _WORK_QUEUE_ITEM
+0x090 Mutex : _KMUTANT
+0x0b0 MutexOwner : 0x1092b
+0x0b4 BindDeviceName : (null)
+0x0b8 RootDeviceName : (null)
+0x0bc AssociatedMiniDriver : (null)
+0x0c0 BindingAdapter : (null)

kd> dt 0x812d3aa0+14 _NDIS50_PROTOCOL_CHARACTERISTICS
driver!_NDIS50_PROTOCOL_CHARACTERISTICS
+0x000 MajorNdisVersion : 0x5 ''
+0x001 MinorNdisVersion : 0 ''
+0x002 Filler : 0
+0x004 Reserved : 0
+0x004 Flags : 0
+0x008 OpenAdapterCompleteHandler : 0xf7f79570 void driver!OpenAdapterComplete+0
+0x00c CloseAdapterCompleteHandler : 0xf7f79720 void driver!CloseAdapterComplete+0
+0x010 SendCompleteHandler : 0xf7f79860 void driver!SendComplete+0
+0x010 WanSendCompleteHandler : 0xf7f79860 void driver!SendComplete+0
+0x014 TransferDataCompleteHandler : 0xf7f798f0 void driver!TransferDataComplete+0
+0x014 WanTransferDataCompleteHandler : 0xf7f798f0 void driver!TransferDataComplete+0
+0x018 ResetCompleteHandler : 0xf7f79940 void driver!ResetComplete+0
+0x01c RequestCompleteHandler : 0xf7f79a00 void driver!RequestComplete+0
+0x020 ReceiveHandler : 0xf7f79d50 int driver!Receive+0
+0x020 WanReceiveHandler : 0xf7f79d50 int driver!Receive+0
+0x024 ReceiveCompleteHandler : 0xf7f79b40 void driver!ReceiveComplete+0
+0x028 StatusHandler : 0xf7f79b80 void driver!Status+0
+0x02c StatusCompleteHandler : 0xf7f79bd0 void driver!StatusComplete+0
+0x030 Name : _UNICODE_STRING "mprotocol"
+0x038 ReceivePacketHandler : 0xf7f79d00 int driver!ReceivePacket+0
+0x03c BindAdapterHandler : 0xf7f79c20 void driver!BindAdapter+0
+0x040 UnbindAdapterHandler : 0xf7f79c70 void driver!UnbindAdapter+0
+....

kd> kb
ChildEBP RetAddr Args to Child
f9e9ec04 f98847dd f9e9ecd0 f7f7b568 f9e9ec24 driver!UnbindAdapter+0x2d [d:\developer\ndis\ndis.c @ 193] <-- выделен ProtocolBindingContext
f9e9ed34 f7f7ae51 f9e9ed44 812d3aa0 00000000 0xf98847dd
f9e9ed0c f9886896 812d3aa0 f7c3bb84 f7c3bb84 driver!DeInitProtocol+0xa1 [d:\developer\ndis\ndis.c @ 610]
f9e9ed34 f7f7ae51 f9e9ed44 812d3aa0 00000000 0xf9886896

kd> dd f7f7b568 <--- нули соотвественно
f7f7b568 00000000 00000000 00000000 00000000

kd> dt f7f7b568 _NDIS_OPEN_BLOCK
driver!_NDIS_OPEN_BLOCK
+0x000 MacHandle : (null)
+0x004 BindingHandle : (null)
+0x008 MiniportHandle : (null)
+0x00c ProtocolHandle : (null)
+0x010 ProtocolBindingContext : (null)
+0x014 MiniportNextOpen : (null)
+0x018 ProtocolNextOpen : (null)
+0x01c MiniportAdapterContext : 0x55ff8b00
+0x020 Reserved1 : 0x8b ''
+0x021 Reserved2 : 0xec ''
+0x022 Reserved3 : 0xa1 ''
+0x023 Reserved4 : 0x44 'D'
+..... мусор
kd> dt f7f7b568 _NDIS_PROTOCOL_BLOCK
driver!_NDIS_PROTOCOL_BLOCK
+0x000 OpenQueue : (null)
+0x004 Ref : _REFERENCE
+0x00c DeregEvent : (null)
+0x010 NextProtocol : (null)
+0x014 ProtocolCharacteristics : _NDIS50_PROTOCOL_CHARACTERISTICS
+..... мусор

Теперь вопрос, какого хрена мне ндис передает какое-то гавно ? Хотя до этого ( до того как спутник венеры не вышел из-за орбиты, и луна не перешла в другую фазу ) все нормально работало. Соответственно я не могу вызвать NdisCloseAdapter и NdisCloseAdapterComplete , потому что указатель не верный. Поэтому NDIS циклически ( пока я не закрою адаптер ) будет вызывать мою функцию
437843 | clickf1.kz@gmail.com | NT+/xBSD Kernel Researcher
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.