Advertisement
Guest User

Untitled

a guest
Nov 20th, 2017
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. #include <windows.h>
  3.  
  4. #include "MicomApi.h"
  5.  
  6. HANDLE vhCom = NULL;
  7. MPacket mReadPac;
  8.  
  9. CBReadMicom fCBReadMicom = NULL;
  10. CBWriteMicom fCBWriteMicom = NULL;
  11.  
  12. BYTE GetCheckSum(BYTE* buffer, BYTE len)
  13. {
  14.     BYTE result = 0;
  15.  
  16.     for (BYTE i=0;i<len;i++)
  17.         result ^= buffer[i];
  18.  
  19.     return result;
  20. }
  21.  
  22. DWORD SendToMicom(BYTE* mes, BYTE len)
  23. {
  24.     DWORD dwBytesWritten = 0;
  25.  
  26.     if (vhCom < 0) return 0;
  27.  
  28.     if (WriteFile(vhCom, mes, len, &dwBytesWritten, NULL))
  29.         Sleep(8);
  30.  
  31.     return dwBytesWritten;
  32. }
  33.  
  34. #ifdef __cplusplus
  35. extern "C" {
  36. #endif
  37.  
  38. HANDLE WINAPI GetMicomHandle()
  39. {
  40.     return vhCom;
  41. }
  42.  
  43. int WINAPI SetCallBackRead(CBReadMicom cbReadMicom)
  44. {
  45.     fCBReadMicom = cbReadMicom;
  46.     return 0;
  47. }
  48.  
  49. int WINAPI SetCallBackWrite(CBWriteMicom cbWriteMicom)
  50. {
  51.     fCBWriteMicom = cbWriteMicom;
  52.     return 0;
  53. }
  54.  
  55. DWORD WINAPI SendCommandEx(BYTE mgr, BYTE cmd, BYTE len, BYTE* buffer)
  56. {
  57.     if (vhCom == NULL) {
  58.         MessageBox(NULL, _T("Non connecté ..."), NULL, MB_OK|MB_ICONERROR);
  59.         return 0;
  60.     }  
  61.  
  62.     BYTE* mes = new BYTE[len + 5];
  63.     mes[0] = 0xAA;
  64.     mes[1] = (mgr << 4) ^ 1;
  65.     mes[2] = cmd;
  66.     mes[3] = len;
  67.     if (len > 0)
  68.         memcpy(&mes[4], buffer, len);
  69.     mes[len + 4] = GetCheckSum(mes, len + 4);
  70.  
  71.     DWORD res = SendToMicom(mes, len + 5);
  72.     delete[] mes;
  73.  
  74.     return res;
  75. }
  76.  
  77. DWORD WINAPI SendReadCmd(BYTE mgr, DWORD addr, BYTE len)
  78. {
  79.     if (vhCom == NULL) {
  80.         MessageBox(NULL, _T("Non connecté ..."), NULL, MB_OK|MB_ICONERROR);
  81.         return 0;
  82.     }
  83.  
  84.     BYTE* mes = new BYTE[9];
  85.     mes[0] = 0xAA;
  86.     mes[1] = (mgr << 4) ^ 5;
  87.     mes[2] = len;
  88.     mes[3] = 4;
  89.     *(DWORD*)&mes[4] = addr;
  90.     mes[8] = GetCheckSum(mes, 8);
  91.  
  92.     DWORD res = SendToMicom(mes, 9);
  93.     delete[] mes;
  94.  
  95.     return res;
  96. }
  97.  
  98. DWORD WINAPI SendWriteCmd(BYTE mgr, DWORD addr, BYTE len, BYTE* buffer)
  99. {
  100.     if (vhCom == NULL) {
  101.         MessageBox(NULL, _T("Non connecté ..."), NULL, MB_OK|MB_ICONERROR);
  102.         return 0;
  103.     }
  104.  
  105.     BYTE* mes = new BYTE[len + 9];
  106.     mes[0] = 0xAA;
  107.     mes[1] = (mgr << 4) ^ 6;
  108.     mes[2] = len;
  109.     mes[3] = len + 4;
  110.     *(DWORD*)&mes[4] = addr;
  111.     if (len > 0)
  112.         memcpy(&mes[8], buffer, len);
  113.     mes[len + 8] = GetCheckSum(mes, len + 8);
  114.  
  115.     DWORD res = SendToMicom(mes, len + 9);
  116.     delete[] mes;
  117.  
  118.     return res;
  119. }
  120.  
  121. //////////////////////////////////////////////////////
  122. // coredll
  123. //////////////////////////////////////////////////////
  124.  
  125. // CreateFileW
  126. HANDLE WINAPI __E__CreateFileW__(
  127.     LPCWSTR lpFileName,
  128.     DWORD dwDesiredAccess,
  129.     DWORD dwShareMode,
  130.     LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  131.     DWORD dwCreationDisposition,
  132.     DWORD dwFlagsAndAttributes,
  133.     HANDLE hTemplateFile
  134.     )
  135. {
  136.     HANDLE h = CreateFileW(lpFileName,
  137.                         dwDesiredAccess,
  138.                         dwShareMode,
  139.                         lpSecurityAttributes,
  140.                         dwCreationDisposition,
  141.                         dwFlagsAndAttributes,
  142.                         hTemplateFile);
  143.  
  144.     if (vhCom == NULL && h != INVALID_HANDLE_VALUE &&
  145.             wcscmp(lpFileName, L"COM2:") == 0) {
  146.         vhCom = h;
  147.         mReadPac.rLen = 0;
  148.     }
  149.  
  150.     return h;
  151. }
  152.  
  153. // ReadFile
  154. BOOL WINAPI __E__ReadFile__(
  155.     HANDLE hFile,
  156.     __out_bcount(nNumberOfBytesToRead) LPVOID lpBuffer,
  157.     DWORD nNumberOfBytesToRead,
  158.     LPDWORD lpNumberOfBytesRead,
  159.     LPOVERLAPPED lpOverlapped
  160.     )
  161. {
  162.     if (hFile == vhCom && fCBReadMicom) {
  163.         BYTE* data = (BYTE*)lpBuffer;
  164.         int res = 0;
  165.  
  166.         if (nNumberOfBytesToRead == 1 && mReadPac.rLen == 0) {
  167.             if (!ReadFile(hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped))
  168.                 return FALSE;
  169.  
  170.             if (data[0] == 0xAA) {
  171.                 mReadPac.rData[mReadPac.rLen] = 0xAA;
  172.                 mReadPac.rLen += *lpNumberOfBytesRead;
  173.             }
  174.         } else if (nNumberOfBytesToRead == 3 && mReadPac.rLen == 1) {
  175.             if (!ReadFile(hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped))
  176.                 return FALSE;
  177.  
  178.             memcpy(&mReadPac.rData[mReadPac.rLen], data, *lpNumberOfBytesRead);
  179.             mReadPac.rLen += *lpNumberOfBytesRead;
  180.  
  181.             mReadPac.mgr = (((mReadPac.rData[1] & 0xf0) >> 4) & 0xf);
  182.             mReadPac.grp = (mReadPac.rData[1] & 0xf);
  183.             mReadPac.cmd = mReadPac.rData[2];
  184.             mReadPac.len = mReadPac.rData[3];
  185.         } else if (mReadPac.rLen > 3) {
  186.             if (!ReadFile(hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped))
  187.                 return FALSE;
  188.  
  189.             memcpy(&mReadPac.rData[mReadPac.rLen], data, *lpNumberOfBytesRead);
  190.             mReadPac.rLen += *lpNumberOfBytesRead;
  191.  
  192.             if (mReadPac.rLen == (mReadPac.len + 5)) {
  193.                 mReadPac.checkSum = mReadPac.rData[mReadPac.rLen - 1];
  194.                 res = fCBReadMicom(&mReadPac);
  195.                 mReadPac.rLen = 0;
  196.  
  197.                 if (res)
  198.                     data[*lpNumberOfBytesRead - 1] += 1;
  199.             }
  200.         }
  201.     }
  202.  
  203.     return TRUE;
  204. }
  205.  
  206. BOOL WINAPI __E__WriteFile__(
  207.     HANDLE hFile,
  208.     __in_bcount(nNumberOfBytesToWrite) LPCVOID lpBuffer,
  209.     DWORD nNumberOfBytesToWrite,
  210.     LPDWORD lpNumberOfBytesWritten,
  211.     LPOVERLAPPED lpOverlapped
  212.     )
  213. {
  214.     if (hFile == vhCom && fCBWriteMicom) {
  215.         BYTE* data = (BYTE*)lpBuffer;
  216.         if (data[0] = 0xAA) {
  217.             MPacket pac;
  218.             pac.rLen = *lpNumberOfBytesWritten;
  219.             pac.rData = data;
  220.  
  221.             pac.mgr = (((pac.rData[1] & 0xf0) >> 4) & 0xf);
  222.             pac.grp = (pac.rData[1] & 0xf);
  223.             pac.cmd = pac.rData[2];
  224.             pac.len = pac.rData[3];
  225.             pac.data = &pac.rData[4];
  226.             pac.checkSum = pac.rData[pac.rLen - 1];
  227.  
  228.             if (fCBWriteMicom(&pac)) {
  229.                 *lpNumberOfBytesWritten = nNumberOfBytesToWrite;
  230.                 return TRUE;
  231.             }
  232.         }
  233.     }
  234.  
  235.     return WriteFile(hFile,
  236.                         lpBuffer,
  237.                         nNumberOfBytesToWrite,
  238.                         lpNumberOfBytesWritten,
  239.                         lpOverlapped);
  240. }
  241.  
  242. BOOL WINAPI __E__CloseHandle__(HANDLE hObject)
  243. {
  244.     if (vhCom == hObject)
  245.         vhCom = NULL;
  246.  
  247.     return CloseHandle(hObject);
  248. }
  249.  
  250. #ifdef __cplusplus
  251. }
  252. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement