|  | @@ -14,6 +14,13 @@
 | 
	
		
			
				|  |  |  #include <Iphlpapi.h>  
 | 
	
		
			
				|  |  |  #pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库 
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +// 获取网卡地址;
 | 
	
		
			
				|  |  | +#include <SetupAPI.h>
 | 
	
		
			
				|  |  | +#include <InitGuid.h>
 | 
	
		
			
				|  |  | +#include <WinIoCtl.h>
 | 
	
		
			
				|  |  | +#pragma comment(lib, "SetupAPI.lib")
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  namespace Global
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |  	STSATConfig g_stSATConfig;
 | 
	
	
		
			
				|  | @@ -36,6 +43,18 @@ namespace Global
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	CHAR g_szKeyPath[MAX_PATH];					// 加密狗USB位置;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +	//////////////////////////////////////////////////////////////////////////
 | 
	
		
			
				|  |  | +	std::string g_strMacs;
 | 
	
		
			
				|  |  | +	std::vector<MacAddress> g_vtMac;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	// usb;
 | 
	
		
			
				|  |  | +	static GUID UsbClassGuid = { 0xA5DCBF10L, 0x6530, 0x11D2, {0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED} };
 | 
	
		
			
				|  |  | +	// mac;
 | 
	
		
			
				|  |  | +	static GUID MacClassGuid = { 0xAD498944, 0x762F, 0x11D0, {0x8D, 0xCB, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C} };
 | 
	
		
			
				|  |  | +	// hdd;
 | 
	
		
			
				|  |  | +	static GUID HDDClassGuid = { 0x53F56307, 0xB6BF, 0x11D0, {0x94, 0xF2, 0x00, 0xA0, 0xC9, 0x1E, 0xFB, 0x8B} };
 | 
	
		
			
				|  |  | +	//////////////////////////////////////////////////////////////////////////
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  	ThreadSection g_critSection;
 | 
	
		
			
				|  |  |  	//////////////////////////////////////////////////////////////////////////
 | 
	
		
			
				|  |  |  	static const int BEGIN_YEAR = 1901;
 | 
	
	
		
			
				|  | @@ -1162,4 +1181,103 @@ namespace Global
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  		return std::string();
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	INT GetMacAddress()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		HDEVINFO hDevInfo;
 | 
	
		
			
				|  |  | +		DWORD MemberIndex, RequiredSize;
 | 
	
		
			
				|  |  | +		SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
 | 
	
		
			
				|  |  | +		PSP_DEVICE_INTERFACE_DETAIL_DATA DeviceInterfaceDetailData;
 | 
	
		
			
				|  |  | +		INT nTotal = 0;
 | 
	
		
			
				|  |  | +		INT nNICKind = 0;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		// 获取设备信息集;
 | 
	
		
			
				|  |  | +		hDevInfo = SetupDiGetClassDevs(&MacClassGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);
 | 
	
		
			
				|  |  | +		if (hDevInfo == INVALID_HANDLE_VALUE)
 | 
	
		
			
				|  |  | +		{
 | 
	
		
			
				|  |  | +			return -1;
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		g_vtMac.clear();
 | 
	
		
			
				|  |  | +		// 枚举设备信息集中所有设备;
 | 
	
		
			
				|  |  | +		DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
 | 
	
		
			
				|  |  | +		for (MemberIndex = 0; SetupDiEnumDeviceInterfaces(hDevInfo, NULL, &MacClassGuid, MemberIndex, &DeviceInterfaceData); MemberIndex++)
 | 
	
		
			
				|  |  | +		{
 | 
	
		
			
				|  |  | +			// 获取接收缓冲区大小,函数返回值为FALSE,GetLastError()=ERROR_INSUFFICIENT_BUFFER;
 | 
	
		
			
				|  |  | +			SetupDiGetDeviceInterfaceDetail(hDevInfo, &DeviceInterfaceData, NULL, 0, &RequiredSize, NULL);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			// 申请接收缓冲区;
 | 
	
		
			
				|  |  | +			DeviceInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(RequiredSize);
 | 
	
		
			
				|  |  | +			if ( DeviceInterfaceDetailData == NULL)
 | 
	
		
			
				|  |  | +				continue;
 | 
	
		
			
				|  |  | +			DeviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			// 获取设备细节信息;
 | 
	
		
			
				|  |  | +			if (SetupDiGetDeviceInterfaceDetail(hDevInfo, &DeviceInterfaceData, DeviceInterfaceDetailData, RequiredSize, NULL, NULL))
 | 
	
		
			
				|  |  | +			{
 | 
	
		
			
				|  |  | +				HANDLE hDeviceFile;
 | 
	
		
			
				|  |  | +				BOOL isOK = FALSE;
 | 
	
		
			
				|  |  | +				if (_tcsnicmp(DeviceInterfaceDetailData->DevicePath + 4, TEXT("pci"), 3) != 0)
 | 
	
		
			
				|  |  | +				{
 | 
	
		
			
				|  |  | +					free(DeviceInterfaceDetailData);
 | 
	
		
			
				|  |  | +					DeviceInterfaceDetailData = NULL;
 | 
	
		
			
				|  |  | +					continue;
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +				MacAddress tagMacAddress;
 | 
	
		
			
				|  |  | +				tagMacAddress.nNICKind = NIC_PCI;
 | 
	
		
			
				|  |  | +				_stprintf_s(tagMacAddress.szNICKind, _T("%s"), _T("NIC_PCI"));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +				// 获取设备句柄;
 | 
	
		
			
				|  |  | +				hDeviceFile = CreateFile(DeviceInterfaceDetailData->DevicePath,
 | 
	
		
			
				|  |  | +					0,
 | 
	
		
			
				|  |  | +					FILE_SHARE_READ | FILE_SHARE_WRITE,
 | 
	
		
			
				|  |  | +					NULL,
 | 
	
		
			
				|  |  | +					OPEN_EXISTING,
 | 
	
		
			
				|  |  | +					0,
 | 
	
		
			
				|  |  | +					NULL);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +				if (hDeviceFile != INVALID_HANDLE_VALUE)
 | 
	
		
			
				|  |  | +				{
 | 
	
		
			
				|  |  | +					ULONG dwID;
 | 
	
		
			
				|  |  | +					BYTE ucData[8];
 | 
	
		
			
				|  |  | +					DWORD dwByteRet;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +					// 获取原生MAC地址;
 | 
	
		
			
				|  |  | +					dwID = OID_802_3_PERMANENT_ADDRESS;
 | 
	
		
			
				|  |  | +					isOK = DeviceIoControl(hDeviceFile, IOCTL_NDIS_QUERY_GLOBAL_STATS, &dwID, sizeof(dwID), ucData, sizeof(ucData), &dwByteRet, NULL);
 | 
	
		
			
				|  |  | +					if (isOK)
 | 
	
		
			
				|  |  | +					{
 | 
	
		
			
				|  |  | +						++nTotal;
 | 
	
		
			
				|  |  | +						_stprintf_s(tagMacAddress.szDevicePath, _T("%s"), DeviceInterfaceDetailData->DevicePath);
 | 
	
		
			
				|  |  | +						memset(tagMacAddress.szMacAddress, 0, sizeof(TCHAR) * MAX_PATH);
 | 
	
		
			
				|  |  | +						// 将字节数组转换成16进制字符串;
 | 
	
		
			
				|  |  | +						for (DWORD i = 0; i < dwByteRet; i++)
 | 
	
		
			
				|  |  | +						{
 | 
	
		
			
				|  |  | +							_stprintf_s(&tagMacAddress.szMacAddress[i * 3], MAX_PATH - (i * 3), (i != dwByteRet - 1) ? _T("%02X-") : _T("%02X"), ucData[i]);
 | 
	
		
			
				|  |  | +						}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +						g_vtMac.push_back(tagMacAddress);
 | 
	
		
			
				|  |  | +					}
 | 
	
		
			
				|  |  | +					CloseHandle(hDeviceFile);
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			free(DeviceInterfaceDetailData);
 | 
	
		
			
				|  |  | +			DeviceInterfaceDetailData = NULL;
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		SetupDiDestroyDeviceInfoList(hDevInfo);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#if 1
 | 
	
		
			
				|  |  | +		g_strMacs.clear();
 | 
	
		
			
				|  |  | +		std::vector<MacAddress>::iterator it = g_vtMac.begin();
 | 
	
		
			
				|  |  | +		for (; it != g_vtMac.end(); it++)
 | 
	
		
			
				|  |  | +		{
 | 
	
		
			
				|  |  | +			g_strMacs.append(it->szMacAddress);
 | 
	
		
			
				|  |  | +			g_strMacs.append("&");
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +#endif
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		return nTotal;
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  |  };
 |