2 // Copyright (C) 2014 Suguru Kawamoto
\r
6 #include <ws2tcpip.h>
\r
8 #include <mmsystem.h>
\r
9 typedef SOCKADDR_STORAGE_XP SOCKADDR_STORAGE;
\r
10 typedef SOCKADDR_STORAGE *PSOCKADDR_STORAGE, FAR *LPSOCKADDR_STORAGE;
\r
11 #include <winhttp.h>
\r
13 #include "updater.h"
\r
14 #include "socketwrapper.h"
\r
15 #include "protectprocess.h"
\r
16 #include "mbswrapper.h"
\r
24 BOOL DownloadFileViaHTTP(void* pOut, DWORD Length, DWORD* pLength, LPCWSTR UserAgent, LPCWSTR ServerName, LPCWSTR ObjectName)
\r
31 if(hSession = WinHttpOpen(UserAgent, WINHTTP_ACCESS_TYPE_NO_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0))
\r
33 if(hConnect = WinHttpConnect(hSession, ServerName, INTERNET_DEFAULT_HTTP_PORT, 0))
\r
35 if(hRequest = WinHttpOpenRequest(hConnect, L"GET", ObjectName, NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, 0))
\r
37 if(WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0))
\r
39 if(WinHttpReceiveResponse(hRequest, NULL))
\r
41 if(WinHttpQueryDataAvailable(hRequest, pLength))
\r
43 if(*pLength <= Length)
\r
45 if(WinHttpReadData(hRequest, pOut, Length, pLength))
\r
51 WinHttpCloseHandle(hRequest);
\r
53 WinHttpCloseHandle(hConnect);
\r
55 WinHttpCloseHandle(hSession);
\r
61 BOOL CheckForUpdates(BOOL bDownload, LPCTSTR DownloadDir)
\r
67 UPDATE_HASH UpdateHash;
\r
70 if(DownloadFileViaHTTP(&Buf1, sizeof(Buf1), &Length, HTTP_USER_AGENT, UPDATE_SERVER, UPDATE_HASH_PATH))
\r
72 if(DecryptSignature(UPDATE_RSA_PUBLIC_KEY, &Buf1, Length, &Buf2, sizeof(Buf2), &Length))
\r
74 if(Length == sizeof(UPDATE_HASH))
\r
76 memcpy(&UpdateHash, &Buf2, sizeof(UPDATE_HASH));
\r
77 if(memcmp(&UpdateHash.Signature, UPDATE_SIGNATURE, 64) == 0)
\r
79 if(DownloadFileViaHTTP(&Buf1, sizeof(Buf1), &Length, HTTP_USER_AGENT, UPDATE_SERVER, UPDATE_LIST_PATH))
\r
81 GetHashSHA512(&Buf1, Length, &Hash);
\r
82 if(memcmp(&Hash, &UpdateHash.ListHash, 64) == 0)
\r
87 bResult = PrepareUpdates(&Buf1, Length, DownloadDir);
\r
98 BOOL PrepareUpdates(void* pList, DWORD ListLength, LPCTSTR DownloadDir)
\r
103 // TODO: 更新するファイルをダウンロード
\r
108 BOOL ApplyUpdates(LPCTSTR DestinationDir)
\r
117 BOOL StartUpdateProcess(LPCTSTR Path, LPCTSTR CommandLine)
\r
121 if(ShellExecute(NULL, "open", Path, CommandLine, NULL, SW_SHOW) > (HINSTANCE)32)
\r
126 // 更新用のプロセスを管理者権限で起動
\r
127 // Windows XP以前など起動できない場合は現在のプロセスで処理を続行
\r
128 BOOL StartUpdateProcessAsAdministrator(LPCTSTR CommandLine, LPCTSTR Keyword)
\r
131 TCHAR* NewCommandLine;
\r
132 TCHAR Path[MAX_PATH];
\r
133 SHELLEXECUTEINFO Info;
\r
135 if(_tcslen(CommandLine) < _tcslen(Keyword) || _tcscmp(CommandLine + _tcslen(CommandLine) - _tcslen(Keyword), Keyword) != 0)
\r
137 if(NewCommandLine = (TCHAR*)malloc(sizeof(TCHAR) * (_tcslen(CommandLine) + _tcslen(Keyword) + 1)))
\r
139 _tcscpy(NewCommandLine, CommandLine);
\r
140 _tcscat(NewCommandLine, Keyword);
\r
141 GetModuleFileName(NULL, Path, MAX_PATH);
\r
142 memset(&Info, 0, sizeof(SHELLEXECUTEINFO));
\r
143 Info.cbSize = sizeof(SHELLEXECUTEINFO);
\r
144 Info.fMask = SEE_MASK_NOCLOSEPROCESS;
\r
145 Info.lpVerb = "runas";
\r
146 Info.lpFile = Path;
\r
147 Info.lpParameters = NewCommandLine;
\r
148 Info.nShow = SW_SHOW;
\r
149 if(ShellExecuteEx(&Info))
\r
151 WaitForSingleObject(Info.hProcess, INFINITE);
\r
152 CloseHandle(Info.hProcess);
\r
155 free(NewCommandLine);
\r