BOOL TIsVirtualizedDirV(void *path) { if (!IsWinVista()) return FALSE; WCHAR buf[MAX_PATH]; DWORD csidl[] = { CSIDL_WINDOWS, CSIDL_PROGRAM_FILES, CSIDL_PROGRAM_FILESX86, CSIDL_COMMON_APPDATA, 0xffffffff }; for (int i=0; csidl[i] != 0xffffffff; i++) { if (TSHGetSpecialFolderPathV(NULL, buf, csidl[i], FALSE)) { int len = strlenV(buf); if (strnicmpV(buf, path, len) == 0) { WCHAR ch = GetChar(path, len); if (ch == 0 || ch == '\\' || ch == '/') { return TRUE; } } // if (i == 0 && GetChar(buf, 1) == ':') { /* check system root directory */ // if (strnicmpV(path, buf, 3) == 0 && strchrV(MakeAddr(path, 4), '\\') == NULL) { // return TRUE; // } // } } } return FALSE; }
/* メインダイアログ用 WM_INITDIALOG 処理ルーチン */ BOOL TInstDlg::EvCreate(LPARAM lParam) { GetWindowRect(&rect); int cx = ::GetSystemMetrics(SM_CXFULLSCREEN), cy = ::GetSystemMetrics(SM_CYFULLSCREEN); int xsize = rect.right - rect.left, ysize = rect.bottom - rect.top; ::SetClassLong(hWnd, GCL_HICON, (LONG_PTR)::LoadIcon(TApp::GetInstance(), (LPCSTR)SETUP_ICON)); MoveWindow((cx - xsize)/2, (cy - ysize)/2, xsize, ysize, TRUE); Show(); // プロパティシートの生成 staticText.AttachWnd(GetDlgItem(INSTALL_STATIC)); propertySheet = new TInstSheet(this, &cfg); // 現在ディレクトリ設定 char buf[MAX_PATH], setupDir[MAX_PATH]; TRegistry reg(HKEY_LOCAL_MACHINE, BY_MBCS); // タイトル設定 if (IsWinVista() && TIsUserAnAdmin()) { GetWindowText(buf, sizeof(buf)); strcat(buf, " (Admin)"); SetWindowText(buf); } // Program Filesのパス取り出し if (reg.OpenKey(REGSTR_PATH_SETUP)) { if (reg.GetStr(REGSTR_PROGRAMFILES, buf, sizeof(buf))) MakePath(setupDir, buf, FASTCOPY); reg.CloseKey(); } // 既にセットアップされている場合は、セットアップディレクトリを読み出す if (reg.OpenKey(REGSTR_PATH_UNINSTALL)) { if (reg.OpenKey(FASTCOPY)) { if (reg.GetStr(REGSTR_VAL_UNINSTALLER_COMMANDLINE, setupDir, sizeof(setupDir))) { GetParentDir(setupDir, setupDir); } reg.CloseKey(); } reg.CloseKey(); } if (!cfg.startMenu || !cfg.deskTop) { GetShortcutPath(&cfg); } SetDlgItemText(FILE_EDIT, cfg.setupDir ? toA(cfg.setupDir) : setupDir); CheckDlgButton(cfg.mode == SETUP_MODE ? SETUP_RADIO : UNINSTALL_RADIO, 1); ChangeMode(); if (cfg.runImme) PostMessage(WM_COMMAND, MAKEWORD(IDOK, 0), 0); return TRUE; }
BOOL TMakeVirtualStorePathV(void *org_path, void *buf) { if (!IsWinVista()) return FALSE; if (!TIsVirtualizedDirV(org_path) || !TSHGetSpecialFolderPathV(NULL, buf, CSIDL_LOCAL_APPDATA, FALSE) || GetChar(org_path, 1) != ':' || GetChar(org_path, 2) != '\\') { strcpyV(buf, org_path); return FALSE; } sprintfV(MakeAddr(buf, strlenV(buf)), L"\\VirtualStore%s", MakeAddr(org_path, 2)); return TRUE; }
BOOL TMakeVirtualStorePathW(WCHAR *org_path, WCHAR *buf) { if (!IsWinVista()) return FALSE; if (!TIsVirtualizedDirW(org_path) || !SHGetSpecialFolderPathW(NULL, buf, CSIDL_LOCAL_APPDATA, FALSE) || org_path[1] != ':' || org_path[2] != '\\') { wcscpy(buf, org_path); return FALSE; } swprintf(buf + wcslen(buf), L"\\VirtualStore%s", org_path + 2); return TRUE; }
BOOL TSetThreadLocale(int lcid) { static BOOL once = FALSE; static LANGID (WINAPI *pSetThreadUILanguage)(LANGID LangId); if (!once) { if (IsWinVista()) { // ignore if XP pSetThreadUILanguage = (LANGID (WINAPI *)(LANGID LangId)) GetProcAddress(::GetModuleHandle("kernel32"), "SetThreadUILanguage"); } once = TRUE; } if (pSetThreadUILanguage) { pSetThreadUILanguage(LANGIDFROMLCID(lcid)); } return ::SetThreadLocale(lcid); }
BOOL TIsEnableUAC() { static BOOL once = FALSE; static BOOL ret = FALSE; if (!once) { if (IsWinVista()) { TRegistry reg(HKEY_LOCAL_MACHINE); ret = TRUE; if (reg.OpenKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System")) { int val = 1; if (reg.GetInt("EnableLUA", &val) && val == 0) { ret = FALSE; } } } once = TRUE; } return ret; }
BOOL TWin::SetForceForegroundWindow(void) { DWORD foreId, targId, svTmOut; if (IsWinVista()) { TSwitchToThisWindow(hWnd, TRUE); } foreId = ::GetWindowThreadProcessId(::GetForegroundWindow(), NULL); targId = ::GetWindowThreadProcessId(hWnd, NULL); if (foreId != targId) ::AttachThreadInput(targId, foreId, TRUE); ::SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, (void *)&svTmOut, 0); ::SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, 0, 0); BOOL ret = ::SetForegroundWindow(hWnd); ::SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, (void *)svTmOut, 0); if (foreId != targId) ::AttachThreadInput(targId, foreId, FALSE); return ret; }
BOOL TIsVirtualizedDirW(WCHAR *path) { if (!IsWinVista()) return FALSE; WCHAR buf[MAX_PATH]; DWORD csidl[] = { CSIDL_WINDOWS, CSIDL_PROGRAM_FILES, CSIDL_PROGRAM_FILESX86, CSIDL_COMMON_APPDATA, 0xffffffff }; for (int i=0; csidl[i] != 0xffffffff; i++) { if (SHGetSpecialFolderPathW(NULL, buf, csidl[i], FALSE)) { ssize_t len = wcslen(buf); if (wcsnicmp(buf, path, len) == 0) { WCHAR ch = path[len]; if (ch == 0 || ch == '\\' || ch == '/') { return TRUE; } } } } return FALSE; }
BOOL TInstDlg::UnInstall(void) { char buf[MAX_PATH]; char setupDir[MAX_PATH] = ""; ::GetModuleFileName(NULL, setupDir, sizeof(setupDir)); GetParentDir(setupDir, setupDir); BOOL is_shext = FALSE; is_shext = ShellExtFunc(setupDir, CHECK_SHELLEXT); if (is_shext && IsWinVista() && !TIsUserAnAdmin()) { RunAsAdmin(TRUE); return TRUE; } if (MessageBox(GetLoadStr(IDS_START), UNINSTALL_STR, MB_OKCANCEL|MB_ICONINFORMATION) != IDOK) return FALSE; // スタートメニュー&デスクトップから削除 TRegistry reg(HKEY_CURRENT_USER, BY_MBCS); if (reg.OpenKey(REGSTR_SHELLFOLDERS)) { char *regStr[] = { REGSTR_PROGRAMS, REGSTR_DESKTOP, NULL }; for (int cnt=0; regStr[cnt] != NULL; cnt++) { if (reg.GetStr(regStr[cnt], buf, sizeof(buf))) { if (cnt == 0) RemoveSameLink(buf); ::wsprintf(buf + strlen(buf), "\\%s", FASTCOPY_SHORTCUT); if (IS_WINNT_V) { Wstr w_buf(buf, BY_MBCS); DeleteLinkV(w_buf.Buf()); } else { DeleteLinkV(buf); } } } reg.CloseKey(); } ShellExtFunc(setupDir, UNREGISTER_SHELLEXT); #ifdef _WIN64 if (IS_WINNT_V) { #else if (IS_WINNT_V && TIsWow64()) { #endif SHELLEXECUTEINFO sei = { sizeof(sei) }; char arg[1024]; sprintf(arg, "\"%s\\%s\",%s", setupDir, CURRENT_SHEXTDLL_EX, "DllUnregisterServer"); sei.lpFile = "rundll32.exe"; sei.lpParameters = arg; ShellExecuteEx(&sei); } // レジストリからアンインストール情報を削除 if (reg.OpenKey(REGSTR_PATH_UNINSTALL)) { if (reg.OpenKey(FASTCOPY)) { if (reg.GetStr(REGSTR_VAL_UNINSTALLER_COMMANDLINE, setupDir, sizeof(setupDir))) GetParentDir(setupDir, setupDir); reg.CloseKey(); } reg.DeleteKey(FASTCOPY); reg.CloseKey(); } // 終了メッセージ MessageBox(is_shext ? GetLoadStr(IDS_UNINSTSHEXTFIN) : GetLoadStr(IDS_UNINSTFIN)); // インストールディレクトリを開く if (GetFileAttributes(setupDir) != 0xffffffff) { ::ShellExecute(NULL, NULL, setupDir, 0, 0, SW_SHOW); } // AppDataディレクトリを開く if (IsWinVista()) { WCHAR wbuf[MAX_PATH] = L"", upath[MAX_PATH] = L""; WCHAR fastcopy_dir[MAX_PATH] = L"", *fastcopy_dirname = NULL; Wstr w_setup(setupDir); if (TIsVirtualizedDirV(w_setup.Buf())) { if (TSHGetSpecialFolderPathV(NULL, wbuf, CSIDL_APPDATA, FALSE)) { GetFullPathNameW(w_setup.Buf(), MAX_PATH, fastcopy_dir, &fastcopy_dirname); MakePathV(upath, wbuf, fastcopy_dirname); if (GetFileAttributesV(upath) != 0xffffffff) { ::ShellExecuteW(NULL, NULL, upath, 0, 0, SW_SHOW); } } } } ::PostQuitMessage(0); return TRUE; } BOOL ReadLink(char *src, char *dest, char *arg=NULL) { IShellLink *shellLink; // 実際は IShellLinkA or IShellLinkW IPersistFile *persistFile; WCHAR wbuf[MAX_PATH]; BOOL ret = FALSE; if (SUCCEEDED(CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void **)&shellLink))) { if (SUCCEEDED(shellLink->QueryInterface(IID_IPersistFile, (void **)&persistFile))) { AtoW(src, wbuf, MAX_PATH); if (SUCCEEDED(persistFile->Load(wbuf, STGM_READ))) { if (SUCCEEDED(shellLink->GetPath(dest, MAX_PATH, NULL, 0))) { if (arg) { shellLink->GetArguments(arg, MAX_PATH); } ret = TRUE; } } persistFile->Release(); } shellLink->Release(); } return ret; }
BOOL TInstDlg::Install(void) { char buf[MAX_PATH], setupDir[MAX_PATH], setupPath[MAX_PATH]; BOOL is_delay_copy = FALSE; int len; // インストールパス設定 len = GetDlgItemText(FILE_EDIT, setupDir, sizeof(setupDir)); if (GetChar(setupDir, len-1) == '\\') SetChar(setupDir, len-1, 0); Wstr w_setup(setupDir); if (IsWinVista() && TIsVirtualizedDirV(w_setup.Buf())) { if (!TIsUserAnAdmin()) { return RunAsAdmin(TRUE); } else if (cfg.runImme && cfg.setupDir && lstrcmpiV(w_setup.Buf(), cfg.setupDir)) { return MessageBox(GetLoadStr(IDS_ADMINCHANGE)), FALSE; } } CreateDirectory(setupDir, NULL); DWORD attr = GetFileAttributes(setupDir); if (attr == 0xffffffff || (attr & FILE_ATTRIBUTE_DIRECTORY) == 0) return MessageBox(GetLoadStr(IDS_NOTCREATEDIR)), FALSE; MakePath(setupPath, setupDir, FASTCOPY_EXE); if (MessageBox(GetLoadStr(IDS_START), INSTALL_STR, MB_OKCANCEL|MB_ICONINFORMATION) != IDOK) return FALSE; // ファイルコピー if (cfg.mode == SETUP_MODE) { char installPath[MAX_PATH], orgDir[MAX_PATH]; ::GetModuleFileName(NULL, orgDir, sizeof(orgDir)); GetParentDir(orgDir, orgDir); for (int cnt=0; SetupFiles[cnt] != NULL; cnt++) { MakePath(buf, orgDir, SetupFiles[cnt]); MakePath(installPath, setupDir, SetupFiles[cnt]); if (MiniCopy(buf, installPath) || IsSameFile(buf, installPath)) continue; if ((strcmp(SetupFiles[cnt], CURRENT_SHEXTDLL_EX) == 0 || strcmp(SetupFiles[cnt], CURRENT_SHEXTDLL) == 0) && DelayCopy(buf, installPath)) { is_delay_copy = TRUE; continue; } return MessageBox(installPath, GetLoadStr(IDS_NOTCREATEFILE)), FALSE; } } // スタートメニュー&デスクトップに登録 char *linkPath[] = { toA(cfg.startMenu, TRUE), toA(cfg.deskTop, TRUE), NULL }; BOOL execFlg[] = { cfg.programLink, cfg.desktopLink, NULL }; for (int cnt=0; linkPath[cnt]; cnt++) { strcpy(buf, linkPath[cnt]); if (cnt != 0 || RemoveSameLink(linkPath[cnt], buf) == FALSE) { ::wsprintf(buf + strlen(buf), "\\%s", FASTCOPY_SHORTCUT); } if (execFlg[cnt]) { if (IS_WINNT_V) { Wstr w_setup(setupPath, BY_MBCS); Wstr w_buf(buf, BY_MBCS); SymLinkV(w_setup.Buf(), w_buf.Buf()); } else { SymLinkV(setupPath, buf); } } else { if (IS_WINNT_V) { Wstr w_buf(buf, BY_MBCS); DeleteLinkV(w_buf.Buf()); } else { DeleteLinkV(buf); } } } #if 0 // レジストリにアンインストール情報を登録 if (reg.OpenKey(REGSTR_PATH_UNINSTALL)) { if (reg.CreateKey(FASTCOPY)) { MakePath(buf, setupDir, INSTALL_EXE); strcat(buf, " /r"); reg.SetStr(REGSTR_VAL_UNINSTALLER_DISPLAYNAME, FASTCOPY); reg.SetStr(REGSTR_VAL_UNINSTALLER_COMMANDLINE, buf); reg.CloseKey(); } reg.CloseKey(); } #endif if (IsWinVista() && TIsVirtualizedDirV(w_setup.Buf())) { WCHAR wbuf[MAX_PATH] = L"", old_path[MAX_PATH] = L"", usr_path[MAX_PATH] = L""; WCHAR fastcopy_dir[MAX_PATH], *fastcopy_dirname = NULL; GetFullPathNameW(w_setup.Buf(), MAX_PATH, fastcopy_dir, &fastcopy_dirname); if (cfg.appData) { strcpyV(usr_path, cfg.appData); } else { TSHGetSpecialFolderPathV(NULL, wbuf, CSIDL_APPDATA, FALSE); MakePathV(usr_path, wbuf, fastcopy_dirname); } ConvertVirtualStoreConf(w_setup.Buf(), usr_path, cfg.virtualDir); } // コピーしたアプリケーションを起動 const char *msg = GetLoadStr(is_delay_copy ? IDS_DELAYSETUPCOMPLETE : IDS_SETUPCOMPLETE); int flg = MB_OKCANCEL|MB_ICONINFORMATION; if (IsWin7()) { msg = Fmt("%s%s", msg, GetLoadStr(IDS_COMPLETE_WIN7)); } TLaunchDlg dlg(msg, this); UINT id; if ((id = dlg.Exec()) == IDOK || id == LAUNCH_BUTTON) { char *arg = (id == LAUNCH_BUTTON) ? "/install" : ""; ShellExecute(NULL, "open", setupPath, arg, setupDir, SW_SHOW); } ::PostQuitMessage(0); return TRUE; }
BOOL Cfg::WriteRegistry(int ctl_flg) { char buf[MAX_LISTBUF], val[MAX_LISTBUF]; int i; GetRegName(buf, nicAddr, portNo); TRegistry reg(HS_TOOLS, buf); if (ctl_flg & CFG_GENERAL) { reg.SetStr(NULL, GetVersionStr()); reg.SetInt(LCID_KEY, lcid); reg.SetInt(NOBEEP_STR, NoBeep); reg.SetInt(NOTCP_STR, NoTcp); reg.SetInt(LISTGET_STR, ListGet); reg.SetInt(LISTGETMSEC_STR, (int)ListGetMSec); reg.SetInt(RETRYMSEC_STR, (int)RetryMSec); reg.SetInt(RETRYMAX_STR, (int)RetryMax); reg.SetInt(IsWinNT() ? RECVMAXNT_STR : RECVMAX95_STR, (int)RecvMax); reg.SetInt(NOERASE_STR, NoErase); // reg.SetInt(DEBUG_STR, Debug); reg.SetInt(NOPOPUPCHECK_STR, NoPopupCheck); reg.SetInt(OPENCHECK_STR, OpenCheck); reg.SetInt(ALLOWSENDLIST_STR, AllowSendList); reg.SetInt(FILETRANSOPT_STR, fileTransOpt); reg.SetInt(RESOLVEOPT_STR, ResolveOpt); // reg.SetInt(LETTERKEY_STR, LetterKey); // reg.SetInt(REMOTEGRACE_STR, RemoteGraceSec); reg.SetStr(REBOOT_STR, RemoteReboot); reg.SetInt(REBOOTMODE_STR, RemoteRebootMode); reg.SetStr(EXIT_STR, RemoteExit); reg.SetInt(EXITMODE_STR, RemoteExitMode); reg.SetInt(CLIPMODE_STR, ClipMode); // reg.SetInt(CLIPMAX_STR, ClipMax); // reg.SetInt(CAPTUREDELAY_STR, CaptureDelay); // reg.SetInt(CAPTUREDELAYEX_STR, CaptureDelayEx); reg.SetInt(CAPTUREMINIMIZE_STR, CaptureMinimize); reg.SetInt(CAPTURECLIP_STR, CaptureClip); reg.SetInt(CAPTURESAVE_STR, CaptureSave); reg.SetInt(OPENMSGTIME_STR, OpenMsgTime); reg.SetInt(RECVMSGTIME_STR, RecvMsgTime); reg.SetInt(BALLOONNOINFO_STR, BalloonNoInfo); // reg.SetInt(TASKBARUI_STR, TaskbarUI); // reg.SetInt(MARKERTHICK_STR, MarkerThick); if (IsWinVista()) reg.SetInt(IPV6MODE_STR, IPv6ModeNext); // if (IsWinVista()) reg.SetStr(IPV6MULITCAST, IPv6Multicast); // reg.SetInt(VIEWMAX_STR, ViewMax); // reg.SetInt(TRANSMAX_STR, TransMax); // reg.SetInt(TCPBUFMAX_STR, TcpbufMax); // reg.SetInt(IOBUFMAX_STR, IoBufMax); reg.SetInt(LUMPCHECK_STR, LumpCheck); reg.SetInt(ENCTRANSCHECK_STR, EncTransCheck); } if (ctl_flg & CFG_ABSENCE) { reg.SetInt(ABSENCESAVE_STR, AbsenceSave); reg.SetInt(ABSENCECHECK_STR, AbsenceCheck); reg.SetInt(ABSENCEMAX_STR, AbsenceMax); if (reg.CreateKey(ABSENCESTR_STR)) { for (i=0; i < AbsenceMax; i++) { char key[MAX_PATH_U8]; sprintf(key, "%s%d", ABSENCESTR_STR, i); reg.SetStr(key, AbsenceStr[i]); sprintf(key, "%s%d", ABSENCEHEAD_STR, i); reg.SetStr(key, AbsenceHead[i]); } } reg.CloseKey(); } if (ctl_flg & CFG_GENERAL) { reg.SetStr(PASSWORD_STR, PasswordStr); reg.SetInt(PASSWDLOGCHECK_STR, PasswdLogCheck); reg.SetInt(DELAYTIME_STR, DelayTime); reg.SetInt(QUOTECHECK_STR, QuoteCheck); reg.SetInt(SECRETCHECK_STR, SecretCheck); reg.SetInt(LOGONLOG_STR, LogonLog); reg.SetInt(RECVLOGONDISP_STR, RecvLogonDisp); reg.SetInt(IPADDRCHECK_STR, IPAddrCheck); reg.SetInt(RECVIPADDRCHECK_STR, RecvIPAddr); reg.SetInt(ONECLICKPOPUP_STR, OneClickPopup); reg.SetInt(BALLOONNOTIFY_STR, BalloonNotify); reg.SetInt(TRAYICON_STR, TrayIcon); reg.SetInt(ABNORMALBTN_STR, AbnormalButton); reg.SetInt(DIALUPCHECK_STR, DialUpCheck); reg.SetInt(ABSENCENONPOPUP_STR, AbsenceNonPopup); reg.SetStr(NICKNAMESTR_STR, NickNameStr); reg.SetStr(GROUPNAMESTR_STR, GroupNameStr); reg.SetLong(SORT_STR, Sort); reg.SetInt(UPDATETIME_STR, UpdateTime); reg.SetInt(KEEPHOSTTIME_STR, KeepHostTime); reg.SetInt(EXTENDENTRY_STR, ExtendEntry); reg.SetInt(EXTENDBROADCAST_STR, ExtendBroadcast); reg.SetInt(MULTICASTMODE_STR, MulticastMode); reg.SetInt(CONTROLIME_STR, ControlIME); reg.SetInt(GRIDLINE_STR, GridLineCheck); reg.SetInt(COLUMNITEMS_STR, ColumnItems); reg.SetStr(QUOTESTR_STR, QuoteStr); if (reg.CreateKey(HOTKEY_STR)) { reg.SetInt(HOTKEYCHECK_STR, HotKeyCheck); reg.SetInt(HOTKEYMODIFY_STR, HotKeyModify); reg.SetInt(HOTKEYSEND_STR, HotKeySend); reg.SetInt(HOTKEYRECV_STR, HotKeyRecv); reg.SetInt(HOTKEYMISC_STR, HotKeyMisc); reg.CloseKey(); } reg.SetInt(LOGCHECK_STR, LogCheck); reg.SetInt(LOGUTF8_STR, LogUTF8); reg.SetStr(LOGFILE_STR, LogFile); reg.SetStr(SOUNDFILE_STR, SoundFile); reg.SetStr(ICON_STR, IconFile); reg.SetStr(REVICON_STR, RevIconFile); reg.SetStr(LASTOPEN_STR, lastOpenDir); reg.SetStr(LASTSAVE_STR, lastSaveDir); reg.SetInt(LRUUSERMAX_STR, lruUserMax); reg.SetStr(AUTOSAVEDIR_STR, autoSaveDir); reg.SetInt(AUTOSAVETOUT_STR, autoSaveTout); reg.SetInt(AUTOSAVEMAX_STR, autoSaveMax); reg.SetInt(AUTOSAVELEVEL_STR, autoSaveLevel); reg.SetInt(AUTOSAVEFLAGS_STR, autoSaveFlags); } if ((ctl_flg & CFG_WINSIZE) && reg.CreateKey(WINSIZE_STR)) { reg.SetInt(SENDNICKNAME_STR, SendWidth[SW_NICKNAME]); reg.SetInt(SENDUSERNAME_STR, SendWidth[SW_USER]); reg.SetInt(SENDABSENCE_STR, SendWidth[SW_ABSENCE]); reg.SetInt(SENDPRIORITY_STR, SendWidth[SW_PRIORITY]); reg.SetInt(SENDGROUPNAME_STR, SendWidth[SW_GROUP]); reg.SetInt(SENDHOSTNAME_STR, SendWidth[SW_HOST]); reg.SetInt(SENDIPADDR_STR, SendWidth[SW_IPADDR]); if (reg.CreateKey(SENDORDER_STR)) { for (i=0; i < MAX_SENDWIDTH; i++) { sprintf(buf, "%d", i); reg.SetInt(buf, SendOrder[i]); } reg.CloseKey(); } reg.SetInt(SENDXDIFF_STR, SendXdiff); reg.SetInt(SENDYDIFF_STR, SendYdiff); reg.SetInt(SENDMIDYDIFF_STR, SendMidYdiff); reg.SetInt(SENDSAVEPOS_STR, SendSavePos); reg.SetInt(SENDXPOS_STR, SendXpos); reg.SetInt(SENDYPOS_STR, SendYpos); reg.SetInt(RECVXDIFF_STR, RecvXdiff); reg.SetInt(RECVYDIFF_STR, RecvYdiff); reg.SetInt(RECVSAVEPOS_STR, RecvSavePos); reg.SetInt(RECVXPOS_STR, RecvXpos); reg.SetInt(RECVYPOS_STR, RecvYpos); reg.SetInt(HISTXDIFF_STR, HistXdiff); reg.SetInt(HISTYDIFF_STR, HistYdiff); reg.SetInt(HISTUSER_STR, HistWidth[HW_USER]); reg.SetInt(HISTODATE_STR, HistWidth[HW_ODATE]); reg.SetInt(HISTSDATE_STR, HistWidth[HW_SDATE]); reg.SetInt(HISTID_STR, HistWidth[HW_ID]); reg.CloseKey(); } if ((ctl_flg & CFG_FONT) && reg.CreateKey(FONT_STR)) { WriteFontRegistry(®, SENDEDITFONT_STR, &SendEditFont); WriteFontRegistry(®, SENDLISTFONT_STR, &SendListFont); WriteFontRegistry(®, RECVHEADFONT_STR, &RecvHeadFont); WriteFontRegistry(®, RECVEDITFONT_STR, &RecvEditFont); WriteFontRegistry(®, LOGVIEWFONT_STR, &LogViewFont); reg.CloseKey(); } if ((ctl_flg & CFG_BROADCAST) && reg.CreateKey(BROADCAST_STR)) { i = 0; for (TBrObj *obj=brList.TopObj(); obj; obj=brList.NextObj(obj)) { sprintf(buf, "%d", i++); reg.SetStr(buf, obj->Host()); } while (1) { sprintf(buf, "%d", i++); if (!reg.GetStr(buf, val, sizeof(val))) break; if (!reg.DeleteValue(buf)) break; } reg.CloseKey(); } if (ctl_flg & CFG_CLICKURL) { reg.SetInt(DEFAULTURL_STR, DefaultUrl); reg.SetInt(SHELLEXEC_STR, ShellExec); if (reg.CreateKey(CLICKABLEURL_STR)) { for (UrlObj *obj = urlList.TopObj(); obj; obj = urlList.NextObj(obj)) reg.SetStr(obj->protocol, obj->program); reg.CloseKey(); } } if ((ctl_flg & CFG_PRIORITY) && reg.CreateKey(PRIORITY_STR)) { reg.SetInt(PRIORITYMAX_STR, PriorityMax); reg.SetInt(PRIORITYREJECT_STR, PriorityReject); #if 0 for (i=0; i < PriorityMax; i++) { sprintf(buf, "%d", i); if (reg.CreateKey(buf)) { reg.SetStr(PRIORITYSOUND_STR, PrioritySound[i] ? PrioritySound[i] : ""); reg.CloseKey(); } } #endif reg.CloseKey(); } if ((ctl_flg & CFG_HOSTINFO) && reg.CreateKey(HOSTINFO_STR)) { Time_t now_time = Time(); BYTE pubkey[MAX_BUF]; int pubkeySize; if (ctl_flg & CFG_DELHOST) reg.DeleteChildTree(); for (i=0; i < priorityHosts.HostCnt(); i++) { Host *host = priorityHosts.GetHost(i); int to_store_size = 2048 / 8; // 2048bits RSA key sprintf(buf, "%s:%s", host->hostSub.userName, host->hostSub.hostName); if (host->updateTime + KeepHostTime < now_time || (host->pubKey.KeyLen() < to_store_size && host->priority == DEFAULT_PRIORITY)) { if (ctl_flg & CFG_DELCHLDHOST) reg.DeleteChildTree(buf); } else if (reg.CreateKey(buf)) { reg.SetStr(USERNAME_STR, host->hostSub.userName); reg.SetStr(HOSTNAME_STR, host->hostSub.hostName); reg.SetLong(IPADDR_STR, host->hostSub.addr.V4Addr()); reg.SetInt(PORTNO_STR, host->hostSub.portNo); reg.SetStr(NICKNAME_STR, host->nickName); reg.SetStr(GROUPNAME_STR, host->groupName); if (*host->alterName) reg.SetStr(ALTERNAME_STR, host->alterName); reg.SetInt(PRIORITY_STR, host->priority); reg.SetLong(UPDATETIME_STR, (long)host->updateTime); if (host->pubKey.KeyLen() >= to_store_size) { char *p = (char *)GetUserNameDigestField(host->hostSub.userName); if (p && (pubkeySize = host->pubKey.Serialize(pubkey, sizeof(pubkey))) > 0) { reg.SetByte(PUBLICKEY_STR, pubkey, pubkeySize); } } reg.CloseKey(); } } reg.CloseKey(); } if ((ctl_flg & CFG_FINDHIST) && reg.CreateKey(FINDSTR_STR)) { reg.SetInt(FINDMAX_STR, FindMax); reg.SetInt(FINDALL_STR, FindAll); for (i=0; i < FindMax; i++) { char key[MAX_PATH_U8]; sprintf(key, "%d", i); reg.SetStr(key, FindStr[i]); } reg.CloseKey(); } if (ctl_flg & CFG_LRUUSER) { reg.DeleteChildTree(LRUUSERKEY_STR); if (reg.CreateKey(LRUUSERKEY_STR)) { UsersObj *obj=lruUserList.TopObj(); for (i=0; obj; i++) { sprintf(buf, "%d", i); if (!reg.CreateKey(buf)) break; UserObj *u = obj->users.TopObj(); for (int j=0; u; j++) { sprintf(buf, "%d", j); if (!reg.CreateKey(buf)) break; reg.SetStr(USERNAME_STR, u->hostSub.userName); reg.SetStr(HOSTNAME_STR, u->hostSub.hostName); reg.CloseKey(); u = obj->users.NextObj(u); } reg.CloseKey(); obj = lruUserList.NextObj(obj); } reg.CloseKey(); } } // private/public key if (ctl_flg & CFG_CRYPT) { for (int i=KEY_1024; i <= KEY_2048; i++) { const char *key = (i == KEY_1024) ? CRYPT_STR : CRYPT2_STR; if (reg.CreateKey(key) && priv[i].blob) { reg.SetByte(PRIVBLOB_STR, priv[i].blob, priv[i].blobLen); if (priv[i].encryptSeed) reg.SetByte(PRIVSEED_STR, priv[i].encryptSeed, priv[i].encryptSeedLen); reg.SetInt(PRIVTYPE_STR, priv[i].encryptType); reg.CloseKey(); } } } return TRUE; }
BOOL Cfg::ReadRegistry(void) { char buf[MAX_BUF], val[MAX_BUF]; int i; GetRegName(buf, nicAddr, portNo); TRegistry reg(HS_TOOLS, buf); if (!reg.GetInt(NOPOPUPCHECK_STR, &NoPopupCheck)) { GetRegName(buf, 0, portNo); reg.ChangeApp(HS_TOOLS, buf); if (!reg.GetInt(NOPOPUPCHECK_STR, &NoPopupCheck)) reg.ChangeApp(HS_TOOLS, GetLoadStr(IDS_IPMSG)); } lcid = -1; NoBeep = FALSE; NoTcp = FALSE; ListGet = FALSE; HotKeyCheck = TRUE; HotKeyModify = MOD_ALT|MOD_CONTROL; HotKeySend = 'S'; HotKeyRecv = 'R'; HotKeyMisc = 'D'; ListGetMSec = IPMSG_DEFAULT_LISTGETMSEC; RetryMSec = IPMSG_DEFAULT_RETRYMSEC; RetryMax = IPMSG_DEFAULT_RETRYMAX; RecvMax = IsWinNT() ? IPMSG_DEFAULT_RECVMAX_NT : IPMSG_DEFAULT_RECVMAX_95; NoErase = FALSE; Debug = FALSE; NoPopupCheck = TRUE; OpenCheck = 1; AbsenceSave = FALSE; AbsenceCheck = FALSE; AbsenceMax = IPMSG_DEFAULT_ABSENCEMAX; AbsenceChoice = 0; FindMax = IPMSG_DEFAULT_FINDMAX; FindAll = TRUE; DelayTime = IPMSG_DEFAULT_DELAY; QuoteCheck = TRUE; SecretCheck = TRUE; LogonLog = TRUE; RecvLogonDisp = FALSE; IPAddrCheck = TRUE; RecvIPAddr = TRUE; OneClickPopup = FALSE; BalloonNotify = TRUE; TrayIcon = TRUE; AbnormalButton = FALSE; DialUpCheck = FALSE; *NickNameStr = 0; *GroupNameStr = 0; AbsenceNonPopup = TRUE; Sort = IPMSG_NAMESORT; UpdateTime = IPMSG_DEFAULT_UPDATETIME; KeepHostTime = IPMSG_DEFAULT_KEEPHOSTTIME; DefaultUrl = TRUE; ShellExec = FALSE; ExtendEntry = TRUE; ExtendBroadcast = 1; MulticastMode = 0; ControlIME = 1; GridLineCheck = TRUE; PriorityMax = DEFAULT_PRIORITYMAX; PriorityReject = 0; AllowSendList = TRUE; fileTransOpt = 0; ResolveOpt = 0; LetterKey = IsLang(LANG_JAPANESE) ? FALSE : TRUE; RemoteGraceSec = IPMSG_DEFAULT_REMOTEGRACE; RemoteRebootMode = 0; *RemoteReboot = 0; RemoteExitMode = 0; *RemoteExit = 0; ClipMode = IPMSG_DEFAULT_CLIPMODE; ClipMax = IPMSG_DEFAULT_CLIPMAX; CaptureDelay = 300; CaptureDelayEx = 500; CaptureMinimize = TRUE; CaptureClip = TRUE; CaptureSave = FALSE; OpenMsgTime = IPMSG_DEFAULT_OPENMSGTIME; RecvMsgTime = IPMSG_DEFAULT_RECVMSGTIME; BalloonNoInfo = FALSE; TaskbarUI = /*IsWin7() ? TRUE :*/ FALSE; MarkerThick = IPMSG_DEFAULT_MARKER_THICK; IPv6Mode = IPv6ModeNext = 0; strcpy(IPv6Multicast, IPMSG_DEFAULT_MULTICAST_ADDR6); // in ipmsg.h ViewMax = IPMSG_DEFAULT_VIEWMAX; TransMax = IPMSG_DEFAULT_TRANSMAX; TcpbufMax = IPMSG_DEFAULT_TCPBUFMAX; IoBufMax = IPMSG_DEFAULT_IOBUFMAX; LumpCheck = FALSE; EncTransCheck = TRUE; lruUserMax = IPMSG_DEFAULT_LRUUSERMAX; // CryptProtectData is available only Win2K/XP for (i=0; i < MAX_KEY; i++) { priv[i].encryptType = IsWin2K() ? PRIV_BLOB_DPAPI : PRIV_BLOB_RAW; } strncpyz(QuoteStr, IPMSG_DEFAULT_QUOTE, sizeof(QuoteStr)); SendWidth[SW_NICKNAME] = IPMSG_DEFAULT_NICKNAMEWIDTH; SendWidth[SW_ABSENCE] = IPMSG_DEFAULT_ABSENCEWIDTH; SendWidth[SW_GROUP] = IPMSG_DEFAULT_GROUPWIDTH; SendWidth[SW_HOST] = IPMSG_DEFAULT_HOSTWIDTH; SendWidth[SW_IPADDR] = IPMSG_DEFAULT_IPADDRWIDTH; SendWidth[SW_USER] = IPMSG_DEFAULT_USERWIDTH; SendWidth[SW_PRIORITY] = IPMSG_DEFAULT_PRIORITYWIDTH; ColumnItems = 0; SetItem(&ColumnItems, SW_NICKNAME, TRUE); SetItem(&ColumnItems, SW_GROUP, TRUE); SetItem(&ColumnItems, SW_HOST, TRUE); for (i=0; i < MAX_SENDWIDTH; i++) SendOrder[i] = i; SendXdiff = 0; SendYdiff = 0; SendMidYdiff = 0; SendSavePos = 0; SendXpos = 0; SendYpos = 0; RecvXdiff = 0; RecvYdiff = 0; RecvSavePos = 0; RecvXpos = 0; RecvYpos = 0; HistWidth[HW_USER] = IPMSG_DEFAULT_HWUSER_WIDTH; HistWidth[HW_ODATE] = IPMSG_DEFAULT_HWODATE_WIDTH; HistWidth[HW_SDATE] = IPMSG_DEFAULT_HWSDATE_WIDTH; HistWidth[HW_ID] = IPMSG_DEFAULT_HWID_WIDTH; HistXdiff = 0; HistYdiff = 0; LogCheck = TRUE; LogUTF8 = TRUE; PasswdLogCheck = FALSE; *SoundFile = 0; *IconFile = 0; *RevIconFile = 0; *lastSaveDir = *lastOpenDir = 0; *autoSaveDir = 0; autoSaveTout = IPMSG_DEFAULT_AUTOSAVE_TOUT; autoSaveLevel = 0; autoSaveFlags = 0; autoSaveMax = IPMSG_DEFAULT_AUTOSAVE_MAX; memset(&SendEditFont, 0, sizeof(SendEditFont)); memset(&SendListFont, 0, sizeof(SendListFont)); memset(&RecvHeadFont, 0, sizeof(RecvHeadFont)); memset(&RecvEditFont, 0, sizeof(RecvEditFont)); memset(&LogViewFont, 0, sizeof(LogViewFont)); reg.GetInt(LCID_KEY, &lcid); reg.GetInt(NOBEEP_STR, &NoBeep); reg.GetInt(NOTCP_STR, &NoTcp); reg.GetInt(LISTGET_STR, &ListGet); reg.GetInt(LISTGETMSEC_STR, (int *)&ListGetMSec); reg.GetInt(RETRYMSEC_STR, (int *)&RetryMSec); reg.GetInt(RETRYMAX_STR, (int *)&RetryMax); reg.GetInt(IsWinNT() ? RECVMAXNT_STR : RECVMAX95_STR, (int *)&RecvMax); reg.GetInt(NOERASE_STR, &NoErase); reg.GetInt(DEBUG_STR, &Debug); reg.GetInt(NOPOPUPCHECK_STR, &NoPopupCheck); reg.GetInt(OPENCHECK_STR, &OpenCheck); reg.GetInt(ABSENCESAVE_STR, &AbsenceSave); if (AbsenceSave) reg.GetInt(ABSENCECHECK_STR, &AbsenceCheck); reg.GetInt(ABSENCEMAX_STR, &AbsenceMax); reg.GetInt(ALLOWSENDLIST_STR, &AllowSendList); reg.GetInt(FILETRANSOPT_STR, &fileTransOpt); reg.GetInt(RESOLVEOPT_STR, &ResolveOpt); reg.GetInt(LETTERKEY_STR, &LetterKey); reg.GetInt(REMOTEGRACE_STR, &RemoteGraceSec); reg.GetStr(REBOOT_STR, RemoteReboot, sizeof(RemoteReboot)); reg.GetInt(REBOOTMODE_STR, &RemoteRebootMode); reg.GetStr(EXIT_STR, RemoteExit, sizeof(RemoteExit)); reg.GetInt(EXITMODE_STR, &RemoteExitMode); reg.GetInt(CLIPMODE_STR, &ClipMode); ClipMode |= CLIP_ENABLE; reg.GetInt(CLIPMAX_STR, &ClipMax); reg.GetInt(CAPTUREDELAY_STR, &CaptureDelay); reg.GetInt(CAPTUREDELAYEX_STR, &CaptureDelayEx); reg.GetInt(CAPTUREMINIMIZE_STR, &CaptureMinimize); reg.GetInt(CAPTURECLIP_STR, &CaptureClip); reg.GetInt(CAPTURESAVE_STR, &CaptureSave); reg.GetInt(OPENMSGTIME_STR, &OpenMsgTime); reg.GetInt(RECVMSGTIME_STR, &RecvMsgTime); reg.GetInt(BALLOONNOINFO_STR, &BalloonNoInfo); reg.GetInt(TASKBARUI_STR, &TaskbarUI); reg.GetInt(MARKERTHICK_STR, &MarkerThick); reg.GetStr(IPV6MULITCAST, IPv6Multicast, sizeof(IPv6Multicast)); if (IsWinVista()) { reg.GetInt(IPV6MODE_STR, &IPv6Mode); if (nicAddr.size == 16 && !IPv6Mode) IPv6Mode = 2; reg.GetStr(IPV6MULITCAST, IPv6Multicast, sizeof(IPv6Multicast)); if (!*IPv6Multicast) { strcpy(IPv6Multicast, IPMSG_DEFAULT_MULTICAST_ADDR6); // in ipmsg.h } } IPv6ModeNext = IPv6Mode; // for File Transfer reg.GetInt(VIEWMAX_STR, &ViewMax); if (ViewMax < 1024 * 1024) // 1MB 以下の MapFileOfView は認めない ViewMax = IPMSG_DEFAULT_VIEWMAX; reg.GetInt(TRANSMAX_STR, &TransMax); if (TransMax < 8 * 1024) // 8KB 以下の file transfer buf は認めない TransMax = IPMSG_DEFAULT_TRANSMAX; reg.GetInt(TCPBUFMAX_STR, &TcpbufMax); if (TcpbufMax < 8 * 1024) // 8KB 以下の sockbuf は認めない TcpbufMax = IPMSG_DEFAULT_TCPBUFMAX; reg.GetInt(IOBUFMAX_STR, &IoBufMax); if (IoBufMax < TransMax) // transmax 以下の IO/Buf は認めない IoBufMax = TransMax; reg.GetInt(LUMPCHECK_STR, &LumpCheck); reg.GetInt(ENCTRANSCHECK_STR, &EncTransCheck); // for Absence Message typedef char MaxBuf[MAX_PATH_U8]; AbsenceStr = new MaxBuf[AbsenceMax]; memset(AbsenceStr, 0, MAX_PATH_U8 * AbsenceMax); reg.GetStr(ABSENCESTR_STR, AbsenceStr[0], sizeof(AbsenceStr[0])); typedef char MaxHead[MAX_NAMEBUF]; AbsenceHead = new MaxHead[AbsenceMax]; memset(AbsenceHead, 0, MAX_NAMEBUF * AbsenceMax); if (reg.CreateKey(ABSENCESTR_STR)) { for (i=0; i < AbsenceMax; i++) { char key[MAX_PATH_U8]; sprintf(key, "%s%d", ABSENCESTR_STR, i); if (!reg.GetStr(key, AbsenceStr[i], sizeof(AbsenceStr[i]))) strncpyz(AbsenceStr[i], DefaultAbsence[i < IPMSG_DEFAULT_ABSENCEMAX ? i : 0], MAX_PATH_U8); sprintf(key, "%s%d", ABSENCEHEAD_STR, i); if (!reg.GetStr(key, AbsenceHead[i], sizeof(AbsenceHead[i]))) strcpy(AbsenceHead[i], DefaultAbsenceHead[i < IPMSG_DEFAULT_ABSENCEMAX ? i : 0]); } reg.CloseKey(); } // Find User typedef char MaxFind[MAX_NAMEBUF]; if (reg.CreateKey(FINDSTR_STR)) { reg.GetInt(FINDMAX_STR, &FindMax); reg.GetInt(FINDALL_STR, &FindAll); FindStr = new MaxFind[FindMax]; for (i=0; i < FindMax; i++) { char key[MAX_PATH_U8]; sprintf(key, "%d", i); if (!reg.GetStr(key, FindStr[i], sizeof(FindStr[i]))) FindStr[i][0] = '\0'; } reg.CloseKey(); } else { FindStr = new MaxFind[FindMax]; memset(FindStr, 0, MAX_NAMEBUF * FindMax); } reg.GetInt(LRUUSERMAX_STR, &lruUserMax); if (reg.OpenKey(LRUUSERKEY_STR)) { for (i=0; ; i++) { sprintf(buf, "%d", i); if (!reg.OpenKey(buf)) break; UsersObj *obj = new UsersObj; for (int j=0; ; j++) { sprintf(buf, "%d", j); if (!reg.OpenKey(buf)) break; UserObj *u = new UserObj; if (reg.GetStr(USERNAME_STR, u->hostSub.userName, sizeof(u->hostSub.userName)) && reg.GetStr(HOSTNAME_STR, u->hostSub.hostName, sizeof(u->hostSub.userName))) { obj->users.AddObj(u); } reg.CloseKey(); } reg.CloseKey(); lruUserList.AddObj(obj); } reg.CloseKey(); } *PasswordStr = 0; reg.GetStr(PASSWORD_STR, PasswordStr, sizeof(PasswordStr)); reg.GetInt(PASSWDLOGCHECK_STR, &PasswdLogCheck); reg.GetInt(DELAYTIME_STR, &DelayTime); reg.GetInt(QUOTECHECK_STR, &QuoteCheck); reg.GetInt(SECRETCHECK_STR, &SecretCheck); reg.GetInt(LOGONLOG_STR, &LogonLog); reg.GetInt(RECVLOGONDISP_STR, &RecvLogonDisp); reg.GetInt(IPADDRCHECK_STR, &IPAddrCheck); reg.GetInt(RECVIPADDRCHECK_STR, &RecvIPAddr); reg.GetInt(ONECLICKPOPUP_STR, &OneClickPopup); reg.GetInt(BALLOONNOTIFY_STR, &BalloonNotify); reg.GetInt(TRAYICON_STR, &TrayIcon); reg.GetInt(ABNORMALBTN_STR, &AbnormalButton); reg.GetInt(DIALUPCHECK_STR, &DialUpCheck); reg.GetInt(ABSENCENONPOPUP_STR, &AbsenceNonPopup); reg.GetStr(NICKNAMESTR_STR, NickNameStr, sizeof(NickNameStr)); StrictUTF8(NickNameStr); reg.GetStr(GROUPNAMESTR_STR, GroupNameStr, sizeof(GroupNameStr)); StrictUTF8(GroupNameStr); reg.GetLong(SORT_STR, (long *)&Sort); // reg.GetInt(UPDATETIME_STR, &UpdateTime); reg.GetInt(KEEPHOSTTIME_STR, &KeepHostTime); reg.GetInt(DEFAULTURL_STR, &DefaultUrl); reg.GetInt(SHELLEXEC_STR, &ShellExec); reg.GetInt(EXTENDENTRY_STR, &ExtendEntry); reg.GetInt(EXTENDBROADCAST_STR, &ExtendBroadcast); reg.GetInt(MULTICASTMODE_STR, &MulticastMode); reg.GetInt(CONTROLIME_STR, &ControlIME); reg.GetInt(GRIDLINE_STR, &GridLineCheck); reg.GetInt(COLUMNITEMS_STR, (int *)&ColumnItems); reg.GetStr(QUOTESTR_STR, QuoteStr, sizeof(QuoteStr)); if (reg.CreateKey(HOTKEY_STR)) { reg.GetInt(HOTKEYCHECK_STR, &HotKeyCheck); reg.GetInt(HOTKEYMODIFY_STR, &HotKeyModify); reg.GetInt(HOTKEYSEND_STR, &HotKeySend); reg.GetInt(HOTKEYRECV_STR, &HotKeyRecv); reg.GetInt(HOTKEYMISC_STR, &HotKeyMisc); reg.CloseKey(); } reg.GetInt(LOGCHECK_STR, &LogCheck); reg.GetInt(LOGUTF8_STR, &LogUTF8); if (!reg.GetStr(LOGFILE_STR, LogFile, sizeof(LogFile)) || !*LogFile) strncpyz(LogFile, "ipmsg.log", sizeof(LogFile)); LogMng::StrictLogFile(LogFile); reg.GetStr(SOUNDFILE_STR, SoundFile, sizeof(SoundFile)); reg.GetStr(ICON_STR, IconFile, sizeof(IconFile)); reg.GetStr(REVICON_STR, RevIconFile, sizeof(RevIconFile)); reg.GetStr(LASTOPEN_STR, lastOpenDir, sizeof(lastOpenDir)); reg.GetStr(LASTSAVE_STR, lastSaveDir, sizeof(lastSaveDir)); reg.GetStr(AUTOSAVEDIR_STR, autoSaveDir, sizeof(autoSaveDir)); reg.GetInt(AUTOSAVETOUT_STR, &autoSaveTout); reg.GetInt(AUTOSAVEMAX_STR, &autoSaveMax); reg.GetInt(AUTOSAVEFLAGS_STR, &autoSaveFlags); reg.GetInt(AUTOSAVELEVEL_STR, &autoSaveLevel); // Send/Recv Window Location if (reg.CreateKey(WINSIZE_STR)) { reg.GetInt(SENDNICKNAME_STR, &SendWidth[SW_NICKNAME]); reg.GetInt(SENDUSERNAME_STR, &SendWidth[SW_USER]); reg.GetInt(SENDABSENCE_STR, &SendWidth[SW_ABSENCE]); reg.GetInt(SENDPRIORITY_STR, &SendWidth[SW_PRIORITY]); reg.GetInt(SENDGROUPNAME_STR, &SendWidth[SW_GROUP]); reg.GetInt(SENDHOSTNAME_STR, &SendWidth[SW_HOST]); reg.GetInt(SENDIPADDR_STR, &SendWidth[SW_IPADDR]); if (reg.CreateKey(SENDORDER_STR)) { for (i=0; i < MAX_SENDWIDTH; i++) { sprintf(buf, "%d", i); reg.GetInt(buf, &SendOrder[i]); } reg.CloseKey(); } for (i=0; i < MAX_SENDWIDTH; i++) { if (SendOrder[i] >= MAX_SENDWIDTH || SendOrder[i] < 0) break; int i2; for (i2=i+1; i2 < MAX_SENDWIDTH; i2++) if (SendOrder[i] == SendOrder[i2]) break; if (i2 != MAX_SENDWIDTH) break; } if (i != MAX_SENDWIDTH) for (i=0; i < MAX_SENDWIDTH; i++) SendOrder[i] = i; reg.GetInt(SENDXDIFF_STR, &SendXdiff); reg.GetInt(SENDYDIFF_STR, &SendYdiff); reg.GetInt(SENDMIDYDIFF_STR, &SendMidYdiff); reg.GetInt(SENDSAVEPOS_STR, &SendSavePos); reg.GetInt(SENDXPOS_STR, &SendXpos); reg.GetInt(SENDYPOS_STR, &SendYpos); reg.GetInt(RECVXDIFF_STR, &RecvXdiff); reg.GetInt(RECVYDIFF_STR, &RecvYdiff); reg.GetInt(RECVSAVEPOS_STR, &RecvSavePos); reg.GetInt(RECVXPOS_STR, &RecvXpos); reg.GetInt(RECVYPOS_STR, &RecvYpos); reg.GetInt(HISTXDIFF_STR, &HistXdiff); reg.GetInt(HISTYDIFF_STR, &HistYdiff); reg.GetInt(HISTUSER_STR, &HistWidth[HW_USER]); reg.GetInt(HISTODATE_STR, &HistWidth[HW_ODATE]); reg.GetInt(HISTSDATE_STR, &HistWidth[HW_SDATE]); reg.GetInt(HISTID_STR, &HistWidth[HW_ID]); reg.CloseKey(); } // Send/Recv Window Font if (reg.CreateKey(FONT_STR)) { ReadFontRegistry(®, SENDEDITFONT_STR, &SendEditFont); ReadFontRegistry(®, SENDLISTFONT_STR, &SendListFont); ReadFontRegistry(®, RECVHEADFONT_STR, &RecvHeadFont); ReadFontRegistry(®, RECVEDITFONT_STR, &RecvEditFont); ReadFontRegistry(®, LOGVIEWFONT_STR, &LogViewFont); reg.CloseKey(); } // Broadcast Data if (reg.CreateKey(BROADCAST_STR)) { i = 0; while (1) { sprintf(buf, "%d", i++); if (!reg.GetStr(buf, val, sizeof(val))) break; brList.SetHostRaw(val, (ResolveOpt & RS_REALTIME) ? 0 : ResolveAddr(val)); } reg.CloseKey(); } // Clickable URL for (i=0; DefaultUrlProtocol[i]; i++) { UrlObj *obj = new UrlObj; strncpyz(obj->protocol, DefaultUrlProtocol[i], sizeof(obj->protocol)); *obj->program = 0; urlList.AddObj(obj); } if (reg.CreateKey(CLICKABLEURL_STR)) { for (i = 0; reg.EnumValue(i, buf, sizeof(buf)) || reg.EnumKey(i, buf, sizeof(buf)); i++) { UrlObj *obj; for (obj = urlList.TopObj(); obj; obj = urlList.NextObj(obj)) if (stricmp(obj->protocol, buf) == 0) break; if (obj == NULL) { obj = new UrlObj; urlList.AddObj(obj); } strncpyz(obj->protocol, buf, sizeof(obj->protocol)); reg.GetStr(buf, obj->program, sizeof(obj->program)); } reg.CloseKey(); } // User Sort Priority if (reg.CreateKey(PRIORITY_STR)) { reg.GetInt(PRIORITYMAX_STR, &PriorityMax); reg.GetInt(PRIORITYREJECT_STR, &PriorityReject); #if 0 PrioritySound = new char *[PriorityMax]; for (int i=0; i < PriorityMax; i++) { sprintf(buf, "%d", i); if (reg.CreateKey(buf)) { if (reg.GetStr(PRIORITYSOUND_STR, buf, sizeof(buf)) && *buf != '\0') PrioritySound[i] = strdup(buf); reg.CloseKey(); } } #endif reg.CloseKey(); } if (reg.CreateKey(HOSTINFO_STR)) { int i = 0, priority = DEFAULT_PRIORITY; Host *host; Time_t default_time = Time() - KeepHostTime / 2; // 90 日 BOOL rewriteFlg = FALSE; priorityHosts.Enable(THosts::NAME, TRUE); fileHosts.Enable(THosts::NAME_ADDR, TRUE); for (i = 0; reg.EnumValue(i, buf, sizeof(buf)) || reg.EnumKey(i, buf, sizeof(buf)); i++) { if (!reg.OpenKey(buf)) break; BYTE pubkey[512]; int pubkeySize = sizeof(pubkey); if (!reg.GetByte(PUBLICKEY_STR, pubkey, &pubkeySize)) pubkeySize = 0; if ((!reg.GetInt(PRIORITY_STR, &priority) || priority == DEFAULT_PRIORITY) && pubkeySize == 0) { rewriteFlg = TRUE; } else { host = new Host; host->priority = priority; reg.GetStr(USERNAME_STR, host->hostSub.userName, MAX_NAMEBUF); reg.GetStr(HOSTNAME_STR, host->hostSub.hostName, MAX_NAMEBUF); reg.GetLong(IPADDR_STR, (long *)&host->hostSub.addr); reg.GetInt(PORTNO_STR, &host->hostSub.portNo); reg.GetStr(NICKNAME_STR, host->nickName, MAX_NAMEBUF); reg.GetStr(GROUPNAME_STR, host->groupName, MAX_NAMEBUF); reg.GetStr(ALTERNAME_STR, host->alterName, MAX_NAMEBUF); if (!reg.GetLong(UPDATETIME_STR, (long *)&host->updateTime)) { host->updateTime = default_time; } if (pubkeySize) { host->pubKey.UnSerialize(pubkey, pubkeySize); // 古いエントリを削除にする処理は、一旦、様子見 // char *p = (char *)GetUserNameDigestField(host->hostSub.userName); // if (p) { // *p = 0; // Host *tmpHost = priorityHosts.GetHostByName(&host->hostSub); // if (tmpHost) { // priorityHosts.DelHost(tmpHost); // if (tmpHost->RefCnt() == 0) delete tmpHost; // } // *p = '-'; // } } priorityHosts.AddHost(host); } reg.CloseKey(); } reg.CloseKey(); if (rewriteFlg) WriteRegistry(CFG_HOSTINFO|CFG_DELHOST); } // Self private/public key (1024/2048) for (i=KEY_1024; i <= KEY_2048; i++) { const char *key = (i == KEY_1024) ? CRYPT_STR : CRYPT2_STR; int need_blob_size = ((i == KEY_1024) ? 1024 : 2048) / 8 * 4; if (reg.CreateKey(key)) { BYTE key[MAX_BUF_EX]; int blen = sizeof(key); int slen = sizeof(key); if (reg.GetByte(PRIVBLOB_STR, key, &blen) && blen > need_blob_size) { priv[i].SetBlob(key, blen); } if (reg.GetByte(PRIVSEED_STR, key, &slen)) { priv[i].SetSeed(key, slen); } reg.GetInt(PRIVTYPE_STR, &priv[i].encryptType); reg.CloseKey(); } } if (reg.OpenKey(DEBUG_STR)) // 旧バージョンレジストリ削除 { reg.CloseKey(); reg.DeleteChildTree(); } if (!reg.GetStr(NULL, buf, sizeof(buf)) || strcmp(buf, GetVersionStr())) { reg.CloseKey(); // close top appreg WriteRegistry(); } return TRUE; }
BOOL TInstDlg::Install(void) { char buf[MAX_PATH_U8], setupDir[MAX_PATH_U8], setupPath[MAX_PATH_U8]; char installPath[MAX_PATH_U8]; BOOL extract_only = IsDlgButtonChecked(EXTRACT_CHECK); // 現在、起動中の ipmsg を終了 int st = extract_only ? 0 : TerminateIPMsg(); if (st == 1) return FALSE; // インストールパス設定 GetDlgItemTextU8(FILE_EDIT, setupDir, sizeof(setupDir)); if (IsWinVista() && !::IsUserAnAdmin() && TIsEnableUAC() && TIsVirtualizedDirW(U8toWs(setupDir))) { if (MessageBox(GetLoadStr(IDS_REQUIREADMIN), INSTALL_STR, MB_OKCANCEL|MB_ICONINFORMATION) != IDOK) return FALSE; return RunAsAdmin(hWnd, TRUE); } CreateDirectoryU8(setupDir, NULL); DWORD attr = GetFileAttributesU8(setupDir); if (attr == 0xffffffff || (attr & FILE_ATTRIBUTE_DIRECTORY) == 0) return MessageBox(GetLoadStr(IDS_NOTCREATEDIR), INSTALL_STR), FALSE; MakePath(setupPath, setupDir, IPMSG_EXENAME); if (st == 2) { MessageBox(GetLoadStr(IDS_CANTTERMINATE), INSTALL_STR); return FALSE; } if (!runasImm && MessageBox(GetLoadStr(IDS_START), INSTALL_STR, MB_OKCANCEL|MB_ICONINFORMATION) != IDOK) { return FALSE; } runasImm = FALSE; // ファイル生成 for (int i=0; SetupFiles[i]; i++) { MakePath(installPath, setupDir, SetupFiles[i]); CreateStatus cs = CreateFileBySelf(installPath, SetupFiles[i]); if (cs == CS_BROKEN) { MessageBox(GetLoadStr(IDS_BROKENARCHIVE), INSTALL_STR); return FALSE; } else if (cs == CS_ACCESS) { const char *msg = Fmt("%s\r\n%s", GetLoadStrU8(IDS_NOTCREATEFILE), installPath); MessageBoxU8(msg, INSTALL_STR); return FALSE; } } // 展開のみ if (extract_only) { ShellExecuteW(NULL, NULL, U8toWs(setupDir), 0, 0, SW_SHOW); return TRUE; } // スタートアップ&デスクトップに登録 TRegistry reg(HKEY_CURRENT_USER); if (reg.OpenKey(REGSTR_SHELLFOLDERS)) { char *regStr[] = { REGSTR_STARTUP, REGSTR_PROGRAMS, REGSTR_DESKTOP, NULL }; BOOL resId[] = { STARTUP_CHECK, PROGRAM_CHECK, DESKTOP_CHECK, NULL }; for (int i=0; regStr[i]; i++) { if (reg.GetStr(regStr[i], buf, sizeof(buf))) { if (i != 0 || !RemoveSameLink(buf, buf)) ::wsprintf(buf + strlen(buf), "\\%s", IPMSG_SHORTCUT_NAME); if (IsDlgButtonChecked(resId[i])) SymLink(setupPath, buf); else DeleteLink(buf); } } reg.CloseKey(); } // レジストリにアプリケーション情報を登録 reg.ChangeTopKey(HKEY_LOCAL_MACHINE); if (reg.OpenKey(REGSTR_PATH_APPPATHS)) { if (reg.CreateKey(IPMSG_EXENAME)) { reg.SetStr(NULL, setupPath); reg.SetStr(REGSTR_PATH, setupDir); reg.CloseKey(); } reg.CloseKey(); } // レジストリにアンインストール情報を登録 if (reg.OpenKey(REGSTR_PATH_UNINSTALL)) { if (reg.CreateKey(IPMSG_NAME)) { MakePath(buf, setupDir, SETUP_EXENAME); strcat(buf, " /r"); reg.SetStr(REGSTR_VAL_UNINSTALLER_DISPLAYNAME, IPMSG_FULLNAME); reg.SetStr(REGSTR_VAL_UNINSTALLER_COMMANDLINE, buf); reg.CloseKey(); } reg.CloseKey(); } // コピーしたアプリケーションを起動 const char *msg = GetLoadStr(IDS_SETUPCOMPLETE); int flg = MB_OKCANCEL|MB_ICONINFORMATION; // if (IsWinVista() && ::IsUserAnAdmin() && TIsEnableUAC()) { // msg = Fmt("%s%s", msg, GetLoadStr(IDS_COMPLETE_UACADD)); // flg |= MB_DEFBUTTON2; // } TLaunchDlg dlg(msg, this); if (dlg.Exec() == IDOK) { if (runasWnd) { Wstr wbuf(setupDir); if (::SendDlgItemMessageW(runasWnd, FILE_EDIT, WM_SETTEXT, 0, (LPARAM)wbuf.Buf())) { ::PostMessage(runasWnd, WM_IPMSG_QUIT, 1, 0); runasWnd = NULL; } } else { AppKick(); } } else { HWND hHelp = ShowHelpU8(0, setupDir, GetLoadStrU8(IDS_IPMSGHELP), "#history"); if (hHelp) { Show(SW_HIDE); while (::IsWindow(hHelp)) { this->Sleep(100); } } } if (runasWnd) { ::PostMessage(runasWnd, WM_IPMSG_QUIT, 0, 0); runasWnd = NULL; } // ShellExecuteU8(NULL, NULL, setupDir, 0, 0, SW_SHOW); ::PostQuitMessage(0); return TRUE; }
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; }
BOOL TUninstDlg::UnInstall(void) { // 現在、起動中の ipmsg を終了 int st = TerminateIPMsg(); if (st == 1) return FALSE; if (st == 2) { if (!IsWinVista() || TIsUserAnAdmin() || !TIsEnableUAC()) { MessageBox(GetLoadStr(IDS_CANTTERMINATE), UNINSTALL_STR); return FALSE; } if (MessageBox(GetLoadStr(IDS_REQUIREADMIN_TERM), "", MB_OKCANCEL|MB_ICONINFORMATION) != IDOK) return FALSE; return RunAsAdmin(hWnd); } if (!runasWnd && MessageBox(GetLoadStr(IDS_START), UNINSTALL_STR, MB_OKCANCEL|MB_ICONINFORMATION) != IDOK) return FALSE; // 公開鍵削除 if (IsDlgButtonChecked(DELPUBKEY_CHECK)) { BOOL need_admin = FALSE; char contName[MAX_PATH_U8], userName[MAX_PATH_U8]; DWORD size = sizeof(userName); ::GetUserName(userName, &size); ::wsprintf(contName, "ipmsg.rsa2048.%s", userName); if (!DeleteKeySet(MS_ENHANCED_PROV, contName, CRYPT_MACHINE_KEYSET) || !DeleteKeySet(MS_ENHANCED_PROV, contName, 0)) need_admin = TRUE; ::wsprintf(contName, "ipmsg.rsa1024.%s", userName); if (!DeleteKeySet(MS_ENHANCED_PROV, contName, CRYPT_MACHINE_KEYSET) || !DeleteKeySet(MS_ENHANCED_PROV, contName, 0)) need_admin = TRUE; ::wsprintf(contName, "ipmsg.rsa512.%s", userName); if (!DeleteKeySet(MS_DEF_PROV, contName, CRYPT_MACHINE_KEYSET) || !DeleteKeySet(MS_DEF_PROV, contName, 0)) need_admin = TRUE; if (need_admin) { if (IsWinVista() && !TIsUserAnAdmin() && TIsEnableUAC()) { if (MessageBox(GetLoadStr(IDS_REQUIREADMIN_PUBKEY), "", MB_OKCANCEL|MB_ICONINFORMATION) != IDOK) return FALSE; return RunAsAdmin(hWnd); } } } // スタートアップ&デスクトップから削除 TRegistry reg(HKEY_CURRENT_USER); if (reg.OpenKey(REGSTR_SHELLFOLDERS)) { char buf[MAX_PATH_U8]; char *regStr[] = { REGSTR_STARTUP, REGSTR_PROGRAMS, REGSTR_DESKTOP, NULL }; for (int i=0; regStr[i]; i++) { if (reg.GetStr(regStr[i], buf, sizeof(buf))) { if (i == 0) RemoveSameLink(buf); ::wsprintf(buf + strlen(buf), "\\%s", IPMSG_SHORTCUT_NAME); DeleteLink(buf); } } reg.CloseKey(); } // レジストリからユーザー設定情報を削除 if (reg.ChangeApp(HSTOOLS_STR)) reg.DeleteChildTree(GetLoadStr(IDS_REGIPMSG)); // レジストリからアプリケーション情報を削除 char setupDir[MAX_PATH_U8]; // セットアップディレクトリ情報を保存 GetDlgItemTextU8(RESETUP_EDIT, setupDir, sizeof(setupDir)); reg.ChangeTopKey(HKEY_LOCAL_MACHINE); if (reg.OpenKey(REGSTR_PATH_APPPATHS)) { if (reg.OpenKey(IPMSG_EXENAME)) { reg.GetStr(REGSTR_PATH, setupDir, sizeof(setupDir)); reg.CloseKey(); } reg.DeleteKey(IPMSG_EXENAME); reg.CloseKey(); } // レジストリからアンインストール情報を削除 if (reg.OpenKey(REGSTR_PATH_UNINSTALL)) { reg.DeleteKey(IPMSG_NAME); reg.CloseKey(); } // 終了メッセージ MessageBox(GetLoadStr(IDS_UNINSTCOMPLETE)); // インストールディレクトリを開く if (GetDriveTypeEx(setupDir) != DRIVE_REMOTE) ShellExecuteU8(NULL, NULL, setupDir, 0, 0, SW_SHOW); ::PostQuitMessage(0); return TRUE; }
/* メインダイアログ用 WM_INITDIALOG 処理ルーチン */ BOOL TInstDlg::EvCreate(LPARAM lParam) { char title[256], title2[256]; GetWindowText(title, sizeof(title)); ::wsprintf(title2, "%s ver%s", title, GetVersionStr()); SetWindowText(title2); GetWindowRect(&rect); int cx = ::GetSystemMetrics(SM_CXFULLSCREEN), cy = ::GetSystemMetrics(SM_CYFULLSCREEN); int xsize = rect.right - rect.left, ysize = rect.bottom - rect.top; ::SetClassLong(hWnd, GCL_HICON, (LONG)::LoadIcon(TApp::GetInstance(), (LPCSTR)SETUP_ICON)); MoveWindow((cx - xsize)/2, (cy - ysize)/2, xsize, ysize, TRUE); Show(); if (IsWinVista() && !::IsUserAnAdmin() && TIsEnableUAC()) { HWND hRunas = GetDlgItem(RUNAS_BUTTON); ::SetWindowLong(hRunas, GWL_STYLE, ::GetWindowLong(hRunas, GWL_STYLE)|WS_VISIBLE); ::SendMessage(hRunas, BCM_SETSHIELD, 0, 1); } // 現在ディレクトリ設定 char buf[MAX_PATH_U8], setupDir[MAX_PATH_U8]; #ifdef _WIN64 char x86dir[MAX_PATH_U8] = ""; #endif // Program Filesのパス取り出し TRegistry reg(HKEY_LOCAL_MACHINE); if (reg.OpenKey(REGSTR_PATH_SETUP)) { if (reg.GetStr(REGSTR_PROGRAMFILES, buf, sizeof(buf))) { MakePath(setupDir, buf, IPMSG_STR); } #ifdef _WIN64 if (reg.GetStr(REGSTR_PROGRAMFILESX86, buf, sizeof(buf))) MakePath(x86dir, buf, IPMSG_STR); #endif reg.CloseKey(); } // 既にセットアップされている場合は、セットアップディレクトリを読み出す if (reg.OpenKey(REGSTR_PATH_APPPATHS)) { if (reg.OpenKey(IPMSG_EXENAME)) { if (reg.GetStr(REGSTR_PATH, buf, sizeof(buf))) { #ifdef _WIN64 if (strcmp(buf, x86dir)) #endif strcpy(setupDir, buf); } reg.CloseKey(); } reg.CloseKey(); } SetDlgItemTextU8(FILE_EDIT, setupDir); CheckDlgButton(STARTUP_CHECK, 1); CheckDlgButton(PROGRAM_CHECK, 1); CheckDlgButton(DESKTOP_CHECK, 1); CheckDlgButton(EXTRACT_CHECK, 0); char *p = strstr(GetCommandLine(), "runas="); if (p) { runasWnd = (HWND)strtoul(p+6, 0, 16); if (!runasWnd || !IsWindow(runasWnd)) PostQuitMessage(0); if ((p = strstr(p, ",imm="))) runasImm = atoi(p+5); CheckDlgButton(EXTRACT_CHECK, ::IsDlgButtonChecked(runasWnd, EXTRACT_CHECK)); CheckDlgButton(STARTUP_CHECK, ::IsDlgButtonChecked(runasWnd, STARTUP_CHECK)); CheckDlgButton(PROGRAM_CHECK, ::IsDlgButtonChecked(runasWnd, PROGRAM_CHECK)); CheckDlgButton(DESKTOP_CHECK, ::IsDlgButtonChecked(runasWnd, DESKTOP_CHECK)); WCHAR wbuf[MAX_PATH] = L""; ::SendDlgItemMessageW(runasWnd, FILE_EDIT, WM_GETTEXT, MAX_PATH, (LPARAM)wbuf); SetDlgItemTextU8(FILE_EDIT, WtoU8s(wbuf)); ::SendMessage(runasWnd, WM_IPMSG_HIDE, 0, 0); if (runasImm) { PostMessage(WM_IPMSG_INSTALL, 0, 0); } } return TRUE; }
void Ctrl::InitWin32(HINSTANCE hInstance) { GuiLock __; LLOG("InitWin32"); InstallPanicMessageBox(&Win32PanicMessageBox); // RLOGBLOCK("Ctrl::InitWin32"); sMainThreadId = GetCurrentThreadId(); #define ILOG(x) // RLOG(x) Ctrl::hInstance = hInstance; ILOG("RegisterClassW"); #ifndef PLATFORM_WINCE if(IsWinNT()) #endif { WNDCLASSW wc; Zero(wc); wc.style = CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW; wc.lpfnWndProc = (WNDPROC)Ctrl::WndProc; wc.hInstance = hInstance; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = IsWinVista() ? (HBRUSH)(COLOR_WINDOW+1) : (HBRUSH)NULL; wc.lpszClassName = L"UPP-CLASS-W"; RegisterClassW(&wc); wc.style = 0x20000|CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW; wc.lpszClassName = L"UPP-CLASS-DS-W"; RegisterClassW(&wc); wc.style = CS_SAVEBITS|CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW; wc.lpszClassName = L"UPP-CLASS-SB-W"; RegisterClassW(&wc); wc.style = 0x20000|CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW|CS_SAVEBITS; wc.lpszClassName = L"UPP-CLASS-SB-DS-W"; RegisterClassW(&wc); } ILOG("RegisterClassA"); WNDCLASS wc; Zero(wc); wc.style = CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW; wc.lpfnWndProc = (WNDPROC)Ctrl::WndProc; wc.hInstance = hInstance; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = IsWinVista() ? (HBRUSH)(COLOR_WINDOW+1) : (HBRUSH)NULL; wc.lpszClassName = L_("UPP-CLASS-A"); RegisterClass(&wc); if(IsWinXP()) { wc.style = 0x20000|CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW; wc.lpszClassName = L_("UPP-CLASS-DS-A"); RegisterClass(&wc); } wc.style = CS_SAVEBITS|CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW; wc.lpszClassName = L_("UPP-CLASS-SB-A"); RegisterClass(&wc); if(IsWinXP()) { wc.style = 0x20000|CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW|CS_SAVEBITS; wc.lpszClassName = L_("UPP-CLASS-SB-DS-A"); RegisterClass(&wc); } wc.style = 0; wc.lpszClassName = L_("UPP-TIMER"); wc.hCursor = NULL; wc.lpfnWndProc = &Ctrl::UtilityProc; RegisterClass(&wc); ILOG("InitTimer"); InitTimer(); ILOG("SetTimer"); utilityHWND = CreateWindow(L_("UPP-TIMER"), L_(""), WS_OVERLAPPED, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); SetTimer(utilityHWND, 1, 10, NULL); ILOG("Windows"); Windows(); //?? TRC: what's the use of this? ReSkin(); OleInitialize(NULL); /* TRC 05/11/14: moved to GuiSleep to avoid thread creation in OCX DllMain DWORD dummy; OverwatchThread = CreateThread(NULL, 0x100000, Win32OverwatchThread, NULL, 0, &dummy); ExitLoopEvent().Wait(); */ // TRC 05/11/18: pSetLayeredWindowAttributes moved to GLOBAL_VAR (see below) to make OCX initialization simpler Csizeinit(); #undef ILOG if(IsWin7()) GlobalBackPaint(); }
void TInetAsync(LPCSTR host, LPCSTR path, HWND hWnd, UINT uMsg, int64 id) { TInetRequestAsync(host, path, NULL, 0, hWnd, uMsg, id, (IsWinVista() ? INETREQ_SECURE : 0)|INETREQ_GET); // XPはhttps://ipmsg.orgに接続できない }