diff options
Diffstat (limited to 'protocols/WhatsApp/src/main.cpp')
-rw-r--r-- | protocols/WhatsApp/src/main.cpp | 141 |
1 files changed, 140 insertions, 1 deletions
diff --git a/protocols/WhatsApp/src/main.cpp b/protocols/WhatsApp/src/main.cpp index d2f45c7fdf..e602ea63e1 100644 --- a/protocols/WhatsApp/src/main.cpp +++ b/protocols/WhatsApp/src/main.cpp @@ -11,7 +11,7 @@ PLUGININFOEX pluginInfo = { sizeof(PLUGININFOEX),
"WhatsApp Protocol",
__VERSION_DWORD,
- "Provides basic support for WhatsApp. [Built: "__DATE__" "__TIME__"]",
+ "Provides basic support for WhatsApp.",
"Uli Hecht",
"uli.hecht@gmail.com",
"© 2013 Uli Hecht",
@@ -22,6 +22,137 @@ PLUGININFOEX pluginInfo = { };
+BOOL IsRunAsAdmin()
+{
+ BOOL fIsRunAsAdmin = FALSE;
+ DWORD dwError = ERROR_SUCCESS;
+ PSID pAdministratorsGroup = NULL;
+
+ // Allocate and initialize a SID of the administrators group.
+ SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
+ if ( !AllocateAndInitializeSid(
+ &NtAuthority,
+ 2,
+ SECURITY_BUILTIN_DOMAIN_RID,
+ DOMAIN_ALIAS_RID_ADMINS,
+ 0, 0, 0, 0, 0, 0,
+ &pAdministratorsGroup))
+ {
+ dwError = GetLastError();
+ goto Cleanup;
+ }
+
+ // Determine whether the SID of administrators group is enabled in
+ // the primary access token of the process.
+ if ( !CheckTokenMembership(NULL, pAdministratorsGroup, &fIsRunAsAdmin))
+ {
+ dwError = GetLastError();
+ goto Cleanup;
+ }
+
+Cleanup:
+ // Centralized cleanup for all allocated resources.
+ if (pAdministratorsGroup)
+ {
+ FreeSid(pAdministratorsGroup);
+ pAdministratorsGroup = NULL;
+ }
+
+ // Throw the error if something failed in the function.
+ if (ERROR_SUCCESS != dwError)
+ {
+ throw dwError;
+ }
+
+ return fIsRunAsAdmin;
+}
+
+int UnpackRegisterUtility(HINSTANCE hInstance, const wchar_t *profileName)
+{
+ wchar_t fileName[MAX_PATH];
+ ::GetModuleFileName(hInstance, fileName, MAX_PATH);
+
+ wchar_t *RegisterUtilityPath = ::wcsrchr(fileName, '\\');
+ if (RegisterUtilityPath != NULL)
+ *RegisterUtilityPath = 0;
+ ::mir_snwprintf(fileName, SIZEOF(fileName), L"%s\\%s", fileName, L"WART-1.5.0.0.exe");
+ if ( ::GetFileAttributes(fileName) == DWORD(-1))
+ {
+ HRSRC hRes = ::FindResource(hInstance, MAKEINTRESOURCE(IDR_REGISTERUTILITY), L"BIN");
+ if (hRes)
+ {
+ HGLOBAL hResource = ::LoadResource(hInstance, hRes);
+ if (hResource)
+ {
+ HANDLE hFile;
+ char *pData = (char *)LockResource(hResource);
+ DWORD dwSize = SizeofResource(hInstance, hRes), written = 0;
+ if ((hFile = ::CreateFile(
+ fileName,
+ GENERIC_WRITE,
+ 0,
+ NULL,
+ CREATE_ALWAYS,
+ FILE_ATTRIBUTE_NORMAL,
+ 0)) != INVALID_HANDLE_VALUE)
+ {
+ ::WriteFile(hFile, (void *)pData, dwSize, &written, NULL);
+ ::CloseHandle(hFile);
+ }
+ else
+ {
+ // Check the current process's "run as administrator" status.
+ // Elevate the process if it is not run as administrator.
+ if (!IsRunAsAdmin())
+ {
+ wchar_t path[MAX_PATH], cmdLine[100];
+ ::GetModuleFileName(NULL, path, ARRAYSIZE(path));
+
+ if (profileName)
+ ::mir_snwprintf(
+ cmdLine,
+ SIZEOF(cmdLine),
+ L" /restart:%d /profile=%s",
+ ::GetCurrentProcessId(),
+ profileName);
+ else
+ ::mir_snwprintf(
+ cmdLine,
+ SIZEOF(cmdLine),
+ L" /restart:%d",
+ ::GetCurrentProcessId());
+
+ // Launch itself as administrator.
+ SHELLEXECUTEINFO sei = { sizeof(sei) };
+ sei.lpVerb = L"runas";
+ sei.lpFile = path;
+ sei.lpParameters = cmdLine;
+ //sei.hwnd = hDlg;
+ sei.nShow = SW_NORMAL;
+
+ if ( !::ShellExecuteEx(&sei))
+ {
+ DWORD dwError = ::GetLastError();
+ if (dwError == ERROR_CANCELLED)
+ {
+ // The user refused to allow privileges elevation.
+ // Do nothing ...
+ }
+ }
+ }
+ else
+ return 0;
+ }
+ }
+ else
+ return 0;
+ }
+ else
+ return 0;
+ }
+
+ return 1;
+}
/////////////////////////////////////////////////////////////////////////////
// Protocol instances
@@ -69,6 +200,14 @@ static HANDLE g_hEvents[1]; extern "C" int __declspec(dllexport) Load(void)
{
+ VARST profilename( _T("%miranda_profilename%"));
+
+ if ( !UnpackRegisterUtility(g_hInstance, (TCHAR *)profilename))
+ {
+ ::MessageBox(NULL, TranslateT("Did not unpack registration utility WART-1.5.0.0.exe."), _T("WhatsApp"), MB_OK | MB_ICONERROR);
+ return 1;
+ }
+
mir_getLP(&pluginInfo);
mir_getCLI();
|