воскресенье, 12 сентября 2010 г.

ndis!_NDIS_IF_PROVIDER_BLOCK

бонус-трек к жалким описаниям структур ndis
Начиная с висты в ndis появилась пара функций NdisIfRegisterProvider и NdisIfDeregisterProvider
WinDbg традиционно не умеет показывать какие провайдеры были зарегистрированы в системе, так что запускаем дизассемблер например

Кусочек кода из NdisIfRegisterProvider:

  mov     edi, offset _ndisIfProviderListLock
  add     esp, 18h
  mov     ecx, edi
  call    ds:__imp_@KfAcquireSpinLock@4
  mov     ecx, _ndisIfProviderList

Как видим провайдеры хранятся в списке ndisIfProviderList и синхронизируются локом ndisIfProviderListLock, техника их получения многократно мною описана

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


struct _NDIS_IF_PROVIDER_CHARACTERISTICS
{
  struct _NDIS_OBJECT_HEADER Header;
  PBYTE  QueryObjectHandler;
  PBYTE  SetObjectHandler;
  PVOID  Reserved1;
  PVOID  Reserved2;
};

struct _NDIS_IF_PROVIDER_BLOCK
{
  LIST_ENTRY Link;
  LIST_ENTRY IfList;
  PVOID IfProviderContext;
  struct _NDIS_IF_PROVIDER_CHARACTERISTICS ProviderCharacteristics;
};


Два провайдера регистрирует сам ndis.sys:
  1. QueryObjectHandler - ndisIfQueryLoopbackObject, SetObjectHandler - ndisIfSetObject
  2. QueryObjectHandler - ndisIfQueryObject, SetObjectHandler - ndisIfSetObject
Функция ndisIfSetObject ничего не делает - просто возвращает 0

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

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