diff options
Diffstat (limited to 'plugins/!Deprecated/Skype/src/skype.cpp')
-rw-r--r-- | plugins/!Deprecated/Skype/src/skype.cpp | 213 |
1 files changed, 213 insertions, 0 deletions
diff --git a/plugins/!Deprecated/Skype/src/skype.cpp b/plugins/!Deprecated/Skype/src/skype.cpp new file mode 100644 index 0000000000..0416d8f473 --- /dev/null +++ b/plugins/!Deprecated/Skype/src/skype.cpp @@ -0,0 +1,213 @@ +#include "skype.h"
+
+int hLangpack;
+HINSTANCE g_hInstance;
+
+TIME_API tmi = {0};
+
+int g_cbCountries;
+struct CountryListEntry* g_countries;
+
+PLUGININFOEX pluginInfo =
+{
+ sizeof(PLUGININFOEX),
+ __PLUGIN_NAME,
+ PLUGIN_MAKE_VERSION(__MAJOR_VERSION, __MINOR_VERSION, __RELEASE_NUM, __BUILD_NUM),
+ __DESCRIPTION,
+ __AUTHOR,
+ __AUTHOREMAIL,
+ __COPYRIGHT,
+ __AUTHORWEB,
+ UNICODE_AWARE,
+ // {9C448C61-FC3F-42F9-B9F0-4A30E1CF8671}
+ {0x9c448c61, 0xfc3f, 0x42f9, {0xb9, 0xf0, 0x4a, 0x30, 0xe1, 0xcf, 0x86, 0x71}}
+};
+
+DWORD WINAPI DllMain(HINSTANCE hInstance, DWORD, LPVOID)
+{
+ g_hInstance = hInstance;
+
+ return TRUE;
+}
+
+extern "C" __declspec(dllexport) PLUGININFOEX* MirandaPluginInfoEx(DWORD mirandaVersion)
+{
+ return &pluginInfo;
+}
+
+extern "C" __declspec(dllexport) const MUUID MirandaInterfaces[] = {MIID_PROTOCOL, MIID_LAST};
+
+// ---
+
+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 UnpackSkypeRuntime(HINSTANCE hInstance, const wchar_t *profileName)
+{
+ wchar_t fileName[MAX_PATH];
+ ::GetModuleFileName(hInstance, fileName, MAX_PATH);
+
+ wchar_t *skypeKitPath = ::wcsrchr(fileName, '\\');
+ if (skypeKitPath != NULL)
+ *skypeKitPath = 0;
+ ::mir_snwprintf(fileName, SIZEOF(fileName), L"%s\\%s", fileName, L"SkypeKit.exe");
+ if ( ::GetFileAttributes(fileName) == DWORD(-1))
+ {
+ HRSRC hRes = ::FindResource(hInstance, MAKEINTRESOURCE(IDR_RUNTIME), 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;
+}
+
+// ---
+
+extern "C" int __declspec(dllexport) Load(void)
+{
+ VARST profilename( _T("%miranda_profilename%"));
+
+ if ( !UnpackSkypeRuntime(g_hInstance, (TCHAR *)profilename))
+ {
+ ::MessageBox(NULL, TranslateT("Did not unpack SkypeKit.exe."), _T(MODULE), MB_OK | MB_ICONERROR);
+ return 1;
+ }
+
+ mir_getTMI(&tmi);
+ mir_getLP(&pluginInfo);
+
+ PROTOCOLDESCRIPTOR pd = { sizeof(pd) };
+ pd.szName = "SKYPE";
+ pd.type = PROTOTYPE_PROTOCOL;
+ pd.fnInit = (pfnInitProto)CSkypeProto::InitSkypeProto;
+ pd.fnUninit = (pfnUninitProto)CSkypeProto::UninitSkypeProto;
+ CallService(MS_PROTO_REGISTERMODULE, 0, (LPARAM)&pd);
+
+ CallService(MS_UTILS_GETCOUNTRYLIST, (WPARAM)&g_cbCountries, (LPARAM)&g_countries);
+
+ CSkypeProto::InitIcons();
+ CSkypeProto::InitMenus();
+ CSkypeProto::InitHookList();
+ CSkypeProto::InitLanguages();
+ CSkypeProto::InitServiceList();
+
+ return 0;
+}
+
+extern "C" int __declspec(dllexport) Unload(void)
+{
+ CSkypeProto::UninitIcons();
+ CSkypeProto::UninitMenus();
+ CSkypeProto::UninitInstances();
+ return 0;
+}
\ No newline at end of file |