#include "stdafx.h" #include "GAT.h" #include static GUID UsbClassGuid = { 0xA5DCBF10L, 0x6530, 0x11D2,{ 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED } }; static GUID MacClassGuid = { 0xAD498944, 0x762F, 0x11D0, { 0x8D, 0xCB, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C } }; GuardAgainstTheft::GuardAgainstTheft() { } GuardAgainstTheft::~GuardAgainstTheft() { } BOOL GuardAgainstTheft::FindYtUSB() { GetMac(); HDEVINFO hDevInfo; INT iTotal = 0; // 获取设备信息集; hDevInfo = SetupDiGetClassDevs(&UsbClassGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE); if ( hDevInfo == INVALID_HANDLE_VALUE ) { return -1; } DWORD dwSize = 0; TCHAR szDIS[MAX_PATH] = {0}; SP_DEVINFO_DATA DeviceInfoData; ZeroMemory(&DeviceInfoData, sizeof(SP_DEVINFO_DATA)); DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA); for (int i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); i++) { dwSize = 0; if ( !SetupDiGetDeviceInstanceId(hDevInfo, &DeviceInfoData, szDIS, sizeof(szDIS), &dwSize)) { // 获取设备识别字符串失败; break; } // 设备识别串的前三个字符是否是"USB", 模板: USB\VID_XXXX&PID_XXXX\00000xxxxxxx; CString strDIS(szDIS); strDIS.MakeLower(); if (strDIS.Left(32) == _T("usb\\vid_1312&pid_1912\\5&3b0d2cff") ) { g_bExistSpecialUsb = TRUE; break; } } SetupDiDestroyDeviceInfoList(hDevInfo); return TRUE; } BOOL GuardAgainstTheft::GetMac() { HDEVINFO hDevInfo; DWORD MemberIndex, RequiredSize; SP_DEVICE_INTERFACE_DATA DeviceInterfaceData; PSP_DEVICE_INTERFACE_DETAIL_DATA DeviceInterfaceDetailData; INT iTotal = 0; // 获取设备信息集; hDevInfo = SetupDiGetClassDevs(&MacClassGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE); if (hDevInfo == INVALID_HANDLE_VALUE) { return -1; } // 枚举设备信息集中所有设备; 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); DeviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); // 获取设备细节信息; if (SetupDiGetDeviceInterfaceDetail(hDevInfo, &DeviceInterfaceData, DeviceInterfaceDetailData, RequiredSize, NULL, NULL)) { if ( WDK_GetMacAddress(DeviceInterfaceDetailData->DevicePath, g_szMacAddress, MAX_PATH, TRUE) ) { if ( g_szMacAddress[0] == _T('\0') ) continue; else break; } } free(DeviceInterfaceDetailData); } SetupDiDestroyDeviceInfoList(hDevInfo); return iTotal; } BOOL GuardAgainstTheft::GetMac(IN CStringArray& AryMac) { HDEVINFO hDevInfo; DWORD MemberIndex, RequiredSize; SP_DEVICE_INTERFACE_DATA DeviceInterfaceData; PSP_DEVICE_INTERFACE_DETAIL_DATA DeviceInterfaceDetailData; INT iTotal = 0; // 获取设备信息集; hDevInfo = SetupDiGetClassDevs(&MacClassGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE); if (hDevInfo == INVALID_HANDLE_VALUE) { return -1; } TCHAR szMacAddress[MAX_PATH] = {0}; // 枚举设备信息集中所有设备; 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); DeviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); // 获取设备细节信息; if (SetupDiGetDeviceInterfaceDetail(hDevInfo, &DeviceInterfaceData, DeviceInterfaceDetailData, RequiredSize, NULL, NULL)) { if ( WDK_GetMacAddress(DeviceInterfaceDetailData->DevicePath, szMacAddress, MAX_PATH, TRUE) ) { AfxMessageBox(szMacAddress); } } free(DeviceInterfaceDetailData); } SetupDiDestroyDeviceInfoList(hDevInfo); return iTotal; } // 获取网卡原生MAC地址; BOOL GuardAgainstTheft::WDK_GetMacAddress( TCHAR* DevicePath, TCHAR* szMacAddress, UINT uSize, BOOL isIncludeUSB ) { HANDLE hDeviceFile; BOOL isOK = FALSE; // 剔除虚拟网卡; if( _tcsnicmp( DevicePath + 4, TEXT("root"), 4 ) == 0 ) { return FALSE; } if( !isIncludeUSB ) { // 剔除USB网卡; if( _tcsnicmp( DevicePath + 4, TEXT("usb"), 4 ) == 0 ) { return FALSE; } } // 获取设备句柄; hDeviceFile = CreateFile( 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 ) { if( szMacAddress != NULL ) { // 将字节数组转换成16进制字符串; for( DWORD i = 0; i < dwByteRet; i++ ) { _stprintf_s( szMacAddress + (i << 1), uSize - (i << 1), TEXT("%02X"), ucData[i] ); } } } CloseHandle( hDeviceFile ); } return isOK; }