GAT.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. #include "stdafx.h"
  2. #include "GAT.h"
  3. #include <winioctl.h>
  4. static GUID UsbClassGuid = { 0xA5DCBF10L, 0x6530, 0x11D2,{ 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED } };
  5. static GUID MacClassGuid = { 0xAD498944, 0x762F, 0x11D0, { 0x8D, 0xCB, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C } };
  6. GuardAgainstTheft::GuardAgainstTheft()
  7. {
  8. }
  9. GuardAgainstTheft::~GuardAgainstTheft()
  10. {
  11. }
  12. BOOL GuardAgainstTheft::FindYtUSB()
  13. {
  14. GetMac();
  15. HDEVINFO hDevInfo;
  16. INT iTotal = 0;
  17. // 获取设备信息集;
  18. hDevInfo = SetupDiGetClassDevs(&UsbClassGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);
  19. if ( hDevInfo == INVALID_HANDLE_VALUE )
  20. {
  21. return -1;
  22. }
  23. DWORD dwSize = 0;
  24. TCHAR szDIS[MAX_PATH] = {0};
  25. SP_DEVINFO_DATA DeviceInfoData;
  26. ZeroMemory(&DeviceInfoData, sizeof(SP_DEVINFO_DATA));
  27. DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
  28. for (int i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); i++)
  29. {
  30. dwSize = 0;
  31. if ( !SetupDiGetDeviceInstanceId(hDevInfo, &DeviceInfoData, szDIS, sizeof(szDIS), &dwSize))
  32. {
  33. // 获取设备识别字符串失败;
  34. break;
  35. }
  36. // 设备识别串的前三个字符是否是"USB", 模板: USB\VID_XXXX&PID_XXXX\00000xxxxxxx;
  37. CString strDIS(szDIS);
  38. strDIS.MakeLower();
  39. if (strDIS.Left(32) == _T("usb\\vid_1312&pid_1912\\5&3b0d2cff") )
  40. {
  41. g_bExistSpecialUsb = TRUE;
  42. break;
  43. }
  44. }
  45. SetupDiDestroyDeviceInfoList(hDevInfo);
  46. return TRUE;
  47. }
  48. BOOL GuardAgainstTheft::GetMac()
  49. {
  50. HDEVINFO hDevInfo;
  51. DWORD MemberIndex, RequiredSize;
  52. SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
  53. PSP_DEVICE_INTERFACE_DETAIL_DATA DeviceInterfaceDetailData;
  54. INT iTotal = 0;
  55. // 获取设备信息集;
  56. hDevInfo = SetupDiGetClassDevs(&MacClassGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);
  57. if (hDevInfo == INVALID_HANDLE_VALUE)
  58. {
  59. return -1;
  60. }
  61. // 枚举设备信息集中所有设备;
  62. DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
  63. for (MemberIndex = 0; SetupDiEnumDeviceInterfaces(hDevInfo, NULL, &MacClassGuid, MemberIndex, &DeviceInterfaceData); MemberIndex++)
  64. {
  65. // 获取接收缓冲区大小,函数返回值为FALSE,GetLastError()=ERROR_INSUFFICIENT_BUFFER;
  66. SetupDiGetDeviceInterfaceDetail(hDevInfo, &DeviceInterfaceData, NULL, 0, &RequiredSize, NULL);
  67. // 申请接收缓冲区;
  68. DeviceInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(RequiredSize);
  69. DeviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
  70. // 获取设备细节信息;
  71. if (SetupDiGetDeviceInterfaceDetail(hDevInfo, &DeviceInterfaceData, DeviceInterfaceDetailData, RequiredSize, NULL, NULL))
  72. {
  73. if ( WDK_GetMacAddress(DeviceInterfaceDetailData->DevicePath, g_szMacAddress, MAX_PATH, TRUE) )
  74. {
  75. if ( g_szMacAddress[0] == _T('\0') )
  76. continue;
  77. else
  78. break;
  79. }
  80. }
  81. free(DeviceInterfaceDetailData);
  82. }
  83. SetupDiDestroyDeviceInfoList(hDevInfo);
  84. return iTotal;
  85. }
  86. BOOL GuardAgainstTheft::GetMac(IN CStringArray& AryMac)
  87. {
  88. HDEVINFO hDevInfo;
  89. DWORD MemberIndex, RequiredSize;
  90. SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
  91. PSP_DEVICE_INTERFACE_DETAIL_DATA DeviceInterfaceDetailData;
  92. INT iTotal = 0;
  93. // 获取设备信息集;
  94. hDevInfo = SetupDiGetClassDevs(&MacClassGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);
  95. if (hDevInfo == INVALID_HANDLE_VALUE)
  96. {
  97. return -1;
  98. }
  99. TCHAR szMacAddress[MAX_PATH] = {0};
  100. // 枚举设备信息集中所有设备;
  101. DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
  102. for (MemberIndex = 0; SetupDiEnumDeviceInterfaces(hDevInfo, NULL, &MacClassGuid, MemberIndex, &DeviceInterfaceData); MemberIndex++)
  103. {
  104. // 获取接收缓冲区大小,函数返回值为FALSE,GetLastError()=ERROR_INSUFFICIENT_BUFFER;
  105. SetupDiGetDeviceInterfaceDetail(hDevInfo, &DeviceInterfaceData, NULL, 0, &RequiredSize, NULL);
  106. // 申请接收缓冲区;
  107. DeviceInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(RequiredSize);
  108. DeviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
  109. // 获取设备细节信息;
  110. if (SetupDiGetDeviceInterfaceDetail(hDevInfo, &DeviceInterfaceData, DeviceInterfaceDetailData, RequiredSize, NULL, NULL))
  111. {
  112. if ( WDK_GetMacAddress(DeviceInterfaceDetailData->DevicePath, szMacAddress, MAX_PATH, TRUE) )
  113. {
  114. AfxMessageBox(szMacAddress);
  115. }
  116. }
  117. free(DeviceInterfaceDetailData);
  118. }
  119. SetupDiDestroyDeviceInfoList(hDevInfo);
  120. return iTotal;
  121. }
  122. // 获取网卡原生MAC地址;
  123. BOOL GuardAgainstTheft::WDK_GetMacAddress( TCHAR* DevicePath, TCHAR* szMacAddress, UINT uSize, BOOL isIncludeUSB )
  124. {
  125. HANDLE hDeviceFile;
  126. BOOL isOK = FALSE;
  127. // 剔除虚拟网卡;
  128. if( _tcsnicmp( DevicePath + 4, TEXT("root"), 4 ) == 0 )
  129. {
  130. return FALSE;
  131. }
  132. if( !isIncludeUSB )
  133. { // 剔除USB网卡;
  134. if( _tcsnicmp( DevicePath + 4, TEXT("usb"), 4 ) == 0 )
  135. {
  136. return FALSE;
  137. }
  138. }
  139. // 获取设备句柄;
  140. hDeviceFile = CreateFile( DevicePath,
  141. 0,
  142. FILE_SHARE_READ | FILE_SHARE_WRITE,
  143. NULL,
  144. OPEN_EXISTING,
  145. 0,
  146. NULL);
  147. if( hDeviceFile != INVALID_HANDLE_VALUE )
  148. {
  149. ULONG dwID;
  150. BYTE ucData[8];
  151. DWORD dwByteRet;
  152. // 获取原生MAC地址;
  153. dwID = OID_802_3_PERMANENT_ADDRESS;
  154. isOK = DeviceIoControl( hDeviceFile, IOCTL_NDIS_QUERY_GLOBAL_STATS, &dwID, sizeof(dwID), ucData, sizeof(ucData), &dwByteRet, NULL );
  155. if( isOK )
  156. {
  157. if( szMacAddress != NULL )
  158. { // 将字节数组转换成16进制字符串;
  159. for( DWORD i = 0; i < dwByteRet; i++ )
  160. {
  161. _stprintf_s( szMacAddress + (i << 1), uSize - (i << 1), TEXT("%02X"), ucData[i] );
  162. }
  163. }
  164. }
  165. CloseHandle( hDeviceFile );
  166. }
  167. return isOK;
  168. }