|
@@ -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;
|
|
|
+ }
|
|
|
};
|