Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <windows.h>
- #include <SafeInt.hxx>
- #include "SipApiPriv.h"
- #include "coredl_.h"
- HANDLE vhSip = NULL;
- BOOL TestSIP()
- {
- if (vhSip == INVALID_HANDLE_VALUE)
- return FALSE;
- if (vhSip)
- return TRUE;
- vhSip = CreateFileW(L"SIP0:", 0, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
- return vhSip != INVALID_HANDLE_VALUE;
- }
- void CloseSIP()
- {
- if (vhSip) {
- CloseHandle(vhSip);
- vhSip = NULL;
- }
- }
- #ifdef __cplusplus
- extern "C" {
- #endif
- // SipEnumIM
- int WINAPI SipEnumIM(IMENUMPROC pEnumIMProc)
- {
- int res = -1;
- unsigned int count = 0;
- unsigned int bsize = 0;
- IMENUMINFO *aMenuMInfo = NULL;
- if (!TestSIP()) {
- SetLastError(ERROR_GEN_FAILURE);
- goto END;
- }
- if (!DeviceIoControl(vhSip, 10, 0, 0, &count, 4, NULL, NULL)) {
- SetLastError(ERROR_GEN_FAILURE);
- goto END;
- }
- if (!pEnumIMProc) {
- if (count > 0)
- res = count;
- goto END;
- }
- if (!safeIntUMul(count, sizeof(IMENUMINFO), &bsize)) {
- SetLastError(ERROR_GEN_FAILURE);
- goto END;
- }
- aMenuMInfo = (IMENUMINFO *)LocalAlloc(LMEM_FIXED, bsize);
- if (!aMenuMInfo) {
- SetLastError(ERROR_OUTOFMEMORY);
- return res;
- }
- if (!DeviceIoControl(vhSip, 11, 0, 0, aMenuMInfo, bsize, NULL, NULL)) {
- SetLastError(ERROR_GEN_FAILURE);
- goto END;
- }
- for (unsigned int i=0; i<count; i++) {
- if (!((pEnumIMProc)(&aMenuMInfo[i])))
- break;
- }
- if (count > 0)
- res = count;
- END:
- if (aMenuMInfo)
- LocalFree(aMenuMInfo);
- return res;
- }
- // SipGetCurrentIM
- BOOL WINAPI SipGetCurrentIM(CLSID* pClsid)
- {
- if (IsBadPtr(1, (LPBYTE)pClsid, 16)) {
- SetLastError(ERROR_INVALID_PARAMETER);
- return FALSE;
- }
- if (TestSIP())
- return DeviceIoControl(vhSip, 4, 0, 0, pClsid, 16, NULL, NULL);
- SetLastError(ERROR_GEN_FAILURE);
- return FALSE;
- }
- // SipGetInfo
- BOOL WINAPI SipGetInfo(SIPINFO *pSipInfo)
- {
- BOOL res = FALSE;
- unsigned int bsize = 0;
- void *tPvItemData = NULL;
- SIPINFO *lSipInfo = NULL;
- if (IsBadPtr(1, (LPBYTE)pSipInfo, 48)) {
- SetLastError(ERROR_INVALID_PARAMETER);
- goto END;
- }
- if (pSipInfo->cbSize != 48 ||
- (pSipInfo->dwImDataSize && !pSipInfo->pvImData)) {
- SetLastError(ERROR_INVALID_PARAMETER);
- goto END;
- }
- if (!TestSIP()) {
- SetLastError(ERROR_GEN_FAILURE);
- goto END;
- }
- if (!safeIntUAdd(pSipInfo->cbSize, pSipInfo->dwImDataSize, &bsize)) {
- SetLastError(ERROR_INVALID_PARAMETER);
- goto END;
- }
- lSipInfo = (SIPINFO *)LocalAlloc(LMEM_ZEROINIT, bsize);
- if (!lSipInfo) {
- SetLastError(ERROR_OUTOFMEMORY);
- return res;
- }
- tPvItemData = pSipInfo->pvImData;
- if (!DeviceIoControl(vhSip, 2, pSipInfo, 4, lSipInfo, bsize, NULL, NULL)) {
- SetLastError(ERROR_GEN_FAILURE);
- goto END;
- }
- if (pSipInfo->pvImData != tPvItemData ||
- pSipInfo->cbSize != lSipInfo->cbSize ||
- pSipInfo->dwImDataSize != lSipInfo->dwImDataSize) {
- SetLastError(ERROR_INVALID_PARAMETER);
- goto END;
- }
- pSipInfo->fdwFlags = lSipInfo->fdwFlags;
- memcpy(&pSipInfo->rcVisibleDesktop, &lSipInfo->rcVisibleDesktop, 16);
- memcpy(&pSipInfo->rcSipRect, &lSipInfo->rcSipRect, 16);
- memcpy(&pSipInfo->pvImData, &lSipInfo->pvImData, pSipInfo->dwImDataSize);
- END:
- if (lSipInfo)
- LocalFree(lSipInfo);
- return res;
- }
- // SipRegisterNotification
- BOOL WINAPI SipRegisterNotification(HWND hWnd)
- {
- if (TestSIP())
- return DeviceIoControl(vhSip, 6, &hWnd, 4, 0, 0, NULL, NULL);
- SetLastError(ERROR_GEN_FAILURE);
- return FALSE;
- }
- // SipSetCurrentIM
- BOOL WINAPI SipSetCurrentIM(CLSID* pClsid)
- {
- if (IsBadPtr(0, (LPBYTE)pClsid, 16)) {
- SetLastError(ERROR_INVALID_PARAMETER);
- return FALSE;
- }
- if (TestSIP())
- return DeviceIoControl(vhSip, 5, pClsid, 16, 0, 0, NULL, NULL);
- SetLastError(ERROR_GEN_FAILURE);
- return FALSE;
- }
- // SipSetDefaultRect
- BOOL WINAPI SipSetDefaultRect(RECT* pRect)
- {
- if (IsBadPtr(0, (LPBYTE)pRect, 16)) {
- SetLastError(ERROR_INVALID_PARAMETER);
- return FALSE;
- }
- if (TestSIP())
- return DeviceIoControl(vhSip, 7, pRect, 16, 0, 0, NULL, NULL);
- SetLastError(ERROR_GEN_FAILURE);
- return FALSE;
- }
- // SipSetInfo
- BOOL WINAPI SipSetInfo(SIPINFO *pSipInfo)
- {
- BOOL res = FALSE;
- unsigned int bsize = 0;
- void *tPvItemData = NULL;
- SIPINFO *lSipInfo = NULL;
- if (IsBadPtr(0, (LPBYTE)pSipInfo, 48)) {
- SetLastError(ERROR_INVALID_PARAMETER);
- goto END;
- }
- if (pSipInfo->cbSize != 48 ||
- (pSipInfo->dwImDataSize && !pSipInfo->pvImData)) {
- SetLastError(ERROR_INVALID_PARAMETER);
- goto END;
- }
- if (!TestSIP()) {
- SetLastError(ERROR_GEN_FAILURE);
- goto END;
- }
- if (!safeIntUAdd(48, pSipInfo->dwImDataSize, &bsize)) {
- SetLastError(ERROR_INVALID_PARAMETER);
- goto END;
- }
- lSipInfo = (SIPINFO *)LocalAlloc(LMEM_FIXED, bsize);
- if (!lSipInfo) {
- SetLastError(ERROR_OUTOFMEMORY);
- return res;
- }
- memcpy(lSipInfo, pSipInfo, 48);
- lSipInfo->pvImData = NULL;
- memcpy(lSipInfo->pvImData, pSipInfo->pvImData, pSipInfo->dwImDataSize);
- res = DeviceIoControl(vhSip, 3, lSipInfo, bsize, 0, 0, NULL, NULL);
- END:
- if (lSipInfo)
- LocalFree(lSipInfo);
- return res;
- }
- // SipShowIM
- BOOL WINAPI SipShowIM(DWORD dwFlag)
- {
- if (TestSIP())
- return DeviceIoControl(vhSip, 1, &dwFlag, 4, NULL, 0, NULL, NULL);
- SetLastError(ERROR_GEN_FAILURE);
- return FALSE;
- }
- // SipStatus
- DWORD WINAPI SipStatus()
- {
- return TestSIP() != 0;
- }
- BOOL WINAPI SipImmSetActiveContextNotify(IMENUMINFO IMEnumProc)
- {
- if (TestSIP())
- return DeviceIoControl(vhSip, 9, &IMEnumProc, 20, 0, 0, NULL, NULL);
- return FALSE;
- }
- #ifdef __cplusplus
- }
- #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement