SHARE
TWEET

Untitled

a guest Oct 8th, 2014 713 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <sstream>
  2. #include <string>
  3. #include <Windows.h>
  4. #include <hidsdi.h>
  5. #include <setupapi.h>
  6. #include <cfgmgr32.h>
  7.  
  8. static unsigned char Black_1[] =
  9. {
  10.         0x00, 0x7F, 0x01, 0x3C, 0x00, 0x77, 0x77, 0x77,
  11.         0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
  12.         0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
  13.         0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
  14.         0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
  15.         0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
  16.         0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
  17.         0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
  18.         0x77
  19. };
  20.  
  21. static unsigned char Black_2[] =
  22. {
  23.         0x00, 0x7F, 0x02, 0x3C, 0x00, 0x77, 0x77, 0x77,
  24.         0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
  25.         0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
  26.         0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
  27.         0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
  28.         0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
  29.         0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
  30.         0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
  31.         0x77
  32. };
  33.  
  34. static unsigned char Black_3[] =
  35. {
  36.         0x00, 0x7F, 0x03, 0x3C, 0x00, 0x77, 0x77, 0x77,
  37.         0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
  38.         0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
  39.         0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
  40.         0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
  41.         0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
  42.         0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
  43.         0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
  44.         0x77
  45. };
  46.  
  47. static unsigned char Black_4[] =
  48. {
  49.         0x00, 0x7F, 0x04, 0x24, 0x00, 0x77, 0x77, 0x77,
  50.         0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
  51.         0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
  52.         0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
  53.         0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
  54.         0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  55.         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  56.         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  57.         0x00
  58. };
  59.  
  60. static unsigned char Flush_1[] =
  61. {
  62.         0x00, 0x07, 0x27, 0x00, 0x00, 0xD8, 0x00, 0x00,
  63.         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  64.         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  65.         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  66.         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  67.         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  68.         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  69.         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  70.         0x00
  71. };
  72.  
  73. bool IsMatchingDevice(wchar_t *pDeviceID, unsigned int uiVID, unsigned int uiPID, unsigned int uiMI)
  74. {
  75.         unsigned int uiLocalVID = 0, uiLocalPID = 0, uiLocalMI = 0;
  76.  
  77.         LPWSTR pszNextToken = 0;
  78.         LPWSTR pszToken = wcstok_s(pDeviceID, L"\\#&", &pszNextToken);
  79.         while (pszToken)
  80.         {
  81.                 std::wstring tokenStr(pszToken);
  82.                 if (tokenStr.find(L"VID_", 0, 4) != std::wstring::npos)
  83.                 {
  84.                         std::wistringstream iss(tokenStr.substr(4));
  85.                         iss >> std::hex >> uiLocalVID;
  86.                 }
  87.                 else if (tokenStr.find(L"PID_", 0, 4) != std::wstring::npos)
  88.                 {
  89.                         std::wistringstream iss(tokenStr.substr(4));
  90.                         iss >> std::hex >> uiLocalPID;
  91.                 }
  92.                 else if (tokenStr.find(L"MI_", 0, 3) != std::wstring::npos)
  93.                 {
  94.                         std::wistringstream iss(tokenStr.substr(3));
  95.                         iss >> std::hex >> uiLocalMI;
  96.                 }
  97.  
  98.                 pszToken = wcstok_s(0, L"\\#&", &pszNextToken);
  99.         }
  100.  
  101.         if (uiVID != uiLocalVID || uiPID != uiLocalPID || uiMI != uiLocalMI)
  102.                 return false;
  103.  
  104.         return true;
  105. }
  106.  
  107. HANDLE GetDeviceHandle(unsigned int uiVID, unsigned int uiPID, unsigned int uiMI)
  108. {
  109.         const GUID GUID_DEVINTERFACE_HID = { 0x4D1E55B2L, 0xF16F, 0x11CF, 0x88, 0xCB, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30 };
  110.         HDEVINFO hDevInfo = SetupDiGetClassDevs(&GUID_DEVINTERFACE_HID, 0, 0, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
  111.         if (hDevInfo == INVALID_HANDLE_VALUE)
  112.                 return 0;
  113.  
  114.         HANDLE hReturn = 0;
  115.  
  116.         SP_DEVINFO_DATA deviceData = { 0 };
  117.         deviceData.cbSize = sizeof(SP_DEVINFO_DATA);
  118.  
  119.         for (unsigned int i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &deviceData); ++i)
  120.         {
  121.                 wchar_t wszDeviceID[MAX_DEVICE_ID_LEN];
  122.                 if (CM_Get_Device_ID(deviceData.DevInst, wszDeviceID, MAX_DEVICE_ID_LEN, 0))
  123.                         continue;
  124.  
  125.                 if (!IsMatchingDevice(wszDeviceID, uiVID, uiPID, uiMI))
  126.                         continue;
  127.  
  128.                 SP_INTERFACE_DEVICE_DATA interfaceData = { 0 };
  129.                 interfaceData.cbSize = sizeof(SP_INTERFACE_DEVICE_DATA);
  130.  
  131.                 if (!SetupDiEnumDeviceInterfaces(hDevInfo, &deviceData, &GUID_DEVINTERFACE_HID, 0, &interfaceData))
  132.                         break;
  133.  
  134.                 DWORD dwRequiredSize = 0;
  135.                 SetupDiGetDeviceInterfaceDetail(hDevInfo, &interfaceData, 0, 0, &dwRequiredSize, 0);
  136.  
  137.                 SP_INTERFACE_DEVICE_DETAIL_DATA *pData = (SP_INTERFACE_DEVICE_DETAIL_DATA *)new unsigned char[dwRequiredSize];
  138.                 pData->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
  139.  
  140.                 if (!SetupDiGetDeviceInterfaceDetail(hDevInfo, &interfaceData, pData, dwRequiredSize, 0, 0))
  141.                 {
  142.                         delete pData;
  143.                         break;
  144.                 }
  145.  
  146.                 HANDLE hDevice = CreateFile(pData->DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
  147.                 if (hDevice == INVALID_HANDLE_VALUE)
  148.                 {
  149.                         delete pData;
  150.                         break;
  151.                 }
  152.  
  153.                 hReturn = hDevice;
  154.                 break;
  155.         }
  156.  
  157.         SetupDiDestroyDeviceInfoList(hDevInfo);
  158.  
  159.         return hReturn;
  160. }
  161.  
  162. int main(void)
  163. {
  164.         HANDLE hDevice = GetDeviceHandle(0x1B1C, 0x1B13, 0x3);
  165.         if (!hDevice)
  166.                 return 1;
  167.  
  168.         for (unsigned int i = 0; i < 60; ++i)
  169.         {
  170.                 Black_2[i + 5] = 0x07;
  171.  
  172.                 HidD_SetFeature(hDevice, Black_1, sizeof(Black_1));
  173.                 HidD_SetFeature(hDevice, Black_2, sizeof(Black_2));
  174.                 HidD_SetFeature(hDevice, Black_3, sizeof(Black_3));
  175.                 HidD_SetFeature(hDevice, Black_4, sizeof(Black_4));
  176.                 HidD_SetFeature(hDevice, Flush_1, sizeof(Flush_1));
  177.  
  178.                 printf("Changed byte %i, key 1.\n", i);
  179.  
  180.                 Sleep(200);
  181.  
  182.                 Black_2[i + 5] = 0x70;
  183.  
  184.                 HidD_SetFeature(hDevice, Black_1, sizeof(Black_1));
  185.                 HidD_SetFeature(hDevice, Black_2, sizeof(Black_2));
  186.                 HidD_SetFeature(hDevice, Black_3, sizeof(Black_3));
  187.                 HidD_SetFeature(hDevice, Black_4, sizeof(Black_4));
  188.                 HidD_SetFeature(hDevice, Flush_1, sizeof(Flush_1));
  189.  
  190.                 printf("Changed byte %i, key 2.\n", i);
  191.  
  192.                 Sleep(200);
  193.  
  194.                 Black_2[i + 5] = 0x77;
  195.         }
  196.  
  197.         CloseHandle(hDevice);
  198.  
  199.         return 0;
  200. }
RAW Paste Data
Top