thardware.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #include "thardware.h"
  2. #include <Windows.h>
  3. #include <cstdio>
  4. #include <Iphlpapi.h>
  5. #include <NtDDNdis.h>
  6. #include <string>
  7. #include <vcruntime_string.h>
  8. #pragma comment(lib, "Iphlpapi.lib")
  9. namespace TC {
  10. THardWare::THardWare() {}
  11. static bool GetPhyMacAddress(const char *strServiceName, char *RealMAC)
  12. {
  13. bool bRet = false;
  14. char pstrBuf[512] = {0};
  15. sprintf(pstrBuf, "//./%s", strServiceName);
  16. HANDLE hDev = CreateFileA(pstrBuf,
  17. GENERIC_READ | GENERIC_WRITE,
  18. FILE_SHARE_READ | FILE_SHARE_WRITE,
  19. NULL,
  20. OPEN_EXISTING,
  21. 0,
  22. 0);
  23. if (hDev != INVALID_HANDLE_VALUE) {
  24. int inBuf;
  25. BYTE outBuf[256] = {0};
  26. DWORD BytesReturned;
  27. inBuf = OID_802_3_PERMANENT_ADDRESS;
  28. if (DeviceIoControl(hDev,
  29. IOCTL_NDIS_QUERY_GLOBAL_STATS,
  30. (LPVOID) &inBuf,
  31. 4,
  32. outBuf,
  33. 256,
  34. &BytesReturned,
  35. NULL)) {
  36. char buff[256] = {0};
  37. sprintf(buff,
  38. "%d%d%d%d%d%d",
  39. outBuf[0],
  40. outBuf[1],
  41. outBuf[2],
  42. outBuf[3],
  43. outBuf[4],
  44. outBuf[5]);
  45. bRet = true;
  46. memcpy(RealMAC, buff, strlen(buff));
  47. }
  48. CloseHandle(hDev);
  49. }
  50. return bRet;
  51. }
  52. std::string THardWare::machineCode()
  53. {
  54. char Macstr[256] = {0};
  55. ULONG uSize = 0;
  56. DWORD dwResult = GetAdaptersInfo(NULL, &uSize);
  57. if (dwResult == ERROR_BUFFER_OVERFLOW) {
  58. PIP_ADAPTER_INFO piai1 = (PIP_ADAPTER_INFO) new BYTE[uSize];
  59. PIP_ADAPTER_INFO piai = piai1;
  60. dwResult = GetAdaptersInfo(piai, &uSize);
  61. if (ERROR_SUCCESS == dwResult) {
  62. const char *card1 = "QF9700";
  63. const char *card2 = "RD9700";
  64. while (piai) //获取多个网卡MAC地址
  65. {
  66. //QF9700 RD9700 特殊USB网卡处理
  67. if (strncmp(piai->Description, card1, strlen(card1)) == 0
  68. || strncmp(piai->Description, card2, strlen(card2)) == 0) {
  69. piai = piai->Next;
  70. continue;
  71. }
  72. char mac[32] = {0};
  73. GetPhyMacAddress(piai->AdapterName, mac);
  74. piai = piai->Next;
  75. ::sprintf(Macstr, "%s%s", Macstr, mac); //把多个网卡MAC地址拼接
  76. }
  77. }
  78. delete[] piai1;
  79. }
  80. return std::string(Macstr);
  81. }
  82. } // namespace TC