|
|
| Посл.отвђт | Сообщен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 |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.046 |