Ejemplo n.º 1
0
	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;
	}
Ejemplo n.º 2
0
//网卡地址
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;
}