Global.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483
  1. #include "stdafx.h"
  2. #include "Global.h"
  3. #include <SetupAPI.h>
  4. #include <InitGuid.h>
  5. #include <WinIoCtl.h>
  6. #pragma comment(lib, "SetupAPI.lib")
  7. namespace Global
  8. {
  9. //////////////////////////////////////////////////////////////////////////
  10. // 全局变量;
  11. BOOL g_bTestHost = FALSE;
  12. TCHAR g_szCurModuleDir[MAX_PATH] = { 0 };
  13. TCHAR g_szCurModulePath[MAX_PATH] = { 0 };
  14. TCHAR g_szFna[MAX_PATH] = { 0 };
  15. TCHAR g_szConfig[MAX_PATH] = { 0 };
  16. std::string g_strMacs;
  17. std::vector<MacAddress> g_vtMac;
  18. // usb;
  19. static GUID UsbClassGuid = { 0xA5DCBF10L, 0x6530, 0x11D2, {0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED} };
  20. // mac;
  21. static GUID MacClassGuid = { 0xAD498944, 0x762F, 0x11D0, {0x8D, 0xCB, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C} };
  22. // hdd;
  23. static GUID HDDClassGuid = { 0x53F56307, 0xB6BF, 0x11D0, {0x94, 0xF2, 0x00, 0xA0, 0xC9, 0x1E, 0xFB, 0x8B} };
  24. //////////////////////////////////////////////////////////////////////////
  25. // 全局函数;
  26. /************************************************************************/
  27. /* 函数:WriteTextLog[7/28/2009 Jeff];
  28. /* 描述:写文本日志;
  29. /* 参数:;
  30. /* [IN] :;
  31. /* 返回:void;
  32. /* 注意:;
  33. /* 示例:;
  34. /*
  35. /* 修改:;
  36. /* 日期:;
  37. /* 内容:;
  38. /************************************************************************/
  39. void WriteTextLog(const TCHAR* format, ...)
  40. {
  41. // 将日志内容输入到文件中;
  42. // 获取今年年份;
  43. __time64_t gmt = time(NULL); // 获取当前日历时间(1900-01-01开始的Unix时间戳);
  44. struct tm gmtm = { 0 };
  45. localtime_s(&gmtm, &gmt); // 时间戳转成本地时间;
  46. // 解析出日志路径;
  47. TCHAR szlogpath[MAX_PATH] = { 0 };
  48. _stprintf_s(szlogpath, _T("%slog\\Serial Port%s Log %02d%02d.txt"), g_szCurModuleDir, g_szFna, gmtm.tm_mon + 1, gmtm.tm_mday);
  49. // 打开或创建文件;
  50. FILE* fp = NULL;
  51. //if (_taccess(szlogpath, 0) != -1)
  52. #ifndef UNICODE
  53. if (_access(szlogpath, 0) != -1)
  54. #else
  55. if (_taccess(szlogpath, 0) != -1)
  56. #endif
  57. { // 存在;
  58. if (0 == _tfopen_s(&fp, szlogpath, _T("a+")))
  59. // 移动到末尾;
  60. fseek(fp, 0, SEEK_END);
  61. }
  62. else
  63. { // 不存在;
  64. _tfopen_s(&fp, szlogpath, _T("w+"));
  65. }
  66. if (fp == NULL)
  67. return;
  68. // 格式化前设置语言区域;
  69. TCHAR* old_locale = _tcsdup(_tsetlocale(LC_CTYPE, NULL));
  70. _tsetlocale(LC_CTYPE, _T("chs")); //设定中文;
  71. // 格式化日志内容;
  72. va_list args = NULL;
  73. int len = 0;
  74. TCHAR* buffer = NULL;
  75. va_start(args, format);
  76. // _vscprintf doesn't count. terminating '\0'
  77. len = _vsctprintf(format, args) + 1;
  78. buffer = (TCHAR*)malloc(len * sizeof(TCHAR));
  79. _vstprintf_s(buffer, len, format, args);
  80. _ftprintf(fp, _T("%04d-%02d-%02d %02d:%02d:%02d %s\n"), gmtm.tm_year + 1990, gmtm.tm_mon + 1, gmtm.tm_mday, gmtm.tm_hour, gmtm.tm_min, gmtm.tm_sec, buffer);
  81. // 关闭文件,释放资源并设置回原语言区域;
  82. free(buffer);
  83. fclose(fp);
  84. _tsetlocale(LC_CTYPE, old_locale);
  85. free(old_locale); //还原区域设定;
  86. }
  87. void replace_str(std::string& str, const std::string& before, const std::string& after)
  88. {
  89. for (std::string::size_type pos(0); pos != std::string::npos; pos += after.length())
  90. {
  91. pos = str.find(before, pos);
  92. if (pos != std::string::npos)
  93. str.replace(pos, before.length(), after);
  94. else
  95. break;
  96. }
  97. }
  98. // 去除空格;
  99. std::string& trim(std::string& str)
  100. {
  101. int nIndex = 0;
  102. while ((nIndex = str.find_first_of(' ')) != std::string::npos)
  103. str.erase(nIndex, 1);
  104. return str;
  105. }
  106. // hModule 模块句柄 NULL表示当前模块;
  107. bool GetVersion(IN const TCHAR* fname, OUT WORD* pdwFileVersion, OUT WORD* pdwProductVerion)
  108. {
  109. VS_FIXEDFILEINFO* pVi = NULL;
  110. DWORD dwHandle = 0;
  111. int size = GetFileVersionInfoSize(fname, &dwHandle);
  112. if (size > 0)
  113. {
  114. BYTE* buffer = new BYTE[size];
  115. memset(buffer, 0, size);
  116. if (GetFileVersionInfo(fname, 0, size, buffer))
  117. {
  118. if (VerQueryValue(buffer, _T("\\"), (LPVOID*)& pVi, (PUINT)& size))
  119. {
  120. pdwFileVersion[0] = HIWORD(pVi->dwFileVersionMS);
  121. pdwFileVersion[1] = LOWORD(pVi->dwFileVersionMS);
  122. pdwFileVersion[2] = HIWORD(pVi->dwFileVersionLS);
  123. pdwFileVersion[3] = LOWORD(pVi->dwFileVersionLS);
  124. pdwProductVerion[0] = HIWORD(pVi->dwProductVersionMS);
  125. pdwProductVerion[1] = LOWORD(pVi->dwProductVersionMS);
  126. pdwProductVerion[2] = HIWORD(pVi->dwProductVersionLS);
  127. pdwProductVerion[3] = LOWORD(pVi->dwProductVersionLS);
  128. delete[] buffer;
  129. return true;
  130. }
  131. }
  132. delete[] buffer;
  133. }
  134. return false;
  135. }
  136. BOOL GetVersion(IN HMODULE hModule, OUT DWORD(&dwFVArray)[4], OUT DWORD(&dwPVArray)[4])
  137. {
  138. TCHAR fname[MAX_PATH];
  139. VS_FIXEDFILEINFO* pVi;
  140. DWORD dwHandle;
  141. if (GetModuleFileName(hModule, fname, MAX_PATH))
  142. {
  143. INT nSize = GetFileVersionInfoSize(fname, &dwHandle);
  144. if (nSize > 0)
  145. {
  146. BYTE* pBuffer = new BYTE[nSize];
  147. memset(pBuffer, 0, nSize);
  148. if (GetFileVersionInfo(fname, 0, nSize, pBuffer))
  149. {
  150. if (VerQueryValue(pBuffer, _T("\\"), (LPVOID*)& pVi, (PUINT)& nSize))
  151. {
  152. dwFVArray[0] = HIWORD(pVi->dwFileVersionMS);
  153. dwFVArray[1] = LOWORD(pVi->dwFileVersionMS);
  154. dwFVArray[2] = HIWORD(pVi->dwFileVersionLS);
  155. dwFVArray[3] = LOWORD(pVi->dwFileVersionLS);
  156. dwPVArray[0] = HIWORD(pVi->dwProductVersionMS);
  157. dwPVArray[1] = LOWORD(pVi->dwProductVersionMS);
  158. dwPVArray[2] = HIWORD(pVi->dwProductVersionLS);
  159. dwPVArray[3] = LOWORD(pVi->dwProductVersionLS);
  160. delete[]pBuffer;
  161. return TRUE;
  162. }
  163. }
  164. if (pBuffer)
  165. delete[]pBuffer;
  166. }
  167. }
  168. return FALSE;
  169. }
  170. WCHAR* ASCII2UNICODE(IN LPCCH lpASCIIStr)
  171. {
  172. if (lpASCIIStr == NULL)
  173. return NULL;
  174. // 获取宽字符字节数;
  175. int cchWideChar = MultiByteToWideChar(CP_ACP, 0, lpASCIIStr, -1, NULL, 0);
  176. if (cchWideChar == 0)
  177. return NULL;
  178. // 转换成宽字符串;
  179. WCHAR* pWideChar = new WCHAR[cchWideChar + 1];
  180. memset(pWideChar, 0, sizeof(WCHAR) * (cchWideChar + 1));
  181. int nWriteNum = MultiByteToWideChar(CP_ACP, 0, lpASCIIStr, -1, pWideChar, cchWideChar);
  182. if (nWriteNum != cchWideChar)
  183. {
  184. if (pWideChar)
  185. delete[] pWideChar;
  186. return NULL;
  187. }
  188. return pWideChar;
  189. }
  190. BOOL UNICODE2UTF8(IN LPWCH lpUNICODEStr, OUT std::string& strResult)
  191. {
  192. if (lpUNICODEStr == NULL)
  193. return FALSE;
  194. // 获取多字节字符字节数;
  195. int cbMultiByte = WideCharToMultiByte(CP_UTF8, 0, lpUNICODEStr, -1, NULL, 0, NULL, NULL);
  196. if (cbMultiByte == 0)
  197. return FALSE;
  198. // 转换成多字节字符;
  199. CHAR* pResult = new CHAR[cbMultiByte];
  200. memset(pResult, 0, cbMultiByte);
  201. int nWriteNum = WideCharToMultiByte(CP_UTF8, 0, lpUNICODEStr, -1, pResult, cbMultiByte, NULL, NULL);
  202. if (nWriteNum != cbMultiByte)
  203. return FALSE;
  204. strResult = pResult;
  205. if (pResult)
  206. delete[] pResult;
  207. return TRUE;
  208. }
  209. BOOL ASCII2UTF8(IN LPCCH lpASCIIStr, OUT std::string& strResult)
  210. {
  211. // 将ASCII字符串转成UNICODE字符串;
  212. WCHAR* pWideChar = ASCII2UNICODE(lpASCIIStr);
  213. if (pWideChar == NULL)
  214. return FALSE;
  215. // 再将UICODE转成UTF8;
  216. BOOL bResult = UNICODE2UTF8(pWideChar, strResult);
  217. if (pWideChar)
  218. delete[] pWideChar;
  219. return bResult;
  220. }
  221. std::string EnCode_UTF8URL(IN const CHAR* pText)
  222. {
  223. std::string tt = "";
  224. std::string dd = "";
  225. ASCII2UTF8(pText, tt);
  226. size_t len = tt.length();
  227. for (size_t i = 0; i < len; i++)
  228. {
  229. if (isalnum((BYTE)tt.at(i)))
  230. {
  231. char tempbuff[2] = { 0 };
  232. sprintf_s(tempbuff, "%c", (BYTE)tt.at(i));
  233. dd.append(tempbuff);
  234. }
  235. else if (isspace((BYTE)tt.at(i)))
  236. {
  237. dd.append("+");
  238. }
  239. else
  240. {
  241. char tempbuff[4];
  242. sprintf_s(tempbuff, "%%%X%X", ((BYTE)tt.at(i)) >> 4, ((BYTE)tt.at(i)) % 16);
  243. dd.append(tempbuff);
  244. }
  245. }
  246. return dd;
  247. }
  248. void EnCode_UTF8URL(IN const CHAR* pText, OUT std::string& strResult)
  249. {
  250. std::string tt = "";
  251. ASCII2UTF8(pText, tt);
  252. size_t len = tt.length();
  253. for (size_t i = 0; i < len; i++)
  254. {
  255. if (isalnum((BYTE)tt.at(i)))
  256. {
  257. char tempbuff[2] = { 0 };
  258. sprintf_s(tempbuff, "%c", (BYTE)tt.at(i));
  259. strResult.append(tempbuff);
  260. }
  261. else if (isspace((BYTE)tt.at(i)))
  262. {
  263. strResult.append("+");
  264. }
  265. else
  266. {
  267. char tempbuff[4];
  268. sprintf_s(tempbuff, "%%%X%X", ((BYTE)tt.at(i)) >> 4, ((BYTE)tt.at(i)) % 16);
  269. strResult.append(tempbuff);
  270. }
  271. }
  272. }
  273. // 通过注册表查找系统当前串口信息;
  274. BOOL GetSysSerialPort(std::vector<std::string>& vtports)
  275. {
  276. HKEY hKey;
  277. LSTATUS lReg = 0;
  278. DWORD dwMaxValLen = 0;
  279. DWORD dwValNum = 0;
  280. lReg = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "HARDWARE\\DEVICEMAP\\SERIALCOMM", 0, KEY_QUERY_VALUE, &hKey);
  281. if (lReg != ERROR_SUCCESS)
  282. {
  283. return FALSE;
  284. }
  285. lReg = RegQueryInfoKeyA(hKey, NULL, NULL, NULL, NULL, NULL, NULL, &dwValNum, &dwMaxValLen, NULL, NULL, NULL);
  286. if (lReg != ERROR_SUCCESS)
  287. {
  288. return FALSE;
  289. }
  290. if (vtports.size())
  291. {
  292. vtports.clear();
  293. }
  294. LPSTR lpValName, lpComNum;
  295. DWORD dwValName, dwValSize = 6;
  296. for (DWORD i = 0; i < dwValNum; i++)
  297. {
  298. dwValName = dwMaxValLen + 1;
  299. dwValSize = 6;
  300. lpValName = (LPSTR)VirtualAlloc(NULL, dwValName, MEM_COMMIT, PAGE_READWRITE);
  301. lReg = RegEnumValueA(hKey, i, lpValName, &dwValName, NULL, NULL, NULL, NULL);
  302. if ((lReg != ERROR_SUCCESS) && (lReg != ERROR_NO_MORE_ITEMS))
  303. {
  304. continue;
  305. }
  306. lpComNum = (LPSTR)VirtualAlloc(NULL, 6, MEM_COMMIT, PAGE_READWRITE);
  307. lReg = RegQueryValueExA(hKey, lpValName, NULL, NULL, (LPBYTE)lpComNum, &dwValSize);
  308. if (lReg != ERROR_SUCCESS)
  309. {
  310. continue;
  311. }
  312. vtports.push_back(lpComNum);
  313. VirtualFree(lpValName, 0, MEM_RELEASE);
  314. VirtualFree(lpComNum, 0, MEM_RELEASE);
  315. }
  316. return TRUE;
  317. }
  318. INT GetMacAddress()
  319. {
  320. HDEVINFO hDevInfo;
  321. DWORD MemberIndex, RequiredSize;
  322. SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
  323. PSP_DEVICE_INTERFACE_DETAIL_DATA DeviceInterfaceDetailData;
  324. INT nTotal = 0;
  325. INT nNICKind = 0;
  326. // 获取设备信息集;
  327. hDevInfo = SetupDiGetClassDevs(&MacClassGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);
  328. if (hDevInfo == INVALID_HANDLE_VALUE)
  329. {
  330. return -1;
  331. }
  332. g_vtMac.clear();
  333. // 枚举设备信息集中所有设备;
  334. DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
  335. for (MemberIndex = 0; SetupDiEnumDeviceInterfaces(hDevInfo, NULL, &MacClassGuid, MemberIndex, &DeviceInterfaceData); MemberIndex++)
  336. {
  337. // 获取接收缓冲区大小,函数返回值为FALSE,GetLastError()=ERROR_INSUFFICIENT_BUFFER;
  338. SetupDiGetDeviceInterfaceDetail(hDevInfo, &DeviceInterfaceData, NULL, 0, &RequiredSize, NULL);
  339. // 申请接收缓冲区;
  340. DeviceInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(RequiredSize);
  341. if ( DeviceInterfaceDetailData == NULL)
  342. continue;
  343. DeviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
  344. // 获取设备细节信息;
  345. if (SetupDiGetDeviceInterfaceDetail(hDevInfo, &DeviceInterfaceData, DeviceInterfaceDetailData, RequiredSize, NULL, NULL))
  346. {
  347. HANDLE hDeviceFile;
  348. BOOL isOK = FALSE;
  349. if (_tcsnicmp(DeviceInterfaceDetailData->DevicePath + 4, TEXT("pci"), 3) != 0)
  350. {
  351. free(DeviceInterfaceDetailData);
  352. DeviceInterfaceDetailData = NULL;
  353. continue;
  354. }
  355. MacAddress tagMacAddress;
  356. tagMacAddress.nNICKind = NIC_PCI;
  357. _stprintf_s(tagMacAddress.szNICKind, _T("%s"), _T("NIC_PCI"));
  358. // 获取设备句柄;
  359. hDeviceFile = CreateFile(DeviceInterfaceDetailData->DevicePath,
  360. 0,
  361. FILE_SHARE_READ | FILE_SHARE_WRITE,
  362. NULL,
  363. OPEN_EXISTING,
  364. 0,
  365. NULL);
  366. if (hDeviceFile != INVALID_HANDLE_VALUE)
  367. {
  368. ULONG dwID;
  369. BYTE ucData[8];
  370. DWORD dwByteRet;
  371. // 获取原生MAC地址;
  372. dwID = OID_802_3_PERMANENT_ADDRESS;
  373. isOK = DeviceIoControl(hDeviceFile, IOCTL_NDIS_QUERY_GLOBAL_STATS, &dwID, sizeof(dwID), ucData, sizeof(ucData), &dwByteRet, NULL);
  374. if (isOK)
  375. {
  376. ++nTotal;
  377. _stprintf_s(tagMacAddress.szDevicePath, _T("%s"), DeviceInterfaceDetailData->DevicePath);
  378. memset(tagMacAddress.szMacAddress, 0, sizeof(TCHAR) * MAX_PATH);
  379. // 将字节数组转换成16进制字符串;
  380. for (DWORD i = 0; i < dwByteRet; i++)
  381. {
  382. _stprintf_s(&tagMacAddress.szMacAddress[i * 3], MAX_PATH - (i * 3), (i != dwByteRet - 1) ? _T("%02X-") : _T("%02X"), ucData[i]);
  383. }
  384. g_vtMac.push_back(tagMacAddress);
  385. }
  386. CloseHandle(hDeviceFile);
  387. }
  388. }
  389. free(DeviceInterfaceDetailData);
  390. DeviceInterfaceDetailData = NULL;
  391. }
  392. SetupDiDestroyDeviceInfoList(hDevInfo);
  393. #if 1
  394. g_strMacs.clear();
  395. std::vector<MacAddress>::iterator it = g_vtMac.begin();
  396. for (; it != g_vtMac.end(); it++)
  397. {
  398. g_strMacs.append(it->szMacAddress);
  399. g_strMacs.append("&");
  400. }
  401. #endif
  402. return nTotal;
  403. }
  404. BOOL IsValidString(LPCTSTR lpszString)
  405. {
  406. if (lpszString == NULL)
  407. return FALSE;
  408. do
  409. {
  410. // ASCII可显示的字符;
  411. if (*lpszString < 32 || *lpszString > 126)
  412. {
  413. return FALSE;
  414. }
  415. } while (*++lpszString);
  416. return TRUE;
  417. }
  418. } // namespace Global