Advertisement
Guest User

Untitled

a guest
Nov 9th, 2017
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. #include <windows.h>
  3. #include <SafeInt.hxx>
  4.  
  5. #include "SipApiPriv.h"
  6. #include "coredl_.h"
  7.  
  8. HANDLE vhSip = NULL;
  9.  
  10. BOOL TestSIP()
  11. {
  12.     if (vhSip == INVALID_HANDLE_VALUE)
  13.         return FALSE;
  14.     if (vhSip)
  15.         return TRUE;
  16.  
  17.     vhSip = CreateFileW(L"SIP0:", 0, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  18.     return vhSip != INVALID_HANDLE_VALUE;
  19. }
  20.  
  21. void CloseSIP()
  22. {
  23.     if (vhSip) {
  24.         CloseHandle(vhSip);
  25.         vhSip = NULL;
  26.     }
  27. }
  28.  
  29. #ifdef __cplusplus
  30. extern "C" {
  31. #endif
  32.  
  33. // SipEnumIM
  34. int WINAPI SipEnumIM(IMENUMPROC pEnumIMProc)
  35. {
  36.     int res = -1;
  37.     unsigned int count = 0;
  38.     unsigned int bsize = 0;
  39.     IMENUMINFO *aMenuMInfo = NULL;
  40.  
  41.     if (!TestSIP()) {
  42.         SetLastError(ERROR_GEN_FAILURE);
  43.         goto END;
  44.     }
  45.  
  46.     if (!DeviceIoControl(vhSip, 10, 0, 0, &count, 4, NULL, NULL)) {
  47.         SetLastError(ERROR_GEN_FAILURE);
  48.         goto END;
  49.     }
  50.  
  51.     if (!pEnumIMProc) {
  52.         if (count > 0)
  53.             res = count;
  54.         goto END;
  55.     }
  56.  
  57.     if (!safeIntUMul(count, sizeof(IMENUMINFO), &bsize)) {
  58.         SetLastError(ERROR_GEN_FAILURE);
  59.         goto END;
  60.     }
  61.  
  62.     aMenuMInfo = (IMENUMINFO *)LocalAlloc(LMEM_FIXED, bsize);
  63.     if (!aMenuMInfo) {
  64.         SetLastError(ERROR_OUTOFMEMORY);
  65.         return res;
  66.     }
  67.  
  68.     if (!DeviceIoControl(vhSip, 11, 0, 0, aMenuMInfo, bsize, NULL, NULL)) {
  69.         SetLastError(ERROR_GEN_FAILURE);
  70.         goto END;
  71.     }
  72.  
  73.     for (unsigned int i=0; i<count; i++) {
  74.         if (!((pEnumIMProc)(&aMenuMInfo[i])))
  75.             break;
  76.     }
  77.  
  78.     if (count > 0)
  79.         res = count;
  80.  
  81. END:
  82.     if (aMenuMInfo)
  83.         LocalFree(aMenuMInfo);
  84.     return res;
  85. }
  86.  
  87. // SipGetCurrentIM
  88. BOOL WINAPI SipGetCurrentIM(CLSID* pClsid)
  89. {
  90.     if (IsBadPtr(1, (LPBYTE)pClsid, 16)) {
  91.         SetLastError(ERROR_INVALID_PARAMETER);
  92.         return FALSE;
  93.     }
  94.    
  95.     if (TestSIP())
  96.         return DeviceIoControl(vhSip, 4, 0, 0, pClsid, 16, NULL, NULL);
  97.  
  98.     SetLastError(ERROR_GEN_FAILURE);
  99.     return FALSE;
  100. }
  101.  
  102. // SipGetInfo
  103. BOOL WINAPI SipGetInfo(SIPINFO *pSipInfo)
  104. {
  105.     BOOL res = FALSE;
  106.     unsigned int bsize = 0;
  107.     void *tPvItemData = NULL;
  108.     SIPINFO *lSipInfo = NULL;
  109.  
  110.     if (IsBadPtr(1, (LPBYTE)pSipInfo, 48)) {
  111.         SetLastError(ERROR_INVALID_PARAMETER);
  112.         goto END;
  113.     }
  114.  
  115.     if (pSipInfo->cbSize != 48 ||
  116.             (pSipInfo->dwImDataSize && !pSipInfo->pvImData)) {
  117.         SetLastError(ERROR_INVALID_PARAMETER);
  118.         goto END;
  119.     }
  120.  
  121.     if (!TestSIP()) {
  122.         SetLastError(ERROR_GEN_FAILURE);
  123.         goto END;
  124.     }
  125.  
  126.     if (!safeIntUAdd(pSipInfo->cbSize, pSipInfo->dwImDataSize, &bsize)) {
  127.         SetLastError(ERROR_INVALID_PARAMETER);
  128.         goto END;
  129.     }
  130.  
  131.     lSipInfo = (SIPINFO *)LocalAlloc(LMEM_ZEROINIT, bsize);
  132.     if (!lSipInfo) {
  133.         SetLastError(ERROR_OUTOFMEMORY);
  134.         return res;
  135.     }
  136.  
  137.     tPvItemData = pSipInfo->pvImData;
  138.     if (!DeviceIoControl(vhSip, 2, pSipInfo, 4, lSipInfo, bsize, NULL, NULL)) {
  139.         SetLastError(ERROR_GEN_FAILURE);
  140.         goto END;
  141.     }
  142.  
  143.     if (pSipInfo->pvImData != tPvItemData ||
  144.             pSipInfo->cbSize != lSipInfo->cbSize ||
  145.             pSipInfo->dwImDataSize != lSipInfo->dwImDataSize) {
  146.         SetLastError(ERROR_INVALID_PARAMETER);
  147.         goto END;
  148.     }
  149.  
  150.     pSipInfo->fdwFlags = lSipInfo->fdwFlags;
  151.     memcpy(&pSipInfo->rcVisibleDesktop, &lSipInfo->rcVisibleDesktop, 16);
  152.     memcpy(&pSipInfo->rcSipRect, &lSipInfo->rcSipRect, 16);
  153.     memcpy(&pSipInfo->pvImData, &lSipInfo->pvImData, pSipInfo->dwImDataSize);
  154.  
  155. END:
  156.     if (lSipInfo)
  157.         LocalFree(lSipInfo);
  158.     return res;
  159. }
  160.  
  161. // SipRegisterNotification
  162. BOOL WINAPI SipRegisterNotification(HWND hWnd)
  163. {
  164.     if (TestSIP())
  165.         return DeviceIoControl(vhSip, 6, &hWnd, 4, 0, 0, NULL, NULL);
  166.  
  167.     SetLastError(ERROR_GEN_FAILURE);
  168.     return FALSE;
  169. }
  170.  
  171. // SipSetCurrentIM
  172. BOOL WINAPI SipSetCurrentIM(CLSID* pClsid)
  173. {
  174.     if (IsBadPtr(0, (LPBYTE)pClsid, 16)) {
  175.         SetLastError(ERROR_INVALID_PARAMETER);
  176.         return FALSE;
  177.     }
  178.    
  179.     if (TestSIP())
  180.         return DeviceIoControl(vhSip, 5, pClsid, 16, 0, 0, NULL, NULL);
  181.  
  182.     SetLastError(ERROR_GEN_FAILURE);
  183.     return FALSE;
  184. }
  185.  
  186. // SipSetDefaultRect
  187. BOOL WINAPI SipSetDefaultRect(RECT* pRect)
  188. {
  189.     if (IsBadPtr(0, (LPBYTE)pRect, 16)) {
  190.         SetLastError(ERROR_INVALID_PARAMETER);
  191.         return FALSE;
  192.     }
  193.  
  194.     if (TestSIP())
  195.         return DeviceIoControl(vhSip, 7, pRect, 16, 0, 0, NULL, NULL);
  196.  
  197.     SetLastError(ERROR_GEN_FAILURE);
  198.     return FALSE;
  199. }
  200.  
  201. // SipSetInfo
  202. BOOL WINAPI SipSetInfo(SIPINFO *pSipInfo)
  203. {
  204.     BOOL res = FALSE;
  205.     unsigned int bsize = 0;
  206.     void *tPvItemData = NULL;
  207.     SIPINFO *lSipInfo = NULL;
  208.  
  209.     if (IsBadPtr(0, (LPBYTE)pSipInfo, 48)) {
  210.         SetLastError(ERROR_INVALID_PARAMETER);
  211.         goto END;
  212.     }
  213.  
  214.     if (pSipInfo->cbSize != 48 ||
  215.             (pSipInfo->dwImDataSize && !pSipInfo->pvImData)) {
  216.         SetLastError(ERROR_INVALID_PARAMETER);
  217.         goto END;
  218.     }
  219.  
  220.     if (!TestSIP()) {
  221.         SetLastError(ERROR_GEN_FAILURE);
  222.         goto END;
  223.     }
  224.  
  225.     if (!safeIntUAdd(48, pSipInfo->dwImDataSize, &bsize)) {
  226.         SetLastError(ERROR_INVALID_PARAMETER);
  227.         goto END;
  228.     }
  229.  
  230.     lSipInfo = (SIPINFO *)LocalAlloc(LMEM_FIXED, bsize);
  231.     if (!lSipInfo) {
  232.         SetLastError(ERROR_OUTOFMEMORY);
  233.         return res;
  234.     }
  235.  
  236.     memcpy(lSipInfo, pSipInfo, 48);
  237.     lSipInfo->pvImData = NULL;
  238.     memcpy(lSipInfo->pvImData, pSipInfo->pvImData, pSipInfo->dwImDataSize);
  239.  
  240.     res = DeviceIoControl(vhSip, 3, lSipInfo, bsize, 0, 0, NULL, NULL);
  241.  
  242. END:
  243.     if (lSipInfo)
  244.         LocalFree(lSipInfo);
  245.     return res;
  246. }
  247.  
  248. // SipShowIM
  249. BOOL WINAPI SipShowIM(DWORD dwFlag)
  250. {
  251.     if (TestSIP())
  252.         return DeviceIoControl(vhSip, 1, &dwFlag, 4, NULL, 0, NULL, NULL);
  253.  
  254.     SetLastError(ERROR_GEN_FAILURE);
  255.     return FALSE;
  256. }
  257.  
  258. // SipStatus
  259. DWORD WINAPI SipStatus()
  260. {
  261.     return TestSIP() != 0;
  262. }
  263.  
  264. BOOL WINAPI SipImmSetActiveContextNotify(IMENUMINFO IMEnumProc)
  265. {
  266.     if (TestSIP())
  267.         return DeviceIoControl(vhSip, 9, &IMEnumProc, 20, 0, 0, NULL, NULL);
  268.  
  269.     return FALSE;
  270. }
  271.  
  272. #ifdef __cplusplus
  273. }
  274. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement