четверг, 29 июля 2010 г.

ndis!_NDIS_IF_BLOCK

Начало
Часть 1
Часть 2
Часть 3
В этой части даются определения структур ndis!_NDIS_IF_BLOCK, описывающих сетевые интерфейсы (доступны начиная с висты), как получить адреса ndisIfListLock и ndisIfList и почему windbg в данном случае врет

Список интерфейсов можно посмотреть в плагине windbg ndiskd с помощью команды interfaces, при этом сам список хранится в глобальной переменной ndisIfList
Достать пару ndisIfList и лок очень просто - техника полностью идентична ранее описанной, экспортируемая функция для дизассемблирования называется NdisIfDeregisterInterface, указатель на следующий интерфейс всегда идет в самом начале структуры (поле по смещению 0).

И тут я задумался как такое может быть - если посмотреть на определения структур _NDIS_IF_BLOCK из WinDbg - первым полем идет Header, а Link идет следующим. После некоторых опытов выяснилось что таки да - в данном конкретном случае WinDbg неправ - для практического использования нужно считать что поля Header в этих структурах нет

Как выглядит структура _NDIS_IF_BLOCK под некоторыми доступными мне версиями windows:


dt ndis!_NET_PHYSICAL_LOCATION_LH
   +0x000 BusNumber        : Uint4B
   +0x004 SlotNumber       : Uint4B
   +0x008 FunctionNumber   : Uint4B


dt ndis!_IF_COUNTED_STRING_LH
   +0x000 Length           : Uint2B
   +0x002 String           : [257] Wchar


dt ndis!_IF_PHYSICAL_ADDRESS_LH
   +0x000 Length           : Uint2B
   +0x002 Address          : [32] UChar
 



vista 32 bit

dt ndis!_NDIS_IF_BLOCK
   +0x000 Header           : _NDIS_OBJECT_HEADER
   +0x004 Link             : _LIST_ENTRY
   +0x00c ProviderLink     : _LIST_ENTRY
   +0x014 NetworkLink      : _LIST_ENTRY
   +0x01c ifRcvAddressTable : Ptr32 _NDIS_IF_RCV_ADDRESS
   +0x020 ifRcvAddressCount : Uint4B
   +0x024 LowerLayerIfCount : Uint4B
   +0x028 HigherLayerIfCount : Uint4B
   +0x02c Ref              : Int4B
   +0x030 MiniportRef      : Int4B
   +0x038 NetLuid          : _NET_LUID_LH
   +0x040 ProviderIfContext : Ptr32 Void
   +0x044 ProviderHandle   : Ptr32 _NDIS_IF_PROVIDER_BLOCK
   +0x048 Flags            : Uint4B
   +0x04c PhysicalLocation : _NET_PHYSICAL_LOCATION_LH
   +0x058 WanTunnelType    : Uint4B
   +0x05c PortNumber       : Uint4B
   +0x060 ifLastChange     : Uint8B
   +0x068 ifCounterDiscontinuityTime : Uint8B
   +0x070 RosInfo          : UChar
   +0x070 ifIndex          : Uint4B
   +0x074 ifDescr          : _IF_COUNTED_STRING_LH
   +0x278 ifType           : Uint2B
   +0x27c AccessType       : _NET_IF_ACCESS_TYPE
   +0x280 DirectionType    : _NET_IF_DIRECTION_TYPE
   +0x284 ConnectionType   : _NET_IF_CONNECTION_TYPE
   +0x288 InterfaceGuid    : _GUID
   +0x298 ifConnectorPresent : UChar
   +0x29c ifFlags          : Uint4B
   +0x2a0 MediaType        : _NDIS_MEDIUM
   +0x2a4 PhysicalMediumType : _NDIS_PHYSICAL_MEDIUM
   +0x2a8 RodInfo          : UChar
   +0x2a8 CompartmentId    : Uint4B
   +0x2ac NetworkGuid      : _GUID
   +0x2bc ifAlias          : _IF_COUNTED_STRING_LH
   +0x4c0 ifOperStatus     : _NET_IF_OPER_STATUS
   +0x4c4 ifOperStatusFlags : Uint4B
   +0x4c8 ifMtu            : Uint4B
   +0x4cc ifPhysAddress    :     _IF_PHYSICAL_ADDRESS_LH
   +0x4ee PermanentPhysAddress : _IF_PHYSICAL_ADDRESS_LH
   +0x510 ifAdminStatus    : _NET_IF_ADMIN_STATUS
   +0x518 XmitLinkSpeed    : Uint8B
   +0x520 RcvLinkSpeed     : Uint8B
   +0x528 ifPromiscuousMode : UChar
   +0x529 ifDeviceWakeUpEnable : UChar
   +0x52c MediaConnectState : _NET_IF_MEDIA_CONNECT_STATE
   +0x530 MediaDuplexState : _NET_IF_MEDIA_DUPLEX_STATE
   +0x538 Network          : Ptr32 _NDIS_IF_NETWORK_BLOCK
   +0x53c Compartment      : Ptr32 _NDIS_IF_COMPARTMENT_BLOCK
   +0x540 AsyncEvent       : Ptr32 _KEVENT
   +0x544 MiniportAsyncEvent : Ptr32 _KEVENT
   +0x548 bNdisIsProvider  : UChar
   +0x549 MiniportPresent  : UChar
   +0x54c SupportedStatistics : Uint4B


vista 64 bit

dt ndis!_NDIS_IF_BLOCK
   +0x000 Header           : _NDIS_OBJECT_HEADER
   +0x008 Link             : _LIST_ENTRY
   +0x018 ProviderLink     : _LIST_ENTRY
   +0x028 NetworkLink      : _LIST_ENTRY
   +0x038 ifRcvAddressTable : Ptr64 _NDIS_IF_RCV_ADDRESS
   +0x040 ifRcvAddressCount : Uint4B
   +0x044 LowerLayerIfCount : Uint4B
   +0x048 HigherLayerIfCount : Uint4B
   +0x04c Ref              : Int4B
   +0x050 MiniportRef      : Int4B
   +0x058 NetLuid          : _NET_LUID_LH
   +0x060 ProviderIfContext : Ptr64 Void
   +0x068 ProviderHandle   : Ptr64 _NDIS_IF_PROVIDER_BLOCK
   +0x070 Flags            : Uint4B
   +0x074 PhysicalLocation : _NET_PHYSICAL_LOCATION_LH
   +0x080 WanTunnelType    : Uint4B
   +0x084 PortNumber       : Uint4B
   +0x088 ifLastChange     : Uint8B
   +0x090 ifCounterDiscontinuityTime : Uint8B
   +0x098 RosInfo          : UChar
   +0x098 ifIndex          : Uint4B
   +0x09c ifDescr          : _IF_COUNTED_STRING_LH
   +0x2a0 ifType           : Uint2B
   +0x2a4 AccessType       : _NET_IF_ACCESS_TYPE
   +0x2a8 DirectionType    : _NET_IF_DIRECTION_TYPE
   +0x2ac ConnectionType   : _NET_IF_CONNECTION_TYPE
   +0x2b0 InterfaceGuid    : _GUID
   +0x2c0 ifConnectorPresent : UChar
   +0x2c4 ifFlags          : Uint4B
   +0x2c8 MediaType        : _NDIS_MEDIUM
   +0x2cc PhysicalMediumType : _NDIS_PHYSICAL_MEDIUM
   +0x2d0 RodInfo          : UChar
   +0x2d0 CompartmentId    : Uint4B
   +0x2d4 NetworkGuid      : _GUID
   +0x2e4 ifAlias          : _IF_COUNTED_STRING_LH
   +0x4e8 ifOperStatus     : _NET_IF_OPER_STATUS
   +0x4ec ifOperStatusFlags : Uint4B
   +0x4f0 ifMtu            : Uint4B
   +0x4f4 ifPhysAddress    : _IF_PHYSICAL_ADDRESS_LH
   +0x516 PermanentPhysAddress : _IF_PHYSICAL_ADDRESS_LH
   +0x538 ifAdminStatus    : _NET_IF_ADMIN_STATUS
   +0x540 XmitLinkSpeed    : Uint8B
   +0x548 RcvLinkSpeed     : Uint8B
   +0x550 ifPromiscuousMode : UChar
   +0x551 ifDeviceWakeUpEnable : UChar
   +0x554 MediaConnectState : _NET_IF_MEDIA_CONNECT_STATE
   +0x558 MediaDuplexState : _NET_IF_MEDIA_DUPLEX_STATE
   +0x560 Network          : Ptr64 _NDIS_IF_NETWORK_BLOCK
   +0x568 Compartment      : Ptr64 _NDIS_IF_COMPARTMENT_BLOCK
   +0x570 AsyncEvent       : Ptr64 _KEVENT
   +0x578 MiniportAsyncEvent : Ptr64 _KEVENT
   +0x580 bNdisIsProvider  : UChar
   +0x581 MiniportPresent  : UChar
   +0x584 SupportedStatistics : Uint4B



