Vielen Dank an Sven Ilius
für die Korrektur des ursprünglichen Snippet-Codes !
//---------------------------------------------------------------------------
// Funktion GetMacAddresses() schreibt die MAC-Adressen (MAC=Media Access
// Control) der im PC installierten Netzwerkkarten im Format xx-xx-xx-xx-xx-xx
// in die übergebene TStrings-Instanz. Die Funktion gibt die Anzahl der
// gefundenen Netzwerk-Adapter zurück.
// Um nur die Anzahl der MAC-Adressen zu ermitteln, kann der Funktion
// im Parameter pslStrings ein NULL-Zeiger übergeben werden.
//
// Aufrufbeispiele:
//
// /* schreiben aller Rechner-MACs in eine ListBox: */
// GetMacAddresses(ListBox1-Items)
//
// /* schreiben aller Rechner-MACs in die TStringList pslStrings: */
// GetMacAddresses(pslStrings);
//---------------------------------------------------------------------------
#include <nb30.h>
typedef struct _ASTAT
{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuff[30];
} ASTAT;
int GetMacAddresses(TStrings* pslStrings)
{
int ilRetVal = 0; // Rückgabewert
NCB stNetCtrlBlock; // Network Control Block - Instanz
LPVOID pASTAT; // Zeiger auf die ASTAT-Struktur
ASTAT stAdapterStatus; // AdapterStatus-Struktur
LANA_ENUM stLanEnum; // Struktur für die Enumerierung der
// Netzwerkkarten
if(pslStrings != NULL) pslStrings->Clear();
// die Anzahl der Netzwerkkarten ermitteln:
memset(&stNetCtrlBlock, 0, sizeof(stNetCtrlBlock));
stNetCtrlBlock.ncb_command = NCBENUM;
stNetCtrlBlock.ncb_buffer = (UCHAR *)&stLanEnum;
stNetCtrlBlock.ncb_length = sizeof(stLanEnum);
Netbios(&stNetCtrlBlock);
ilRetVal = stLanEnum.length;
// Falls Zeiger auf TStrings-Instanz übergeben, MAC-Adressen
// auslesen und in die Stringliste einfügen:
if(pslStrings != NULL)
{
for(int ilAdapter=0; ilAdapter < ilRetVal; ilAdapter++)
{
memset(&stNetCtrlBlock, 0, sizeof(stNetCtrlBlock));
stNetCtrlBlock.ncb_command = NCBRESET;
stNetCtrlBlock.ncb_lana_num = stLanEnum.lana[ilAdapter] ;
Netbios(&stNetCtrlBlock);
memset( &stNetCtrlBlock, 0, sizeof(stNetCtrlBlock) );
stNetCtrlBlock.ncb_command = NCBASTAT;
stNetCtrlBlock.ncb_lana_num = stLanEnum.lana[ilAdapter] ;
strcpy(stNetCtrlBlock.ncb_callname,"* ");
stNetCtrlBlock.ncb_length = sizeof(stAdapterStatus);
//stNetCtrlBlock.buffer = (UCHAR *)&stAdapterStatus.adapt;
pASTAT=HeapAlloc(GetProcessHeap(),HEAP_GENERATE_EXCEPTIONS|
HEAP_ZERO_MEMORY, stNetCtrlBlock.ncb_length);
if(pASTAT != NULL)
{
stNetCtrlBlock.ncb_buffer=(UCHAR *)pASTAT;
Netbios(&stNetCtrlBlock);
CopyMemory(&stAdapterStatus,stNetCtrlBlock.ncb_buffer,
sizeof(stAdapterStatus));
AnsiString slMacAddress;
for(int i =0; i < 6; i++)
{
slMacAddress +=IntToHex(stAdapterStatus.
adapt.adapter_address[i],2);
if(i<5) slMacAddress+="-";
}
HeapFree(GetProcessHeap(),0,pASTAT);
pslStrings->Add(slMacAddress);
}
else ilRetVal = 0;
}
}
return ilRetVal;
}
|