BOOL ConvertVirtualStoreConf(void *execDirV, void *userDirV, void *virtualDirV) { #define FASTCOPY_INI_W L"FastCopy.ini" WCHAR buf[MAX_PATH]; WCHAR org_ini[MAX_PATH], usr_ini[MAX_PATH], vs_ini[MAX_PATH]; BOOL is_admin = TIsUserAnAdmin(); BOOL is_exists; MakePathV(usr_ini, userDirV, FASTCOPY_INI_W); MakePathV(org_ini, execDirV, FASTCOPY_INI_W); #ifdef _WIN64 ConvertToX86Dir(org_ini); #endif is_exists = GetFileAttributesV(usr_ini) != 0xffffffff; if (!is_exists) { CreateDirectoryV(userDirV, NULL); } if (virtualDirV && GetChar(virtualDirV, 0)) { MakePathV(vs_ini, virtualDirV, FASTCOPY_INI_W); if (GetFileAttributesV(vs_ini) != 0xffffffff) { if (!is_exists) { is_exists = ::CopyFileW(vs_ini, usr_ini, TRUE); } MakePathV(buf, userDirV, L"to_OldDir(VirtualStore).lnk"); SymLinkV(virtualDirV, buf); sprintfV(buf, L"%s.obsolete", vs_ini); MoveFileW(vs_ini, buf); if (GetFileAttributesV(vs_ini) != 0xffffffff) { DeleteFileV(vs_ini); } } } if ((is_admin || !is_exists) && GetFileAttributesV(org_ini) != 0xffffffff) { if (!is_exists) { is_exists = ::CopyFileW(org_ini, usr_ini, TRUE); } if (is_admin) { sprintfV(buf, L"%s.obsolete", org_ini); MoveFileW(org_ini, buf); if (GetFileAttributesV(org_ini) != 0xffffffff) { DeleteFileV(org_ini); } } } MakePathV(buf, userDirV, L"to_ExeDir.lnk"); // if (GetFileAttributesV(buf) == 0xffffffff) { SymLinkV(execDirV, buf); // } return TRUE; }
BOOL ConvertVirtualStoreConf(WCHAR *execDir, WCHAR *userDir, WCHAR *virtualDir) { #define FASTCOPY_INI_W L"FastCopy.ini" WCHAR buf[MAX_PATH]; WCHAR org_ini[MAX_PATH], usr_ini[MAX_PATH], vs_ini[MAX_PATH]; BOOL is_admin = ::IsUserAnAdmin(); BOOL is_exists; MakePathW(usr_ini, userDir, FASTCOPY_INI_W); MakePathW(org_ini, execDir, FASTCOPY_INI_W); #ifdef _WIN64 ConvertToX86Dir(org_ini); #endif is_exists = ::GetFileAttributesW(usr_ini) != 0xffffffff; if (!is_exists) { ::CreateDirectoryW(userDir, NULL); } if (virtualDir && virtualDir[0]) { MakePathW(vs_ini, virtualDir, FASTCOPY_INI_W); if (::GetFileAttributesW(vs_ini) != 0xffffffff) { if (!is_exists) { is_exists = ::CopyFileW(vs_ini, usr_ini, TRUE); } MakePathW(buf, userDir, L"to_OldDir(VirtualStore).lnk"); SymLinkW(virtualDir, buf); swprintf(buf, L"%s.obsolete", vs_ini); ::MoveFileW(vs_ini, buf); if (::GetFileAttributesW(vs_ini) != 0xffffffff) { ::DeleteFileW(vs_ini); } } } if ((is_admin || !is_exists) && ::GetFileAttributesW(org_ini) != 0xffffffff) { if (!is_exists) { is_exists = ::CopyFileW(org_ini, usr_ini, TRUE); } if (is_admin) { swprintf(buf, L"%s.obsolete", org_ini); ::MoveFileW(org_ini, buf); if (::GetFileAttributesW(org_ini) != 0xffffffff) { ::DeleteFileW(org_ini); } } } MakePathW(buf, userDir, L"to_ExeDir.lnk"); // if (GetFileAttributesW(buf) == 0xffffffff) { SymLinkW(execDir, buf); // } return TRUE; }
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 = GetDlgItemTextV(FILE_EDIT, setup_path, MAX_PATH))) return FALSE; if (GetChar(setup_path, len-1) == '\\') SetChar(setup_path, len-1, 0); if (!GetFullPathNameW(setup_path, MAX_PATH, fastcopy_dir, &fastcopy_dirname)) return FALSE; if (!TSHGetSpecialFolderPathV(NULL, buf, CSIDL_APPDATA, FALSE)) return FALSE; MakePathV(app_data, buf, fastcopy_dirname); strcpyV(buf, fastcopy_dir); #ifdef _WIN64 ConvertToX86Dir(buf); #endif if (!TMakeVirtualStorePathV(buf, virtual_store)) return FALSE; sprintfV(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; }