BOOL TInstDlg::RunAsAdmin(BOOL is_imme) { SHELLEXECUTEINFOW sei = {0}; WCHAR buf[MAX_PATH * 2]; WCHAR exe_path[MAX_PATH]; WCHAR setup_path[MAX_PATH]; WCHAR app_data[MAX_PATH]; WCHAR virtual_store[MAX_PATH]; WCHAR fastcopy_dir[MAX_PATH]; WCHAR *fastcopy_dirname = NULL; int len; ::GetModuleFileNameW(NULL, exe_path, sizeof(exe_path)); if (!(len = GetDlgItemTextW(FILE_EDIT, setup_path, MAX_PATH))) return FALSE; if (setup_path[len-1] == '\\') setup_path[len-1] = 0; if (!::GetFullPathNameW(setup_path, MAX_PATH, fastcopy_dir, &fastcopy_dirname)) return FALSE; if (!::SHGetSpecialFolderPathW(NULL, buf, CSIDL_APPDATA, FALSE)) return FALSE; MakePathW(app_data, buf, fastcopy_dirname); wcscpy(buf, fastcopy_dir); #ifdef _WIN64 ConvertToX86Dir(buf); #endif if (!TMakeVirtualStorePathW(buf, virtual_store)) return FALSE; swprintf(buf, L"/runas=%p,%d,%d,%d,%d,\"%s\",\"%s\",\"%s\",\"%s\",\"%s\"", hWnd, cfg.mode, is_imme, cfg.programLink, cfg.desktopLink, cfg.startMenu, cfg.deskTop, setup_path, app_data, virtual_store); sei.cbSize = sizeof(SHELLEXECUTEINFO); sei.lpVerb = L"runas"; sei.lpFile = exe_path; sei.lpDirectory = NULL; sei.nShow = SW_NORMAL; sei.lpParameters = buf; EnableWindow(FALSE); BOOL ret = ::ShellExecuteExW(&sei); EnableWindow(TRUE); return ret; }
BOOL Cfg::Init(WCHAR *user_dir, WCHAR *virtual_dir) { WCHAR buf[MAX_PATH], path[MAX_PATH], *fname = NULL; ::GetModuleFileNameW(NULL, buf, MAX_PATH); ::GetFullPathNameW(buf, MAX_PATH, path, &fname); if (!fname) return FALSE; execPath = wcsdup(path); fname[-1] = 0; // remove '\\' of dir\\fname execDir = wcsdup(path); errLogPath = NULL; userDir = NULL; virtualDir = NULL; if (IsWinVista() && TIsVirtualizedDirW(execDir)) { if (user_dir) { userDir = wcsdup(user_dir); if (virtual_dir) virtualDir = wcsdup(virtual_dir); } else { WCHAR virtual_store[MAX_PATH]; WCHAR fastcopy_dir[MAX_PATH]; WCHAR *fastcopy_dirname = NULL; ::GetFullPathNameW(path, MAX_PATH, fastcopy_dir, &fastcopy_dirname); ::SHGetSpecialFolderPathW(NULL, buf, CSIDL_APPDATA, FALSE); MakePathW(path, buf, fastcopy_dirname); userDir = wcsdup(path); wcscpy(buf, execDir); #ifdef _WIN64 ConvertToX86Dir(buf); #endif if (!TMakeVirtualStorePathW(buf, virtual_store)) return FALSE; virtualDir = wcsdup(virtual_store); } ConvertVirtualStoreConf(execDir, userDir, virtualDir); } if (!userDir) userDir = wcsdup(execDir); WCHAR ini_path[MAX_PATH]; MakePathW(ini_path, userDir, FASTCOPY_INI); ini.Init(ini_path); ini.SetSection(MAIN_SECTION); needIniConvert = FALSE; if (ini.GetInt(INI_VERSION_KEY, -1) < CUR_INI_VERSION) { if (::GetFileAttributesW(ini_path) != 0xffffffff) { WCHAR bak_path[MAX_PATH]; wcscpy(bak_path, ini_path); wcscat(bak_path, L".bak"); if (!::MoveFileExW(ini_path, bak_path, MOVEFILE_REPLACE_EXISTING)) { ::DeleteFileW(ini_path); } ini.UnInit(); ini.Init(ini_path); } WCHAR ini_path_old[MAX_PATH]; MakePathW(ini_path_old, userDir, FASTCOPY_INI_OLD); if (::GetFileAttributesW(ini_path_old) != 0xffffffff) { ini.UnInit(); ini.Init(ini_path_old); // loading done ini.SetIniFileNameW(ini_path); needIniConvert = TRUE; // obsolete message file MakePathW(ini_path_old, userDir, FASTCOPY_INI_OBSOLETE); HANDLE hFile = ::CreateFileW(ini_path_old, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); DWORD size; ::WriteFile(hFile, FASTCOPY_OBSOLETE_MSG, sizeof(FASTCOPY_OBSOLETE_MSG), &size, 0); ::CloseHandle(hFile); } } return TRUE; }