WORD IAndroid::GetMACAddress(BYTE cbMacBuffer[], WORD wBufferSize) { //变量定义 WORD wMacSize=0; HINSTANCE hInstance=NULL; typedef BYTE __stdcall NetBiosProc(NCB * Ncb); try { //加载 DLL hInstance=LoadLibrary(TEXT("NetApi32.dll")); if (hInstance==NULL) throw TEXT("加载 NetApi32.dll 失败"); //获取函数 NetBiosProc * pNetBiosProc=(NetBiosProc *)GetProcAddress(hInstance,"Netbios"); if (pNetBiosProc==NULL) throw TEXT("无法找到 NetBios 函数"); //变量定义 NCB Ncb; LANA_ENUM LanaEnum; ZeroMemory(&Ncb,sizeof(Ncb)); ZeroMemory(&LanaEnum,sizeof(LanaEnum)); //枚举网卡 Ncb.ncb_command=NCBENUM; Ncb.ncb_length=sizeof(LanaEnum); Ncb.ncb_buffer=(BYTE *)&LanaEnum; if (pNetBiosProc(&Ncb)!=NRC_GOODRET) throw TEXT("枚举网卡失败"); if (LanaEnum.length==0) throw TEXT("找不到任何网卡"); //获取地址 tagAstatInfo Adapter; for (BYTE i=0;i<LanaEnum.length;i++) { //重置网卡 ZeroMemory(&Ncb,sizeof(Ncb)); Ncb.ncb_command=NCBRESET; Ncb.ncb_lana_num=LanaEnum.lana[i]; if (pNetBiosProc(&Ncb)!=NRC_GOODRET) throw TEXT("重置网卡失败"); //获取状态 ZeroMemory(&Ncb,sizeof(Ncb)); Ncb.ncb_command=NCBASTAT; Ncb.ncb_length=sizeof(Adapter); Ncb.ncb_buffer=(BYTE *)&Adapter; Ncb.ncb_lana_num=LanaEnum.lana[i]; strcpy((char *)Ncb.ncb_callname,"*"); if (pNetBiosProc(&Ncb)!=NRC_GOODRET) throw TEXT("获取网卡状态失败"); //获取地址 if (wMacSize<wBufferSize) { //拷贝地址 WORD wCopySize=__min((wBufferSize-wMacSize),sizeof(BYTE)*6); CopyMemory(cbMacBuffer,Adapter.AdapterStatus.adapter_address,wCopySize); //完成判断 wMacSize+=wCopySize; if (wMacSize==wBufferSize) break; } } //释放资源 if (hInstance!=NULL) { FreeLibrary(hInstance); hInstance=NULL; } return wMacSize; } catch (...) { //释放资源 if (hInstance!=NULL) { FreeLibrary(hInstance); hInstance=NULL; } } return wMacSize; }
//网卡地址 bool CWHService::GetMACAddress(TCHAR szMACAddress[LEN_NETWORK_ID]) { //变量定义 HINSTANCE hInstance=NULL; //执行逻辑 __try { //加载 DLL hInstance=LoadLibrary(TEXT("NetApi32.dll")); if (hInstance==NULL) __leave; //获取函数 typedef BYTE __stdcall NetBiosProc(NCB * Ncb); NetBiosProc * pNetBiosProc=(NetBiosProc *)GetProcAddress(hInstance,"Netbios"); if (pNetBiosProc==NULL) __leave; //变量定义 NCB Ncb; LANA_ENUM LanaEnum; ZeroMemory(&Ncb,sizeof(Ncb)); ZeroMemory(&LanaEnum,sizeof(LanaEnum)); //枚举网卡 Ncb.ncb_command=NCBENUM; Ncb.ncb_length=sizeof(LanaEnum); Ncb.ncb_buffer=(BYTE *)&LanaEnum; if ((pNetBiosProc(&Ncb)!=NRC_GOODRET)||(LanaEnum.length==0)) __leave; //获取地址 if (LanaEnum.length>0) { //变量定义 tagAstatInfo Adapter; ZeroMemory(&Adapter,sizeof(Adapter)); //重置网卡 Ncb.ncb_command=NCBRESET; Ncb.ncb_lana_num=LanaEnum.lana[0]; if (pNetBiosProc(&Ncb)!=NRC_GOODRET) __leave; //获取状态 Ncb.ncb_command=NCBASTAT; Ncb.ncb_length=sizeof(Adapter); Ncb.ncb_buffer=(BYTE *)&Adapter; Ncb.ncb_lana_num=LanaEnum.lana[0]; strcpy((char *)Ncb.ncb_callname,"*"); if (pNetBiosProc(&Ncb)!=NRC_GOODRET) __leave; //获取地址 for (INT i=0;i<6;i++) { ASSERT((i*2)<LEN_NETWORK_ID); _stprintf(&szMACAddress[i*2],TEXT("%02X"),Adapter.AdapterStatus.adapter_address[i]); } } } //结束清理 __finally { //释放资源 if (hInstance!=NULL) { FreeLibrary(hInstance); hInstance=NULL; } //错误断言 if (AbnormalTermination()==TRUE) { ASSERT(FALSE); } } return true; }