Шаг 14 - Список все адаптеров

Подробнее о адаптерах в Windows читайте "Шаг 56 - Установка сетевой карты". Так как адаптеров может быть много, то надо как-то научиться их перебирать. С адаптерами работает интерфейс NDIS, это самый нижний уровень. Дальше драйвер сетевой карты. А вот над этим интерфейсом как раз и находиться NetBios вот с помощью него мы попробуем получить этот список. Ниже я приведу часть схемы которую я постепенно делаю связанную с данным вопросом. Как только схема будет готова Вы увидите ее на сейте, а пока вот кусок.

gif/14_1.gif (6019 b)

Итак, среди команд NetBios есть одна связанная с данным вопросом правда как написано не стандартная NCBENUM. Microsoft как всегда что то там рассказывает о Windows NT, а нам все равно правда?

gif/14_2.gif (1056 b)

Получение информации о адаптере взято из "Шаг 1 - Установка драйвера принтера":

#include "stdafx.h"
#include "windows.h"
#include "nb30.h"
#include "iostream.h"
#include "mbstring.h"

#pragma comment(lib,"Netapi32.lib")


typedef struct _ASTAT_
{    
	ADAPTER_STATUS adapt;
	NAME_BUFFER NameBuff[30];
}Adapter;

void main()
{
	NCB	ncb;
	UCHAR uRetCode; 
	LANA_ENUM la;
	memset( &ncb,0,sizeof(ncb)); 
	ncb.ncb_command = NCBENUM;
	ncb.ncb_buffer=(unsigned char *) &la;
	ncb.ncb_length = sizeof(LANA_ENUM );
	uRetCode = Netbios((NCB*) &ncb );
	if ( uRetCode == NRC_GOODRET )  
	{
		cout << "Ok" << endl;
		for (int x=0;x<la.length;x++)
		{
			cout << "Adapter " << x << " - INFO - " <<  endl;
			memset( &ncb, 0, sizeof(ncb) ); 
			// Это из первого шага
			ncb.ncb_command = NCBASTAT;
			ncb.ncb_lana_num = la.lana[x];		// это наш номер
			_mbscpy( ncb.ncb_callname,(UCHAR*)"*               ");
			Adapter a1;
			ncb.ncb_buffer = (unsigned char *) &a1; 
			ncb.ncb_length = sizeof(a1);
			uRetCode = Netbios((NCB*) &ncb );
			if ( uRetCode == NRC_GOODRET )   
			{
			printf( "The Ethernet Number is: %02x%02x%02x%02x%02x%02x\n",
				a1.adapt.adapter_address[0],
				a1.adapt.adapter_address[1],
				a1.adapt.adapter_address[2],
				a1.adapt.adapter_address[3],
				a1.adapt.adapter_address[4],
				a1.adapt.adapter_address[5] ); 
			} 
			else cout << "error read" << endl;
			// конец кода первого шага
		}
	}
	else cout << uRetCode;
}

Все как всегда разве структура новая. Запускаем смотрим:

gif/14_3.gif (880 b)

Номеров три. И адаптеров три, только два номера похожи. Последний номер - это контролер удаленного доступа. А вот один из похожих - это сетевая карта и ИК порт, который Plug&Play в самом хорошем понимании, не спрашивая никого устанавливается при первом удобном случае. Вообще работает все это. Кстати Netapi32 использует NetBios.dll сама по себе ничего не делая.


Загрузить проект | Предыдущий Шаг | Оглавление
Автор Каев Артем - 21.11.2001