|
@@ -5,8 +5,18 @@
|
|
|
#include <SetupAPI.h>
|
|
|
#include <InitGuid.h>
|
|
|
#include <WinIoCtl.h>
|
|
|
+#include <hidsdi.h>
|
|
|
+#pragma comment(lib, "Hid.lib")
|
|
|
#pragma comment(lib, "SetupAPI.lib")
|
|
|
|
|
|
+
|
|
|
+// 枚举所有USB设备;
|
|
|
+DEFINE_GUID(GUID_DEVINTERFACE_USB_DEVICE, 0xA5DCBF10L, 0x6530, 0x11D2, 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED);
|
|
|
+#define GUID_CLASS_USB_DEVICE GUID_DEVINTERFACE_USB_DEVICE
|
|
|
+
|
|
|
+DEFINE_GUID(GUID_DEVINTERFACE_USB_HUB, 0xf18a0e88, 0xc30c, 0x11d0, 0x88, 0x15, 0x00, 0xa0, 0xc9, 0x06, 0xbe, 0xd8);
|
|
|
+#define GUID_CLASS_USB_HUB GUID_DEVINTERFACE_USB_HUB
|
|
|
+
|
|
|
namespace Global
|
|
|
{
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
@@ -24,6 +34,7 @@ namespace Global
|
|
|
TCHAR g_szVersion[MAX_PATH] = _T("5.50.20200921");
|
|
|
BaiduCfg g_bdcfg;
|
|
|
RsRunCfg g_rscfg;
|
|
|
+
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
// 全局函数;
|
|
|
/************************************************************************/
|
|
@@ -364,6 +375,9 @@ namespace Global
|
|
|
g_Config.strFtpUser = szValue;
|
|
|
GetPrivateProfileString(_T("SATHelper"), _T("ftp_password"), NULL, szValue, MAX_PATH, szConfigpath);
|
|
|
g_Config.strFtpPassword = szValue;
|
|
|
+
|
|
|
+ // 测试精灵端口控制类型:开关、切换;
|
|
|
+ g_Config.nTWPortControltype = GetPrivateProfileInt(_T("TestWizard"), _T("PortControltype"), 0, szConfigpath);
|
|
|
}
|
|
|
|
|
|
BOOL GetOrientation(IN Image* pImg)
|
|
@@ -795,4 +809,170 @@ namespace Global
|
|
|
assert(horzScale == vertScale); // 宽或高这个缩放值应该是相等的
|
|
|
#endif
|
|
|
}
|
|
|
+
|
|
|
+ //枚举所有usb设备
|
|
|
+ BOOL EnumUSBDevice(OUT char acDevPath[MAX_PATH][MAX_PATH], OUT int& nDevNum)
|
|
|
+ {
|
|
|
+ //入参检测
|
|
|
+ nDevNum = 0;
|
|
|
+ if (NULL == acDevPath)
|
|
|
+ return FALSE;
|
|
|
+
|
|
|
+ ZeroMemory(acDevPath, sizeof(acDevPath));
|
|
|
+ BOOL bRet = FALSE;
|
|
|
+ SP_DEVICE_INTERFACE_DATA DeviceInterfaceData; // 保存设备接口信息
|
|
|
+ DWORD dwRequiredSize = 0; // 得到详细信息时需要的内存大小
|
|
|
+ PSP_INTERFACE_DEVICE_DETAIL_DATA pDeviceDetailData = NULL; // 详细信息
|
|
|
+ HDEVINFO hDeviceInfo; // 设备信息集合的指针
|
|
|
+ GUID InterfaceGUID = GUID_CLASS_USB_DEVICE;
|
|
|
+ DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
|
|
|
+
|
|
|
+ // 枚举设备
|
|
|
+ int i = 0;
|
|
|
+ hDeviceInfo = SetupDiGetClassDevs(&InterfaceGUID, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
|
|
|
+ if (hDeviceInfo == INVALID_HANDLE_VALUE)
|
|
|
+ return FALSE;
|
|
|
+
|
|
|
+ while (1)
|
|
|
+ {
|
|
|
+ bRet = SetupDiEnumDeviceInterfaces(hDeviceInfo, NULL, &InterfaceGUID, i++, &DeviceInterfaceData);
|
|
|
+ if (!bRet)
|
|
|
+ break;
|
|
|
+
|
|
|
+ // 下面需要得到Interface的详细信息
|
|
|
+ // 先得到详细信息需要的内存大小
|
|
|
+ bRet = SetupDiGetDeviceInterfaceDetail(hDeviceInfo, &DeviceInterfaceData, NULL, 0, &dwRequiredSize, NULL);
|
|
|
+ if (bRet)
|
|
|
+ break;
|
|
|
+
|
|
|
+ // 为详细信息分配内存
|
|
|
+ if (pDeviceDetailData)
|
|
|
+ {
|
|
|
+ free(pDeviceDetailData);
|
|
|
+ pDeviceDetailData = NULL;
|
|
|
+ }
|
|
|
+ pDeviceDetailData = (PSP_INTERFACE_DEVICE_DETAIL_DATA)malloc(dwRequiredSize);
|
|
|
+ if (pDeviceDetailData == NULL)
|
|
|
+ break;
|
|
|
+
|
|
|
+ // 得到Interface的详细信息
|
|
|
+ pDeviceDetailData->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
|
|
|
+ SP_DEVINFO_DATA DeviceInfoData;
|
|
|
+ DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
|
|
|
+ bRet = SetupDiGetDeviceInterfaceDetail(hDeviceInfo, &DeviceInterfaceData, pDeviceDetailData, dwRequiredSize, &dwRequiredSize,&DeviceInfoData);
|
|
|
+ if (!bRet)
|
|
|
+ break;
|
|
|
+ strcpy_s(acDevPath[nDevNum], pDeviceDetailData->DevicePath);
|
|
|
+ nDevNum++;
|
|
|
+ }
|
|
|
+ if (pDeviceDetailData)
|
|
|
+ {
|
|
|
+ free(pDeviceDetailData);
|
|
|
+ pDeviceDetailData = NULL;
|
|
|
+ }
|
|
|
+ SetupDiDestroyDeviceInfoList(hDeviceInfo);
|
|
|
+ return TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ INT EnumUSBDevice(CONST GUID* pClassGuid)
|
|
|
+ {
|
|
|
+ HDEVINFO hDevInfo;
|
|
|
+ DWORD MemberIndex, RequiredSize;
|
|
|
+ SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
|
|
|
+ PSP_DEVICE_INTERFACE_DETAIL_DATA DeviceInterfaceDetailData;
|
|
|
+ INT nTotal = 0;
|
|
|
+ INT nNICKind = 0;
|
|
|
+ HIDD_ATTRIBUTES attributes;
|
|
|
+
|
|
|
+ // 获取设备信息集;
|
|
|
+ hDevInfo = SetupDiGetClassDevs(pClassGuid, 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, pClassGuid, 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;
|
|
|
+ // 不保留swd调试网卡,root系统网卡.只保留usb和pci
|
|
|
+ if (_tcsnicmp(DeviceInterfaceDetailData->DevicePath + 4, TEXT("pci"), 3) != 0 && _tcsnicmp(DeviceInterfaceDetailData->DevicePath + 4, TEXT("usb"), 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)
|
|
|
+ {
|
|
|
+ // 获取 attributes 以便得到Vendor ID 和 Product ID
|
|
|
+ HidD_GetAttributes(hDeviceFile, &attributes);
|
|
|
+
|
|
|
+ ULONG dwID;
|
|
|
+ BYTE ucData[512];
|
|
|
+ DWORD dwByteRet;
|
|
|
+
|
|
|
+ // 获取原生MAC地址;
|
|
|
+ STORAGE_PROPERTY_QUERY Query; // 查询输入参数
|
|
|
+ // 设置查询参数
|
|
|
+ Query.PropertyId = StorageDeviceProperty;
|
|
|
+ Query.QueryType = PropertyStandardQuery;
|
|
|
+ dwID = OID_802_3_PERMANENT_ADDRESS;
|
|
|
+ isOK = DeviceIoControl(hDeviceFile, IOCTL_STORAGE_QUERY_PROPERTY, &Query, sizeof(STORAGE_PROPERTY_QUERY), ucData, sizeof(ucData), &dwByteRet, NULL);
|
|
|
+ if (isOK)
|
|
|
+ {
|
|
|
+ ++nTotal;
|
|
|
+ PSTORAGE_DEVICE_DESCRIPTOR pDevDesc;
|
|
|
+ pDevDesc = (PSTORAGE_DEVICE_DESCRIPTOR)ucData;
|
|
|
+ //_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]);
|
|
|
+ }
|
|
|
+
|
|
|
+ //WriteTextLog(SAT_NOR, _T("类型=%d, 路径=%s, MAC=%s, NICKind=%s"), tagMacAddress.nNICKind, tagMacAddress.szDevicePath, tagMacAddress.szMacAddress, tagMacAddress.szNICKind);
|
|
|
+ //g_vtMac.push_back(tagMacAddress);
|
|
|
+ }
|
|
|
+ CloseHandle(hDeviceFile);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ free(DeviceInterfaceDetailData);
|
|
|
+ DeviceInterfaceDetailData = NULL;
|
|
|
+ }
|
|
|
+
|
|
|
+ SetupDiDestroyDeviceInfoList(hDevInfo);
|
|
|
+
|
|
|
+ return nTotal;
|
|
|
+ }
|
|
|
}
|