From 9c32e9a999c2a0d86133b1fca16f75fe10672136 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Tue, 5 Feb 2013 21:49:35 +0000 Subject: experimental version of PU that can handle UAC correctly git-svn-id: http://svn.miranda-ng.org/main/trunk@3445 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/PluginUpdater/pu_stub/pu_stub.cpp | 122 +++++++++++++++++ plugins/PluginUpdater/pu_stub/pu_stub_10.vcxproj | 143 ++++++++++++++++++++ .../pu_stub/pu_stub_10.vcxproj.filters | 14 ++ plugins/PluginUpdater/pu_stub/pu_stub_11.vcxproj | 147 +++++++++++++++++++++ .../pu_stub/pu_stub_11.vcxproj.filters | 14 ++ 5 files changed, 440 insertions(+) create mode 100644 plugins/PluginUpdater/pu_stub/pu_stub.cpp create mode 100644 plugins/PluginUpdater/pu_stub/pu_stub_10.vcxproj create mode 100644 plugins/PluginUpdater/pu_stub/pu_stub_10.vcxproj.filters create mode 100644 plugins/PluginUpdater/pu_stub/pu_stub_11.vcxproj create mode 100644 plugins/PluginUpdater/pu_stub/pu_stub_11.vcxproj.filters (limited to 'plugins/PluginUpdater/pu_stub') diff --git a/plugins/PluginUpdater/pu_stub/pu_stub.cpp b/plugins/PluginUpdater/pu_stub/pu_stub.cpp new file mode 100644 index 0000000000..73a1f4146c --- /dev/null +++ b/plugins/PluginUpdater/pu_stub/pu_stub.cpp @@ -0,0 +1,122 @@ +#define _CRT_SECURE_NO_WARNINGS + +#define WIN32_LEAN_AND_MEAN +#include + +// C RunTime Header Files +#include +#include +#include +#include +#include +#include + +// Global Variables: +HINSTANCE hInst; // current instance + +void log(const TCHAR *tszFormat, ...) +{ + FILE *out = fopen("c:\\temp\\pu.log", "a"); + if (out) { + va_list params; + va_start(params, &tszFormat); + _vftprintf(out, tszFormat, params); + va_end(params); + fputc('\n', out); + fclose(out); + } +} + +int CreateDirectoryTreeW(const WCHAR* szDir) +{ + DWORD dwAttributes; + WCHAR* pszLastBackslash, szTestDir[ MAX_PATH ]; + + lstrcpynW(szTestDir, szDir, MAX_PATH); + if ((dwAttributes = GetFileAttributesW(szTestDir)) != INVALID_FILE_ATTRIBUTES && (dwAttributes & FILE_ATTRIBUTE_DIRECTORY)) + return 0; + + pszLastBackslash = wcsrchr(szTestDir, '\\'); + if (pszLastBackslash == NULL) + return 0; + + *pszLastBackslash = '\0'; + CreateDirectoryTreeW(szTestDir); + *pszLastBackslash = '\\'; + return (CreateDirectoryW(szTestDir, NULL) == 0) ? GetLastError() : 0; +} + +void CreatePathToFileW(WCHAR* wszFilePath) +{ + WCHAR* pszLastBackslash = wcsrchr(wszFilePath, '\\'); + if (pszLastBackslash == NULL) + return; + + *pszLastBackslash = '\0'; + CreateDirectoryTreeW(wszFilePath); + *pszLastBackslash = '\\'; +} + +int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR lpCmdLine, int) +{ + DWORD dwError; + hInst = hInstance; + + TCHAR tszPipeName[MAX_PATH]; + _stprintf_s(tszPipeName, MAX_PATH, _T("\\\\.\\pipe\\Miranda_Pu_%s"), lpCmdLine); + log( L"Opening pipe %s...", tszPipeName); + HANDLE hPipe = CreateFile(tszPipeName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); + if (hPipe == INVALID_HANDLE_VALUE) { + dwError = GetLastError(); + log( L"Failed to open a pipe: error %d", dwError); + return dwError; + } + + log( L"Entering the reading cycle..."); + + BYTE szReadBuffer[1024]; + DWORD dwBytes; + while ( ReadFile(hPipe, szReadBuffer, sizeof(szReadBuffer), &dwBytes, NULL)) { + DWORD dwAction = *(DWORD*)szReadBuffer; + TCHAR *ptszFile1 = (TCHAR*)(szReadBuffer + sizeof(DWORD)); + TCHAR *ptszFile2 = ptszFile1 + _tcslen(ptszFile1)+1; + log( L"Received command: %d <%s> <%s>", dwAction, ptszFile1, ptszFile2); + switch(dwAction) { + case 1: // copy + dwError = CopyFile(ptszFile1, ptszFile2, FALSE); + break; + + case 2: // move + DeleteFile(ptszFile2); + if ( MoveFile(ptszFile1, ptszFile2) == 0) // use copy on error + dwError = CopyFile(ptszFile1, ptszFile2, FALSE); + else + dwError = 0; + DeleteFile(ptszFile1); + break; + + case 3: // erase + dwError = DeleteFile(ptszFile1); + break; + + case 4: // create dir + dwError = CreateDirectoryTreeW(ptszFile1); + break; + + case 5: // create path to file + CreatePathToFileW(ptszFile1); + dwError = 0; + break; + + default: + dwError = ERROR_UNKNOWN_FEATURE; + } + + WriteFile(hPipe, &dwError, sizeof(DWORD), &dwBytes, NULL); + } + + dwError = GetLastError(); + log( L"Pipe is closed (%d), exiting", dwError); + CloseHandle(hPipe); + return 0; +} diff --git a/plugins/PluginUpdater/pu_stub/pu_stub_10.vcxproj b/plugins/PluginUpdater/pu_stub/pu_stub_10.vcxproj new file mode 100644 index 0000000000..5d048a793b --- /dev/null +++ b/plugins/PluginUpdater/pu_stub/pu_stub_10.vcxproj @@ -0,0 +1,143 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {121D2EA6-9D3C-43F6-AC5C-44BDBF93E3E0} + Win32Proj + pu_stub + + + + Application + true + Unicode + + + Application + true + Unicode + + + Application + false + true + Unicode + + + Application + false + true + Unicode + + + + + + + + + + + + + + + + + + + true + $(SolutionDir)$(Configuration)\Obj\$(ProjectName)\ + + + true + $(SolutionDir)$(Configuration)64\ + $(SolutionDir)$(Configuration)64\Obj\$(ProjectName)\ + + + false + $(SolutionDir)$(Configuration)\Obj\$(ProjectName)\ + + + false + $(SolutionDir)$(Configuration)64\ + $(SolutionDir)$(Configuration)64\Obj\$(ProjectName)\ + + + + Level3 + Disabled + WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + + + Windows + true + + + + + Level3 + Disabled + WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + + + Windows + true + + + + + Level3 + MaxSpeed + true + true + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + + + Windows + true + true + true + + + + + Level3 + MinSpace + true + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + Size + + + Windows + true + true + true + + + + + + + + + \ No newline at end of file diff --git a/plugins/PluginUpdater/pu_stub/pu_stub_10.vcxproj.filters b/plugins/PluginUpdater/pu_stub/pu_stub_10.vcxproj.filters new file mode 100644 index 0000000000..240db0fbe7 --- /dev/null +++ b/plugins/PluginUpdater/pu_stub/pu_stub_10.vcxproj.filters @@ -0,0 +1,14 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + \ No newline at end of file diff --git a/plugins/PluginUpdater/pu_stub/pu_stub_11.vcxproj b/plugins/PluginUpdater/pu_stub/pu_stub_11.vcxproj new file mode 100644 index 0000000000..51205a5da3 --- /dev/null +++ b/plugins/PluginUpdater/pu_stub/pu_stub_11.vcxproj @@ -0,0 +1,147 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {121D2EA6-9D3C-43F6-AC5C-44BDBF93E3E0} + Win32Proj + pu_stub + + + + Application + true + v110 + Unicode + + + Application + true + v110 + Unicode + + + Application + false + v110 + true + Unicode + + + Application + false + true + Unicode + v110 + + + + + + + + + + + + + + + + + + + true + $(SolutionDir)$(Configuration)\Obj\$(ProjectName)\ + + + true + $(SolutionDir)$(Configuration)64\ + $(SolutionDir)$(Configuration)64\Obj\$(ProjectName)\ + + + false + $(SolutionDir)$(Configuration)\Obj\$(ProjectName)\ + + + false + $(SolutionDir)$(Configuration)64\ + $(SolutionDir)$(Configuration)64\Obj\$(ProjectName)\ + + + + Level3 + Disabled + WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + + + Windows + true + + + + + Level3 + Disabled + WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + + + Windows + true + + + + + Level3 + MaxSpeed + true + true + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + + + Windows + true + true + true + + + + + Level3 + MinSpace + true + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + Size + + + Windows + true + true + true + + + + + + + + + \ No newline at end of file diff --git a/plugins/PluginUpdater/pu_stub/pu_stub_11.vcxproj.filters b/plugins/PluginUpdater/pu_stub/pu_stub_11.vcxproj.filters new file mode 100644 index 0000000000..240db0fbe7 --- /dev/null +++ b/plugins/PluginUpdater/pu_stub/pu_stub_11.vcxproj.filters @@ -0,0 +1,14 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + \ No newline at end of file -- cgit v1.2.3