MACアドレスの取得 2

昨日に引き続き、本日も調査を兼ねて取り掛かる。

Netbiosを使用した方法で実装することにした。

まず、Netbiosを使用するにあたり、以下のヘッダーとlibファイルを取り込む必要がある。

#include "Nb30.h"
#pragma comment( lib, "Netapi32.lib" )

あとは、Netbios()を使用し、NICカードの枚数を取得し、
その枚数分、MACアドレスの取得を試みる。
※細かいところは…とりあえずおいとく(汗)
※ソースのベースは他の方から引用させてもらってます('_';

■以下、サンプルソース
CString変数strMacBuffを"00-11-22-33-44-55"と表示できるように文字列操作を行っている。

struct ASTAT
{
/* ADAPTER_STATUS: http://msdn.microsoft.com/en-us/library/bb870890(v=vs.85).aspx */
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuff[30];
};

int i;
NCB sNcb;
UCHAR uRetCode;
LANA_ENUM lenum;
ASTAT Adapter;
CString strMacBuff = _T(""); // MACアドレス格納
char szBuff[MAX_PATH];

//初期化

ZeroMemory( &szBuff, sizeof(szBuff) );

// NIC数の取得

ZeroMemory( &sNcb, sizeof(sNcb) );

sNcb.ncb_command = NCBENUM;
sNcb.ncb_buffer = (UCHAR*)&lenum;
sNcb.ncb_length = sizeof(lenum);

uRetCode = Netbios( &sNcb );
if( 0 != uRetCode ){
// MessageBox(_T("取得失敗"),0,0);
return;
}

for( i = 0; i < lenum.length; i++){ // NIC数分繰り返す
//NICのリセット
::ZeroMemory( &sNcb, sizeof(sNcb) );
sNcb.ncb_command = NCBRESET; // NCBRESETコマンド
sNcb.ncb_lana_num = lenum.lana[i];
uRetCode = Netbios( &sNcb ); // Netbios命令を実行
if( 0 != uRetCode ){
// MessageBox(_T("リセット失敗"),0,0);
return;
}

// MACアドレスを取得
::ZeroMemory( &sNcb, sizeof(sNcb) );
sNcb.ncb_command = NCBASTAT; // NCBASTATコマンド
sNcb.ncb_lana_num = lenum.lana[i];
strcpy( (char*)(sNcb.ncb_callname), "* " );
sNcb.ncb_buffer = (UCHAR*)&Adapter;
sNcb.ncb_length = sizeof(Adapter);

uRetCode = Netbios(&sNcb);
if( 0 != uRetCode ){
// MessageBox(_T("MACアドレス取得失敗"),0,0);
return;
}

if( 0 == uRetCode ){
sprintf(szBuff, "%02X-%02X-%02X-%02X-%02X-%02X"
, Adapter.adapt.adapter_address[0]
, Adapter.adapt.adapter_address[1]
, Adapter.adapt.adapter_address[2]
, Adapter.adapt.adapter_address[3]
, Adapter.adapt.adapter_address[4]
, Adapter.adapt.adapter_address[5]);

// **-**-**-**-**-**へ形式を変えたMACアドレスを送信用変数へ格納
strMacBuff = szBuff;
}
}


以上、MACアドレスの取得方法のメモ。