// Win32Project1.cpp : Defines the entry point for the console application.
//netbios是VC提供的网络编程接口,可以方便的获取网卡MAC地址,netbios中所用的函数声明、常数等均是在头文件nb30.h内定义的,若想使用netbios,必须连接netapi32.lib库
#include "stdafx.h"
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <wincon.h>
#pragma comment(lib,"netapi32.lib")
/*
Dev C++ -> include libnetapi32.a
BCC 5.5 or VC++ -> #pragma comment(lib,"netapi32.lib")
*/
//定义一个描述网卡的结构 _ASTAT_ ,其中使用到了ADAPTER_STATUS结构(也由nb30.h定义),
typedef struct _ASTAT_
{
ADAPTER_STATUS adapt; //该结构内定义了网卡MAC地址的变量
NAME_BUFFER NameBuff[30];
} ASTAT, *PASTAT;
void getMac(char * mac)
{
ASTAT Adapter;
NCB Ncb;
UCHAR uRetCode; //定义返回值变量,在调用betbios函数前应先预置好该NCB的一些字段,返回码uRetCode正常时应为0
LANA_ENUM lenum; //LANA_ENUM结构是有nb30.h中定义的,当主机中有两块以上网卡时,使用NCB命令NCBENUM后该结构会含有返回的网卡数目及其索引;
//LANA_ENUM结构中定义了一个lana [MAX_LANA] 数组,它存放所有网卡信息;同时该结构中还有一个length变量,表示lana数组的长度,也就是本机所带网卡的个数
int i = 0;
memset(&Ncb, 0, sizeof(Ncb));
Ncb.ncb_command = NCBENUM; //用于指定要执行的Netbios命令
Ncb.ncb_buffer = (UCHAR *)&lenum; //指向数据缓冲区,发送时该缓冲区包含了要送出去的实际数据,接收时的接收数据则为从Netbios函数返回的数据;
//对于其他命令来说,如NCBENUM,缓冲区便是预定义结构LANA_ENUM
Ncb.ncb_length = sizeof(lenum); //指定缓冲区的长度,以字节数为单位,接收时netbios会将该值设为收到的字节数,若指定的缓冲区不够大,netbiod就会返回NRC_BUFLEND错误
//该句的意思是将求出的网卡数量赋值给Ncb.ncb_length
//调用netbios函数,入口参数是一个指向网络控制块(NCB)的指针
uRetCode = Netbios(&Ncb);
printf("The NCBENUM return adapter number is: %d \n ", lenum.length);
for (i = 0; i < lenum.length; i++)
{
memset(&Ncb, 0, sizeof(Ncb)); //NCB结构清零
Ncb.ncb_command = NCBRESET;
Ncb.ncb_lana_num = lenum.lana[i];
uRetCode = Netbios(&Ncb);
memset(&Ncb, 0, sizeof(Ncb));
Ncb.ncb_command = NCBASTAT;
Ncb.ncb_lana_num = lenum.lana[i];
strcpy_s((char *)Ncb.ncb_callname,30, "* ");
Ncb.ncb_buffer = (unsigned char *)&Adapter;
Ncb.ncb_length = sizeof(Adapter);
uRetCode = Netbios(&Ncb);
if (uRetCode == 0)
{
//sprintf(mac, "%02x-%02x-%02x-%02x-%02x-%02x ",
sprintf_s(mac,30, "%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]
);
//printf( "The Ethernet Number on LANA %d is: %s\n ", lenum.lana[i], mac);
}
}
}
int main(int argc, char *argv[])
{
char *mac = new char[32];
getMac(mac);
printf("%s\n ", mac);
delete[]mac;
system("PAUSE> NUL ");
return 0;
}