浏览代码

1、枚举所有usb设备函数,未启用;
2、测试精灵端口切换:新增配置可选择开关、切换类型;
3、任务列表升序显示。

sat23 4 年之前
父节点
当前提交
dcb883c08a
共有 4 个文件被更改,包括 232 次插入14 次删除
  1. 1 1
      SATHelper/SATHelper/DevicesWnd.cpp
  2. 180 0
      SATHelper/SATHelper/Global.cpp
  3. 14 0
      SATHelper/SATHelper/Global.h
  4. 37 13
      SATHelper/SATHelper/MainFrm.cpp

+ 1 - 1
SATHelper/SATHelper/DevicesWnd.cpp

@@ -416,7 +416,7 @@ int CDevicesWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
 						int nSize = SATData::task_resp.ssTasks[i].nCaseSize;
 						if (nSize > SATPROTO::MAX_CASES)
 							nSize = SATPROTO::MAX_CASES;
-						for (int k = 0; k < nSize; k++) {
+						for (int k = nSize; k >= 0; --k) {
 							_itoa_s(k, szIndex, 10);
 							SATPROTO::CaseInfo& caseInfo = SATData::task_resp.ssTasks[i].ssCases[k];
 							p->m_listTask.InsertItem(nIndex, szIndex);

+ 180 - 0
SATHelper/SATHelper/Global.cpp

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

+ 14 - 0
SATHelper/SATHelper/Global.h

@@ -21,6 +21,14 @@ typedef string TString;
 typedef wstring TString;
 #endif
 
+
+// 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} };
+
 namespace Global
 {
 	typedef struct __ST_CONFIG__
@@ -79,6 +87,10 @@ namespace Global
 
 		// 是否要实时更新svn信息;
 		bool bSVNRealTimeUpdate;
+
+		// 测试精灵端口控制类型:开关、切换;
+		// 0 = 开关; 1 = 切换;
+		int nTWPortControltype;
 	}STConfig, * pSTConfig;
 
 	// 读取baidu.cfg配置文件内容;
@@ -155,4 +167,6 @@ namespace Global
 	void MKDIR(LPCTSTR dir);
 	bool GetVersion(OUT WORD* pdwFileVersion, OUT WORD* pdwProductVerion);
 	void GetSysZoomRatio();
+	BOOL EnumUSBDevice(OUT char acDevPath[MAX_PATH][MAX_PATH], OUT int& nDevNum);
+	INT EnumUSBDevice(CONST GUID* pClassGuid);
 };

+ 37 - 13
SATHelper/SATHelper/MainFrm.cpp

@@ -2018,23 +2018,47 @@ void CMainFrame::OnPowerCtrl()
 
 	TCHAR szCommand[MAX_PATH] = {0};
 	CString strText = pPowerCtrl->GetText();
-	if (strText == GlobalString::g_strCtrlOpen)
+	if (Global::g_Config.nTWPortControltype == 0)
 	{
-		_stprintf_s(szCommand, _T("*SET LAN %d POWER ON"), Global::g_Config.nPowerLanIndex);
-		if ( Global::g_Config.nPowerLanIndex == 0 )
-			TW::SendCmd(_T("*SET POWER ON"));
-		else 
-			TW::SendCmd(szCommand);
-		pPowerCtrl->SetText(GlobalString::g_strCtrlClose);
+		if (strText == GlobalString::g_strCtrlOpen)
+		{
+			_stprintf_s(szCommand, _T("*SET LAN %d POWER ON"), Global::g_Config.nPowerLanIndex);
+			if (Global::g_Config.nPowerLanIndex == 0)
+				TW::SendCmd(_T("*SET POWER ON"));
+			else
+				TW::SendCmd(szCommand);
+			pPowerCtrl->SetText(GlobalString::g_strCtrlClose);
+		}
+		else
+		{
+			_stprintf_s(szCommand, _T("*SET LAN %d POWER OFF"), Global::g_Config.nPowerLanIndex);
+			if (Global::g_Config.nPowerLanIndex == 0)
+				TW::SendCmd(_T("*SET POWER OFF"));
+			else
+				TW::SendCmd(szCommand);
+			pPowerCtrl->SetText(GlobalString::g_strCtrlOpen);
+		}
 	}
-	else
+	else if (Global::g_Config.nTWPortControltype == 1)
 	{
-		_stprintf_s(szCommand, _T("*SET LAN %d POWER OFF"), Global::g_Config.nPowerLanIndex);
-		if (Global::g_Config.nPowerLanIndex == 0)
-			TW::SendCmd(_T("*SET POWER OFF"));
+		if (strText == GlobalString::g_strCtrlOpen)
+		{
+			_stprintf_s(szCommand, _T("*SET LAN %d PORT A"), Global::g_Config.nPowerLanIndex);
+			if (Global::g_Config.nPowerLanIndex == 0)
+				TW::SendCmd(_T("*SET PORT A"));
+			else
+				TW::SendCmd(szCommand);
+			pPowerCtrl->SetText(GlobalString::g_strCtrlClose);
+		}
 		else
-			TW::SendCmd(szCommand);
-		pPowerCtrl->SetText(GlobalString::g_strCtrlOpen);
+		{
+			_stprintf_s(szCommand, _T("*SET LAN %d PORT B"), Global::g_Config.nPowerLanIndex);
+			if (Global::g_Config.nPowerLanIndex == 0)
+				TW::SendCmd(_T("*SET PORT B"));
+			else
+				TW::SendCmd(szCommand);
+			pPowerCtrl->SetText(GlobalString::g_strCtrlOpen);
+		}
 	}
 }