From 756c6e169bb748536a8c2f92f4b281ac480f481b Mon Sep 17 00:00:00 2001 From: Kirill Volinsky Date: Tue, 1 Oct 2013 19:32:03 +0000 Subject: added utility for accounts registration git-svn-id: http://svn.miranda-ng.org/main/trunk@6292 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- protocols/WhatsApp/src/main.cpp | 141 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 140 insertions(+), 1 deletion(-) (limited to 'protocols/WhatsApp/src/main.cpp') 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(); -- cgit v1.2.3