windows 7 32 bit

ndis!_NDIS_IF_BLOCK
   +0x000 Header           : _NDIS_OBJECT_HEADER
   +0x004 Link             : _LIST_ENTRY
   +0x00c ProviderLink     : _LIST_ENTRY
   +0x014 NetworkLink      : _LIST_ENTRY
   +0x01c ifRcvAddressTable : Ptr32 _NDIS_IF_RCV_ADDRESS
   +0x020 ifRcvAddressCount : Uint4B
   +0x024 ifMaxRcvAddressCount : Uint4B
   +0x028 LowerLayerIfCount : Uint4B
   +0x02c HigherLayerIfCount : Uint4B
   +0x030 Ref              : Int4B
   +0x034 MiniportRef      : Int4B
   +0x038 NetLuid          : _NET_LUID_LH
   +0x040 ProviderIfContext : Ptr32 Void
   +0x044 ProviderHandle   : Ptr32 _NDIS_IF_PROVIDER_BLOCK
   +0x048 Flags            : Uint4B
   +0x04c PhysicalLocation : _NET_PHYSICAL_LOCATION_LH
   +0x058 WanTunnelType    : Uint4B
   +0x05c PortNumber       : Uint4B
   +0x060 ifLastChange     : Uint8B
   +0x068 ifCounterDiscontinuityTime : Uint8B
   +0x070 RosInfo          : UChar
   +0x070 ifIndex          : Uint4B
   +0x074 ifDescr          : _IF_COUNTED_STRING_LH
   +0x278 ifType           : Uint2B
   +0x27c AccessType       : _NET_IF_ACCESS_TYPE
   +0x280 DirectionType    : _NET_IF_DIRECTION_TYPE
   +0x284 ConnectionType   : _NET_IF_CONNECTION_TYPE
   +0x288 InterfaceGuid    : _GUID
   +0x298 ifConnectorPresent : UChar
   +0x29c ifFlags          : Uint4B
   +0x2a0 MediaType        : _NDIS_MEDIUM
   +0x2a4 PhysicalMediumType : _NDIS_PHYSICAL_MEDIUM
   +0x2a8 RodInfo          : UChar
   +0x2a8 CompartmentId    : Uint4B
   +0x2ac NetworkGuid      : _GUID
   +0x2bc ifAlias          : _IF_COUNTED_STRING_LH
   +0x4c0 ifOperStatus     : _NET_IF_OPER_STATUS
   +0x4c4 ifOperStatusFlags : Uint4B
   +0x4c8 ifMtu            : Uint4B
   +0x4cc ifPhysAddress    : _IF_PHYSICAL_ADDRESS_LH
   +0x4ee PermanentPhysAddress : _IF_PHYSICAL_ADDRESS_LH
   +0x510 ifAdminStatus    : _NET_IF_ADMIN_STATUS
   +0x518 XmitLinkSpeed    : Uint8B
   +0x520 RcvLinkSpeed     : Uint8B
   +0x528 ifPromiscuousMode : UChar
   +0x529 ifDeviceWakeUpEnable : UChar
   +0x52c MediaConnectState : _NET_IF_MEDIA_CONNECT_STATE
   +0x530 MediaDuplexState : _NET_IF_MEDIA_DUPLEX_STATE
   +0x538 Network          : Ptr32 _NDIS_IF_NETWORK_BLOCK
   +0x53c Compartment      : Ptr32 _NDIS_IF_COMPARTMENT_BLOCK
   +0x540 AsyncEvent       : Ptr32 _KEVENT
   +0x544 MiniportAsyncEvent : Ptr32 _KEVENT
   +0x548 bNdisIsProvider  : UChar
   +0x549 MiniportPresent  : UChar
   +0x54c SupportedStatistics : Uint4B
   +0x550 ifL2NetworkInfo  : _IF_COUNTED_STRING_LH



windows 7 64 bit

dt ndis!_NDIS_IF_BLOCK
   +0x000 Header           : _NDIS_OBJECT_HEADER
   +0x008 Link             : _LIST_ENTRY
   +0x018 ProviderLink     : _LIST_ENTRY
   +0x028 NetworkLink      : _LIST_ENTRY
   +0x038 ifRcvAddressTable : Ptr64 _NDIS_IF_RCV_ADDRESS
   +0x040 ifRcvAddressCount : Uint4B
   +0x044 ifMaxRcvAddressCount : Uint4B
   +0x048 LowerLayerIfCount : Uint4B
   +0x04c HigherLayerIfCount : Uint4B
   +0x050 Ref              : Int4B
   +0x054 MiniportRef      : Int4B
   +0x058 NetLuid          : _NET_LUID_LH
   +0x060 ProviderIfContext : Ptr64 Void
   +0x068 ProviderHandle   : Ptr64 _NDIS_IF_PROVIDER_BLOCK
   +0x070 Flags            : Uint4B
   +0x074 PhysicalLocation : _NET_PHYSICAL_LOCATION_LH
   +0x080 WanTunnelType    : Uint4B
   +0x084 PortNumber       : Uint4B
   +0x088 ifLastChange     : Uint8B
   +0x090 ifCounterDiscontinuityTime : Uint8B
   +0x098 RosInfo          : UChar
   +0x098 ifIndex          : Uint4B
   +0x09c ifDescr          : _IF_COUNTED_STRING_LH
   +0x2a0 ifType           : Uint2B
   +0x2a4 AccessType       : _NET_IF_ACCESS_TYPE
   +0x2a8 DirectionType    : _NET_IF_DIRECTION_TYPE
   +0x2ac ConnectionType   : _NET_IF_CONNECTION_TYPE
   +0x2b0 InterfaceGuid    : _GUID
   +0x2c0 ifConnectorPresent : UChar
   +0x2c4 ifFlags          : Uint4B
   +0x2c8 MediaType        : _NDIS_MEDIUM
   +0x2cc PhysicalMediumType : _NDIS_PHYSICAL_MEDIUM
   +0x2d0 RodInfo          : UChar
   +0x2d0 CompartmentId    : Uint4B
   +0x2d4 NetworkGuid      : _GUID
   +0x2e4 ifAlias          : _IF_COUNTED_STRING_LH
   +0x4e8 ifOperStatus     : _NET_IF_OPER_STATUS
   +0x4ec ifOperStatusFlags : Uint4B
   +0x4f0 ifMtu            : Uint4B
   +0x4f4 ifPhysAddress    : _IF_PHYSICAL_ADDRESS_LH
   +0x516 PermanentPhysAddress : _IF_PHYSICAL_ADDRESS_LH
   +0x538 ifAdminStatus    : _NET_IF_ADMIN_STATUS
   +0x540 XmitLinkSpeed    : Uint8B
   +0x548 RcvLinkSpeed     : Uint8B
   +0x550 ifPromiscuousMode : UChar
   +0x551 ifDeviceWakeUpEnable : UChar
   +0x554 MediaConnectState : _NET_IF_MEDIA_CONNECT_STATE
   +0x558 MediaDuplexState : _NET_IF_MEDIA_DUPLEX_STATE
   +0x560 Network          : Ptr64 _NDIS_IF_NETWORK_BLOCK
   +0x568 Compartment      : Ptr64 _NDIS_IF_COMPARTMENT_BLOCK
   +0x570 AsyncEvent       : Ptr64 _KEVENT
   +0x578 MiniportAsyncEvent : Ptr64 _KEVENT
   +0x580 bNdisIsProvider  : UChar
   +0x581 MiniportPresent  : UChar
   +0x584 SupportedStatistics : Uint4B
   +0x588 ifL2NetworkInfo  : _IF_COUNTED_STRING_LH

Комментариев нет:

Отправить комментарий