· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.NETWORKS —› Как определить MAC адрес?

Посл.отвђт Сообщенiе


Дата: Авг 22, 2003 14:53:30

Сабж собственно...
Ранее использовал модуль NB30.pas и следующую схему:
  Ncb.ncb_command := NCBENUM;
  Netbios(@Ncb);

  Ncb.ncb_command := NCBRESET;
  Ncb.ncb_lana_num := 0;
  Netbios(@Ncb);

  ncb.ncb_command := NCBASTAT;
  Netbios(@Ncb);

Проблема в том, что на некоторых машинах эта последовательность в результате выдает нули в буфере MAC адреса, хотя в коде стоят проверки на ошибки по результатам Netbios(@Ncb), т.е. оно как бы работает правильно, но выдает почему-то неправильную информацию.
Доступа к этим машинам не имею, поэтому на месте проверить не могу.

Может кто видел алгоритмы получения MAC адреса?
Желательно проверенные временем, т.е. надежные...


Дата: Авг 22, 2003 14:57:47

опс, немного соврал...
если один из трех вызовов Netbios(@Ncb) вернет ошибку, то я как раз и получу нули.
Вот только почему возвращаются ошибки?
На остальных 95% машин все работает нормально.


Дата: Авг 22, 2003 17:49:11

Ты знаешь, а чего ты его лезешь через такую задницу определять? Я бы, честно говоря, шел по другому пути. Лез бы к плате, например, через NdisRequest. Где-то так:
HANDLE hAdapter = W32N_OpenAdapter( <Adapter Path Name> );
if (INVALID_HANDLE_VALUE != hAdapter)
{
BYTE curMACAddress[6];
W32N_REQUEST w32nRequest = {0};
w32nRequest.NdisRequest.RequestType = NdisRequestQueryInformation;

w32nRequest.NdisRequest.DATA.QUERY_INFORMATION.Oid =
OID_802_3_CURRENT_ADDRESS;
w32nRequest.NdisRequest.DATA.QUERY_INFORMATION.InformationBuffer =
curMACAddress;
w32nRequest.NdisRequest.DATA.QUERY_INFORMATION.InformationBufferLengt
 
h = sizeof( curMACAddress );
w32nRequest.NdisRequest.DATA.QUERY_INFORMATION.BytesWritten = 0;
w32nRequest.NdisRequest.DATA.QUERY_INFORMATION.BytesNeeded = 0;

OVERLAPPED overlapped = {0};

overlapped.hEvent = CreateEvent( 0, TRUE, 0, NULL );
NDIS_STATUS status = W32N_MakeNdisRequest( hAdapter, &w32nRequest,
&overlapped, TRUE );
CloseHandle( overlapped.hEvent );
W32N_CloseAdapter( hAdapter );

CString MACAddress;
MACAddress.Format(
"%02x:%02x:%02x:%02x:%02x:%02x", 
curMACAddress[0],
curMACAddress[1],
curMACAddress[2],
curMACAddress[3],
curMACAddress[4],
curMACAddress[5]
);
m_mac_source_address.SetWindowText( MACAddress );
}


Да, между нами - NetBIOS - отстой %)
Впрочем, ты и сам это знаешь.
По поводу потерянных датаграмм - что если смотреть сниффером?


Дата: Авг 22, 2003 20:31:52

Спасибо Володя, такого подхода я еще не видел...
В примерах везде используется netbios (даже в MSDN), или через socket(AF_IPX,SOCK_DGRAM,NSPROTO_IPX), но у меня напр. такой способ не работает, т.к. IPX'а нету... и слава Богу :))
Будем ковырять...


Дата: Авг 22, 2003 20:33:38

Потрудись сообщить, чего наковырял!


Дата: Авг 23, 2003 13:34:23

а ниче :(
Ndis этож ДДК для Ринг0, а мне для Ринг3 надо.
В умных книжках пишут, что МАС еще можно найти через IPHelper, щас буду разбираться.


Дата: Авг 23, 2003 18:00:39

Ну...
Чую я, что это не совсем так, но замнем для ясности.
Но смотри - ipconfig /all - дает тебе и MAC-адрес.
Как она это делает?

В директрии импорта есть ссылка IPHLPAPI.dll.
IP_ADAPTER_INFO - содержит поле
BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH]; - и написано:

Address
Hardware address for the adapter.

Так что, может это то, что тебе надо?

GetAdaptersInfo, вроде!


Дата: Авг 25, 2003 22:34:12

Здесь все по твоему вопросу -
http://www.codeguru.com/network/GetMAC.html


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.046