OSDN Git Service

Add options for disabling weak encryption methods.
[ffftp/ffftp.git] / main.c
diff --git a/main.c b/main.c
index 1273199..7228645 100644 (file)
--- a/main.c
+++ b/main.c
 /============================================================================*/\r
 \r
 #define  STRICT\r
+// IPv6対応\r
+#include <winsock2.h>\r
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
 #include <string.h>\r
 #include <mbstring.h>\r
+// 自動切断対策\r
+#include <time.h>\r
 #include <malloc.h>\r
 #include <windowsx.h>\r
 #include <commctrl.h>\r
 #include <stdarg.h>\r
-#include <winsock.h>\r
+// IPv6対応\r
+//#include <winsock.h>\r
+// タスクバー進捗表示\r
+#include <shobjidl.h>\r
 \r
 #include "common.h"\r
 #include "resource.h"\r
@@ -48,6 +55,9 @@
 #include <htmlhelp.h>\r
 #include "helpid.h"\r
 \r
+// ソフトウェア自動更新\r
+#include "updater.h"\r
+\r
 // UTF-8対応\r
 #undef __MBSWRAPPER_H__\r
 #include "mbswrapper.h"\r
@@ -81,7 +91,9 @@ static void CalcWinSize(void);
 static void CheckResizeFrame(WPARAM Keys, int x, int y);\r
 static void DispDirInfo(void);\r
 static void DeleteAlltempFile(void);\r
-static BOOL CALLBACK AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);\r
+// 64ビット対応\r
+//static BOOL CALLBACK AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);\r
+static INT_PTR CALLBACK AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);\r
 static int EnterMasterPasswordAndSet( int Res, HWND hWnd );\r
 \r
 /*===== ローカルなワーク =====*/\r
@@ -123,10 +135,28 @@ char FilterStr[FILTER_EXT_LEN+1] = { "*" };
 \r
 int CancelFlg;\r
 \r
-static int SuppressRefresh = 0;\r
+// 外部アプリケーションへドロップ後にローカル側のファイル一覧に作業フォルダが表示されるバグ対策\r
+//static int SuppressRefresh = 0;\r
+int SuppressRefresh = 0;\r
 \r
 static DWORD dwCookie;\r
 \r
+// 暗号化通信対応\r
+static char SSLRootCAFilePath[FMAX_PATH+1];\r
+// マルチコアCPUの特定環境下でファイル通信中にクラッシュするバグ対策\r
+static DWORD MainThreadId;\r
+// ポータブル版判定\r
+static char PortableFilePath[FMAX_PATH+1];\r
+static int PortableVersion;\r
+// ローカル側自動更新\r
+HANDLE ChangeNotification = INVALID_HANDLE_VALUE;\r
+// タスクバー進捗表示\r
+static ITaskbarList3* pTaskbarList3;\r
+// 高DPI対応\r
+static int ToolWinHeight;\r
+// ソフトウェア自動更新\r
+static int ApplyUpdatesOnExit = NO;\r
+\r
 \r
 /*===== グローバルなワーク =====*/\r
 \r
@@ -135,12 +165,20 @@ HWND hHelpWin = NULL;
 /* 設定値 */\r
 int WinPosX = CW_USEDEFAULT;\r
 int WinPosY = 0;\r
-int WinWidth = 630;\r
-int WinHeight = 393;\r
-int LocalWidth = 309;\r
-int TaskHeight = 50;\r
-int LocalTabWidth[4] = { 120, 90, 60, 37 };\r
-int RemoteTabWidth[6] = { 120, 90, 60, 37, 60, 60 };\r
+// 機能が増えたためサイズ変更\r
+// VGAサイズに収まるようになっていたのをSVGAサイズに引き上げ\r
+//int WinWidth = 630;\r
+//int WinHeight = 393;\r
+//int LocalWidth = 309;\r
+//int TaskHeight = 50;\r
+//int LocalTabWidth[4] = { 120, 90, 60, 37 };\r
+//int RemoteTabWidth[6] = { 120, 90, 60, 37, 60, 60 };\r
+int WinWidth = 790;\r
+int WinHeight = 513;\r
+int LocalWidth = 389;\r
+int TaskHeight = 100;\r
+int LocalTabWidth[4] = { 150, 120, 60, 37 };\r
+int RemoteTabWidth[6] = { 150, 120, 60, 37, 60, 60 };\r
 char UserMailAdrs[USER_MAIL_LEN+1] = { "who@example.com" };\r
 char ViewerName[VIEWERS][FMAX_PATH+1] = { { "notepad" }, { "" }, { "" } };\r
 HFONT ListFont = NULL;\r
@@ -153,7 +191,9 @@ int TransMode = TYPE_X;
 int ConnectOnStart = YES;\r
 int DebugConsole = NO;\r
 int SaveWinPos = NO;\r
-char AsciiExt[ASCII_EXT_LEN+1] = { "*.txt\0*.html\0*.htm\0*.cgi\0*.pl\0" };\r
+// アスキーモード判別の改良\r
+//char AsciiExt[ASCII_EXT_LEN+1] = { "*.txt\0*.html\0*.htm\0*.cgi\0*.pl\0" };\r
+char AsciiExt[ASCII_EXT_LEN+1] = { "*.txt\0*.html\0*.htm\0*.cgi\0*.pl\0*.js\0*.vbs\0*.css\0*.rss\0*.rdf\0*.xml\0*.xhtml\0*.xht\0*.shtml\0*.shtm\0*.sh\0*.py\0*.rb\0*.properties\0*.sql\0*.asp\0*.aspx\0*.php\0*.htaccess\0" };\r
 int RecvMode = TRANS_DLG;\r
 int SendMode = TRANS_DLG;\r
 int MoveMode = MOVE_DLG;\r
@@ -180,10 +220,12 @@ int FwallPort = PORT_NOR;
 int FwallType = 1;\r
 int FwallDefault = NO;\r
 int FwallSecurity = SECURITY_AUTO;\r
-int FwallResolv = NO;\r
+int FwallResolve = NO;\r
 int FwallLower = NO;\r
 int FwallDelimiter = '@';\r
-int PasvDefault = NO;\r
+// ルータ対策\r
+//int PasvDefault = NO;\r
+int PasvDefault = YES;\r
 char MirrorNoTrn[MIRROR_LEN+1] = { "*.bak\0" };\r
 char MirrorNoDel[MIRROR_LEN+1] = { "" };\r
 int MirrorFnameCnv = NO;\r
@@ -210,10 +252,38 @@ int MirUpDelNotify = YES;
 int MirDownDelNotify = YES; \r
 int FolderAttr = NO;\r
 int FolderAttrNum = 777;\r
-// 同時接続対応\r
-int MaxThreadCount = 1;\r
 // 暗号化通信対応\r
 BYTE CertificateCacheHash[MAX_CERT_CACHE_HASH][20];\r
+BYTE SSLRootCAFileHash[20];\r
+// ファイルアイコン表示対応\r
+int DispFileIcon = NO;\r
+// タイムスタンプのバグ修正\r
+int DispTimeSeconds = NO;\r
+// ファイルの属性を数字で表示\r
+int DispPermissionsNumber = NO;\r
+// ディレクトリ自動作成\r
+int MakeAllDir = YES;\r
+// UTF-8対応\r
+int LocalKanjiCode = KANJI_SJIS;\r
+// 自動切断対策\r
+int NoopEnable = NO;\r
+// UPnP対応\r
+int UPnPEnabled = YES;\r
+time_t LastDataConnectionTime = 0;\r
+// 全設定暗号化対応\r
+int EncryptAllSettings = NO;\r
+// ローカル側自動更新\r
+int AutoRefreshFileList = YES;\r
+// 古い処理内容を消去\r
+int RemoveOldLog = NO;\r
+// バージョン確認\r
+int ReadOnlySettings = NO;\r
+// ソフトウェア自動更新\r
+int AutoCheckForUpdates = YES;\r
+int AutoApplyUpdates = NO;\r
+int AutoCheckForUptatesInterval = 7;\r
+time_t LastAutoCheckForUpdates = 0;\r
+\r
 \r
 \r
 \r
@@ -235,74 +305,104 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLi
     MSG Msg;\r
        int Ret;\r
        BOOL Sts;\r
+       // ソフトウェア自動更新\r
+       char UpdateDir[FMAX_PATH+1];\r
+       char Path[FMAX_PATH+1];\r
+       char Command[FMAX_PATH+1];\r
+       char* p;\r
 \r
        // プロセス保護\r
 #ifdef ENABLE_PROCESS_PROTECTION\r
-       DWORD ProtectLevel;\r
-       char* pCommand;\r
-       char Option[FMAX_PATH+1];\r
-       ProtectLevel = PROCESS_PROTECTION_NONE;\r
-       pCommand = lpszCmdLine;\r
-       while(pCommand = GetToken(pCommand, Option))\r
        {\r
-               if(strcmp(Option, "--protect") == 0)\r
-               {\r
-                       ProtectLevel = PROCESS_PROTECTION_DEFAULT;\r
-                       break;\r
-               }\r
-               else if(strcmp(Option, "--protect-high") == 0)\r
-               {\r
-                       ProtectLevel = PROCESS_PROTECTION_HIGH;\r
-                       break;\r
-               }\r
-               else if(strcmp(Option, "--protect-medium") == 0)\r
-               {\r
-                       ProtectLevel = PROCESS_PROTECTION_MEDIUM;\r
-                       break;\r
-               }\r
-               else if(strcmp(Option, "--protect-low") == 0)\r
+               DWORD ProtectLevel;\r
+               char* pCommand;\r
+               char Option[FMAX_PATH+1];\r
+               ProtectLevel = PROCESS_PROTECTION_NONE;\r
+               pCommand = lpszCmdLine;\r
+               while(pCommand = GetToken(pCommand, Option))\r
                {\r
-                       ProtectLevel = PROCESS_PROTECTION_LOW;\r
-                       break;\r
+                       if(Option[0] == '-')\r
+                       {\r
+                               if(strcmp(&Option[1], "-protect") == 0)\r
+                               {\r
+                                       ProtectLevel = PROCESS_PROTECTION_DEFAULT;\r
+                                       break;\r
+                               }\r
+                               else if(strcmp(&Option[1], "-protect-high") == 0)\r
+                               {\r
+                                       ProtectLevel = PROCESS_PROTECTION_HIGH;\r
+                                       break;\r
+                               }\r
+                               else if(strcmp(&Option[1], "-protect-medium") == 0)\r
+                               {\r
+                                       ProtectLevel = PROCESS_PROTECTION_MEDIUM;\r
+                                       break;\r
+                               }\r
+                               else if(strcmp(&Option[1], "-protect-low") == 0)\r
+                               {\r
+                                       ProtectLevel = PROCESS_PROTECTION_LOW;\r
+                                       break;\r
+                               }\r
+                       }\r
                }\r
-       }\r
-       if(ProtectLevel != PROCESS_PROTECTION_NONE)\r
-       {\r
-               SetProcessProtectionLevel(ProtectLevel);\r
-               if(!InitializeLoadLibraryHook())\r
+               if(ProtectLevel != PROCESS_PROTECTION_NONE)\r
                {\r
-                       MessageBox(NULL, MSGJPN321, "FFFTP", MB_OK | MB_ICONERROR);\r
-                       return 0;\r
-               }\r
+                       SetProcessProtectionLevel(ProtectLevel);\r
+                       if(!InitializeLoadLibraryHook())\r
+                       {\r
+                               MessageBox(NULL, MSGJPN321, "FFFTP", MB_OK | MB_ICONERROR);\r
+                               return 0;\r
+                       }\r
 #ifndef _DEBUG\r
-               if(IsDebuggerPresent())\r
-               {\r
-                       MessageBox(NULL, MSGJPN322, "FFFTP", MB_OK | MB_ICONERROR);\r
-                       return 0;\r
-               }\r
+                       if(IsDebuggerPresent())\r
+                       {\r
+                               MessageBox(NULL, MSGJPN322, "FFFTP", MB_OK | MB_ICONERROR);\r
+                               return 0;\r
+                       }\r
 #endif\r
-               if(!UnloadUntrustedModule())\r
-               {\r
-                       MessageBox(NULL, MSGJPN323, "FFFTP", MB_OK | MB_ICONERROR);\r
-                       return 0;\r
-               }\r
+                       if(!UnloadUntrustedModule())\r
+                       {\r
+                               MessageBox(NULL, MSGJPN323, "FFFTP", MB_OK | MB_ICONERROR);\r
+                               return 0;\r
+                       }\r
 #ifndef _DEBUG\r
-               if(RestartProtectedProcess(" --restart"))\r
-                       return 0;\r
+                       if(RestartProtectedProcess(" --restart"))\r
+                               return 0;\r
 #endif\r
-               if(!EnableLoadLibraryHook(TRUE))\r
-               {\r
-                       MessageBox(NULL, MSGJPN324, "FFFTP", MB_OK | MB_ICONERROR);\r
-                       return 0;\r
+                       if(!EnableLoadLibraryHook(TRUE))\r
+                       {\r
+                               MessageBox(NULL, MSGJPN324, "FFFTP", MB_OK | MB_ICONERROR);\r
+                               return 0;\r
+                       }\r
                }\r
+               else\r
+                       InitializeLoadLibraryHook();\r
        }\r
-       else\r
-               InitializeLoadLibraryHook();\r
 #endif\r
 \r
+       // ソフトウェア自動更新\r
+       if(GetTokenAfterOption(lpszCmdLine, UpdateDir, "-software-update", "-software-update"))\r
+       {\r
+               if(!RestartUpdateProcessAsAdministrator(lpszCmdLine, " --restart"))\r
+               {\r
+                       Sleep(1000);\r
+                       if(ApplyUpdates(UpdateDir, "updatebackup"))\r
+                               MessageBox(NULL, MSGJPN359, "FFFTP", MB_OK);\r
+                       else\r
+                               MessageBox(NULL, MSGJPN360, "FFFTP", MB_OK | MB_ICONERROR);\r
+               }\r
+               return 0;\r
+       }\r
+       else if(GetTokenAfterOption(lpszCmdLine, UpdateDir, "-software-cleanup", "-software-cleanup"))\r
+       {\r
+               CleanupUpdates(UpdateDir);\r
+       }\r
+\r
+       // マルチコアCPUの特定環境下でファイル通信中にクラッシュするバグ対策\r
 #ifdef DISABLE_MULTI_CPUS\r
        SetProcessAffinityMask(GetCurrentProcess(), 1);\r
 #endif\r
+       MainThreadId = GetCurrentThreadId();\r
 \r
        // yutaka\r
        if(OleInitialize(NULL) != S_OK){\r
@@ -312,11 +412,23 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLi
 \r
        InitCommonControls();\r
 \r
+       // UPnP対応\r
+       CoInitialize(NULL);\r
+       LoadUPnP();\r
+       // タスクバー進捗表示\r
+       LoadTaskbarList3();\r
+\r
+       // UTF-8対応\r
+       LoadUnicodeNormalizationDll();\r
+\r
        // FTPS対応\r
 #ifdef USE_OPENSSL\r
        LoadOpenSSL();\r
 #endif\r
 \r
+       // SFTP対応\r
+       LoadPuTTY();\r
+\r
        Ret = FALSE;\r
        hWndFtp = NULL;\r
        hInstFtp = hInstance;\r
@@ -328,7 +440,9 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLi
                        if((Sts == 0) || (Sts == -1))\r
                                break;\r
 \r
-                       if(!HtmlHelp(NULL, NULL, HH_PRETRANSLATEMESSAGE, (DWORD)&Msg))\r
+                       // 64ビット対応\r
+//                     if(!HtmlHelp(NULL, NULL, HH_PRETRANSLATEMESSAGE, (DWORD)&Msg))\r
+                       if(!HtmlHelp(NULL, NULL, HH_PRETRANSLATEMESSAGE, (DWORD_PTR)&Msg))\r
                        { \r
                                /* ディレクトリ名の表示コンボボックスでBSやRETが効くように */\r
                                /* コンボボックス内ではアクセラレータを無効にする */\r
@@ -350,7 +464,34 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLi
 #ifdef USE_OPENSSL\r
        FreeOpenSSL();\r
 #endif\r
+       // SFTP対応\r
+       FreePuTTY();\r
+       // タスクバー進捗表示\r
+       FreeTaskbarList3();\r
+       // UPnP対応\r
+       FreeUPnP();\r
+       CoUninitialize();\r
        OleUninitialize();\r
+       // ソフトウェア自動更新\r
+       if(ApplyUpdatesOnExit == YES)\r
+       {\r
+               Sts = FALSE;\r
+               if(GetModuleFileName(NULL, UpdateDir, FMAX_PATH) > 0)\r
+               {\r
+                       if(p = strrchr(UpdateDir, '\\'))\r
+                       {\r
+                               *p = '\0';\r
+                               strcpy(Path, TmpPath);\r
+                               SetYenTail(Path);\r
+                               strcat(Path, "update");\r
+                               sprintf(Command, "-%s \"%s\"", "-software-update", UpdateDir);\r
+                               if(StartUpdateProcess(Path, Command))\r
+                                       Sts = TRUE;\r
+                       }\r
+               }\r
+               if(!Sts)\r
+                       MessageBox(NULL, MSGJPN360, "FFFTP", MB_OK | MB_ICONERROR);\r
+       }\r
        return(Ret);\r
 }\r
 \r
@@ -376,13 +517,19 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow)
        char PwdBuf[FMAX_PATH+1];\r
        int useDefautPassword = 0; /* 警告文表示用 */\r
        int masterpass;\r
+       // ポータブル版判定\r
+       int ImportPortable;\r
+       // 高DPI対応\r
+       int i;\r
 \r
        sts = FFFTP_FAIL;\r
 \r
        aes_init();\r
        srand(GetTickCount());\r
        \r
-       HtmlHelp(NULL, NULL, HH_INITIALIZE, (DWORD)&dwCookie);\r
+       // 64ビット対応\r
+//     HtmlHelp(NULL, NULL, HH_INITIALIZE, (DWORD)&dwCookie);\r
+       HtmlHelp(NULL, NULL, HH_INITIALIZE, (DWORD_PTR)&dwCookie);\r
 \r
        SaveUpdateBellInfo();\r
 \r
@@ -392,7 +539,21 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow)
        {\r
                Accel = LoadAccelerators(hInstFtp, MAKEINTRESOURCE(ffftp_accel));\r
 \r
-               GetTempPath(FMAX_PATH, TmpPath);\r
+               // 環境依存の不具合対策\r
+//             GetTempPath(FMAX_PATH, TmpPath);\r
+               GetAppTempPath(TmpPath);\r
+               _mkdir(TmpPath);\r
+               SetYenTail(TmpPath);\r
+\r
+               // 高DPI対応\r
+               WinWidth = CalcPixelX(WinWidth);\r
+               WinHeight = CalcPixelY(WinHeight);\r
+               LocalWidth = CalcPixelX(LocalWidth);\r
+               TaskHeight = CalcPixelY(TaskHeight);\r
+               for(i = 0; i < sizeof(LocalTabWidth) / sizeof(int); i++)\r
+                       LocalTabWidth[i] = CalcPixelX(LocalTabWidth[i]);\r
+               for(i = 0; i < sizeof(RemoteTabWidth) / sizeof(int); i++)\r
+                       RemoteTabWidth[i] = CalcPixelX(RemoteTabWidth[i]);\r
 \r
                GetModuleFileName(NULL, HelpPath, FMAX_PATH);\r
                strcpy(GetFileName(HelpPath), "ffftp.chm");\r
@@ -407,13 +568,52 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow)
                        ForceIni = YES;\r
                        RegType = REGTYPE_INI;\r
                }\r
+               // ポータブル版判定\r
+               GetModuleFileName(NULL, PortableFilePath, FMAX_PATH);\r
+               strcpy(GetFileName(PortableFilePath), "portable");\r
+               CheckPortableVersion();\r
+               ImportPortable = NO;\r
+               if(PortableVersion == YES)\r
+               {\r
+                       ForceIni = YES;\r
+                       RegType = REGTYPE_INI;\r
+                       if(IsRegAvailable() == YES && IsIniAvailable() == NO)\r
+                       {\r
+                               if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(ini_from_reg_dlg), GetMainHwnd(), ExeEscDialogProc) == YES)\r
+                                       ImportPortable = YES;\r
+                       }\r
+               }\r
+               // バージョン確認\r
+               if(ReadSettingsVersion() > VER_NUM)\r
+               {\r
+                       if(IsRegAvailable() == YES && IsIniAvailable() == NO)\r
+                       {\r
+                               switch(MessageBox(GetMainHwnd(), MSGJPN351, "FFFTP", MB_YESNOCANCEL | MB_DEFBUTTON2))\r
+                               {\r
+                                       case IDCANCEL:\r
+                                               ReadOnlySettings = YES;\r
+                                               break;\r
+                                       case IDYES:\r
+                                               break;\r
+                                       case IDNO:\r
+                                               ImportPortable = YES;\r
+                                               break;\r
+                               }\r
+                       }\r
+               }\r
+               // ポータブル版判定\r
+               if(ImportPortable == YES)\r
+               {\r
+                       ForceIni = NO;\r
+                       RegType = REGTYPE_REG;\r
+               }\r
 \r
 //             AllocConsole();\r
 \r
                /* 2010.02.01 genta マスターパスワードを入力させる\r
                  -z オプションがあるときは最初だけスキップ\r
                  -z オプションがないときは,デフォルトパスワードをまず試す\r
-                 LoadRegistory()する\r
+                 LoadRegistry()する\r
                  パスワードが不一致なら再入力するか尋ねる.\r
                  (破損していた場合はさせない)\r
                */\r
@@ -458,11 +658,21 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow)
                \r
                if(masterpass != 0)\r
                {\r
-                       LoadRegistory();\r
+                       LoadRegistry();\r
+\r
+                       // ポータブル版判定\r
+                       if(ImportPortable == YES)\r
+                       {\r
+                               ForceIni = YES;\r
+                               RegType = REGTYPE_INI;\r
+                       }\r
 \r
                        // 暗号化通信対応\r
                        SetSSLTimeoutCallback(TimeOut * 1000, SSLTimeoutCallback);\r
                        SetSSLConfirmCallback(SSLConfirmCallback);\r
+                       GetModuleFileName(NULL, SSLRootCAFilePath, FMAX_PATH);\r
+                       strcpy(GetFileName(SSLRootCAFilePath), "ssl.pem");\r
+                       LoadSSLRootCAFile();\r
 \r
                        LoadJre();\r
                        if(NoRasControl == NO)\r
@@ -486,9 +696,8 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow)
                                DispTransferType();\r
                                SetHostKanaCnvImm(YES);\r
                                SetHostKanjiCodeImm(KANJI_NOCNV);\r
-                               // 本当はローカルのデフォルトをUTF-8にしたいが旧バージョンとの互換性のためShift_JISに設定\r
-//                             SetLocalKanjiCodeImm(KANJI_UTF8N);\r
-                               SetLocalKanjiCodeImm(KANJI_SJIS);\r
+                               // UTF-8対応\r
+                               SetLocalKanjiCodeImm(LocalKanjiCode);\r
                                DispListType();\r
                                DispDotFileMode();\r
                                DispSyncMoveMode();\r
@@ -504,7 +713,7 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow)
                                        DispWindowTitle();\r
                                        // SourceForge.JPによるフォーク\r
 //                                     SetTaskMsg("FFFTP Ver." VER_STR " Copyright(C) 1997-2010 Sota & cooperators.");\r
-                                       SetTaskMsg("FFFTP Ver." VER_STR " Copyright(C) 1997-2010 Sota & cooperators.\r\nCopyright (C) 2011 FFFTP Project (Hiromichi Matsushima, Suguru Kawamoto, IWAMOTO Kouichi, vitamin0x, unarist, Asami, fortran90, tomo1192).");\r
+                                       SetTaskMsg("FFFTP Ver." VER_STR " Copyright(C) 1997-2010 Sota & cooperators.\r\nCopyright (C) 2011-2014 FFFTP Project (Hiromichi Matsushima, Suguru Kawamoto, IWAMOTO Kouichi, vitamin0x, unarist, Asami, fortran90, tomo1192, Yuji Tanaka, Moriguchi Hirokazu, Fu-sen).");\r
 \r
                                        if(ForceIni)\r
                                                SetTaskMsg("%s%s", MSGJPN283, IniPath);\r
@@ -527,6 +736,10 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow)
                                        MakeButtonsFocus();\r
                                        DispTransferFiles();\r
 \r
+                                       // ソフトウェア自動更新\r
+                                       if(AutoCheckForUptatesInterval == 0)\r
+                                               UpdateSoftware(YES, AutoApplyUpdates);\r
+\r
                                        StartupProc(lpszCmdLine);\r
                                        sts = FFFTP_SUCCESS;\r
 \r
@@ -607,18 +820,16 @@ static int MakeAllWindows(int cmdShow)
        wClass.hIconSm       = NULL;\r
        RegisterClassEx(&wClass);\r
 \r
+       // 高DPI対応\r
+//     ToolWinHeight = TOOLWIN_HEIGHT;\r
+       ToolWinHeight = CalcPixelY(16) + 12;\r
+\r
        if(SaveWinPos == NO)\r
        {\r
                WinPosX = CW_USEDEFAULT;\r
                WinPosY = 0;\r
        }\r
-       // UTF-8対応\r
-       // ユーザー定義のクラスはデフォルトのWNDPROCがShift_JIS専用のため\r
-//     hWndFtp = CreateWindow(FtpClassStr, "FFFTP",\r
-//                             WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,\r
-//                             WinPosX, WinPosY, WinWidth, WinHeight,\r
-//                             HWND_DESKTOP, 0, hInstFtp, NULL);\r
-       hWndFtp = CreateWindowA(FtpClassStr, "FFFTP",\r
+       hWndFtp = CreateWindow(FtpClassStr, "FFFTP",\r
                                WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,\r
                                WinPosX, WinPosY, WinWidth, WinHeight,\r
                                HWND_DESKTOP, 0, hInstFtp, NULL);\r
@@ -697,7 +908,25 @@ void DispWindowTitle(void)
        char Tmp[HOST_ADRS_LEN+FILTER_EXT_LEN+20];\r
 \r
        if(AskConnecting() == YES)\r
-               sprintf(Tmp, "%s (%s) - FFFTP", TitleHostName, FilterStr);\r
+       // 暗号化通信対応\r
+//             sprintf(Tmp, "%s (%s) - FFFTP", TitleHostName, FilterStr);\r
+       {\r
+               switch(AskCryptMode())\r
+               {\r
+               case CRYPT_NONE:\r
+                       sprintf(Tmp, "%s (%s) %s - FFFTP", TitleHostName, FilterStr, MSGJPN352);\r
+                       break;\r
+               case CRYPT_FTPES:\r
+                       sprintf(Tmp, "%s (%s) %s - FFFTP", TitleHostName, FilterStr, MSGJPN353);\r
+                       break;\r
+               case CRYPT_FTPIS:\r
+                       sprintf(Tmp, "%s (%s) %s - FFFTP", TitleHostName, FilterStr, MSGJPN354);\r
+                       break;\r
+               case CRYPT_SFTP:\r
+                       sprintf(Tmp, "%s (%s) %s - FFFTP", TitleHostName, FilterStr, MSGJPN355);\r
+                       break;\r
+               }\r
+       }\r
        else\r
                sprintf(Tmp, "FFFTP (%s)", FilterStr);\r
 \r
@@ -825,12 +1054,73 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
 {\r
        PAINTSTRUCT ps;\r
        LPTOOLTIPTEXT lpttt;\r
+       // UTF-8対応\r
+       LPTOOLTIPTEXTW wlpttt;\r
        RECT Rect;\r
 \r
        int TmpTransType;\r
 \r
        switch (message)\r
        {\r
+               // ローカル側自動更新\r
+               // タスクバー進捗表示\r
+               // ソフトウェア自動更新\r
+               case WM_CREATE :\r
+                       SetTimer(hWnd, 1, 1000, NULL);\r
+                       SetTimer(hWnd, 2, 100, NULL);\r
+                       SetTimer(hWnd, 3, 60000, NULL);\r
+                       break;\r
+\r
+               // ローカル側自動更新\r
+               // 自動切断対策\r
+               // タスクバー進捗表示\r
+               // ソフトウェア自動更新\r
+               case WM_TIMER :\r
+                       switch(wParam)\r
+                       {\r
+                       case 1:\r
+                               if(WaitForSingleObject(ChangeNotification, 0) == WAIT_OBJECT_0)\r
+                               {\r
+                                       if(AskUserOpeDisabled() == NO)\r
+                                       {\r
+                                               FindNextChangeNotification(ChangeNotification);\r
+                                               if(AutoRefreshFileList == YES)\r
+                                               {\r
+                                                       FILELIST* Base;\r
+                                                       char Name[FMAX_PATH+1];\r
+                                                       int Pos;\r
+                                                       Base = NULL;\r
+                                                       MakeSelectedFileList(WIN_LOCAL, NO, NO, &Base, &CancelFlg);\r
+                                                       GetHotSelected(WIN_LOCAL, Name);\r
+                                                       Pos = SendMessage(GetLocalHwnd(), LVM_GETTOPINDEX, 0, 0);\r
+                                                       GetLocalDirForWnd();\r
+                                                       SelectFileInList(GetLocalHwnd(), SELECT_LIST, Base);\r
+                                                       SetHotSelected(WIN_LOCAL, Name);\r
+                                                       SendMessage(GetLocalHwnd(), LVM_ENSUREVISIBLE, (WPARAM)(SendMessage(GetLocalHwnd(), LVM_GETITEMCOUNT, 0, 0) - 1), (LPARAM)TRUE);\r
+                                                       SendMessage(GetLocalHwnd(), LVM_ENSUREVISIBLE, (WPARAM)Pos, (LPARAM)TRUE);\r
+                                               }\r
+                                       }\r
+                               }\r
+                               if(NoopEnable == YES && AskNoopInterval() > 0 && time(NULL) - LastDataConnectionTime >= AskNoopInterval())\r
+                               {\r
+                                       NoopProc(NO);\r
+                                       LastDataConnectionTime = time(NULL);\r
+                               }\r
+                               break;\r
+                       case 2:\r
+                               if(IsTaskbarList3Loaded() == YES)\r
+                                       UpdateTaskbarProgress();\r
+                               break;\r
+                       case 3:\r
+                               if(AskUserOpeDisabled() == NO && AskTransferNow() == NO)\r
+                               {\r
+                                       if(AutoCheckForUptatesInterval > 0 && time(NULL) - LastAutoCheckForUpdates >= AutoCheckForUptatesInterval * 86400)\r
+                                               UpdateSoftware(YES, AutoApplyUpdates);\r
+                               }\r
+                               break;\r
+                       }\r
+                       break;\r
+\r
                case WM_COMMAND :\r
                        // 同時接続対応\r
                        // 中断後に受信バッファに応答が残っていると次のコマンドの応答が正しく処理できない\r
@@ -839,11 +1129,19 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                        switch(LOWORD(wParam))\r
                        {\r
                                case MENU_CONNECT :\r
+                                       // 自動切断対策\r
+                                       NoopEnable = NO;\r
                                        ConnectProc(DLG_TYPE_CON, -1);\r
+                                       // 自動切断対策\r
+                                       NoopEnable = YES;\r
                                        break;\r
 \r
                                case MENU_CONNECT_NUM :\r
+                                       // 自動切断対策\r
+                                       NoopEnable = NO;\r
                                        ConnectProc(DLG_TYPE_CON, (int)lParam);\r
+                                       // 自動切断対策\r
+                                       NoopEnable = YES;\r
                                        if(AskConnecting() == YES)\r
                                        {\r
                                                if(HIWORD(wParam) & OPT_MIRROR)\r
@@ -864,11 +1162,19 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                                        break;\r
 \r
                                case MENU_SET_CONNECT :\r
+                                       // 自動切断対策\r
+                                       NoopEnable = NO;\r
                                        ConnectProc(DLG_TYPE_SET, -1);\r
+                                       // 自動切断対策\r
+                                       NoopEnable = YES;\r
                                        break;\r
 \r
                                case MENU_QUICK :\r
+                                       // 自動切断対策\r
+                                       NoopEnable = NO;\r
                                        QuickConnectProc();\r
+                                       // 自動切断対策\r
+                                       NoopEnable = YES;\r
                                        break;\r
 \r
                                case MENU_DISCONNECT :\r
@@ -902,7 +1208,11 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                                case MENU_HIST_18 :\r
                                case MENU_HIST_19 :\r
                                case MENU_HIST_20 :\r
+                                       // 自動切断対策\r
+                                       NoopEnable = NO;\r
                                        HistoryConnectProc(LOWORD(wParam));\r
+                                       // 自動切断対策\r
+                                       NoopEnable = YES;\r
                                        break;\r
 \r
                                case MENU_UPDIR :\r
@@ -914,6 +1224,22 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
 \r
                                case MENU_DCLICK :\r
                                        if(hWndCurFocus == GetLocalHwnd())\r
+                                               // ローカルフォルダを開く\r
+//                                             DoubleClickProc(WIN_LOCAL, YES, -1);\r
+                                               DoubleClickProc(WIN_LOCAL, NO, -1);\r
+                                       else\r
+                                       {\r
+                                               SuppressRefresh = 1;\r
+                                               // ローカルフォルダを開く\r
+//                                             DoubleClickProc(WIN_REMOTE, YES, -1);\r
+                                               DoubleClickProc(WIN_REMOTE, NO, -1);\r
+                                               SuppressRefresh = 0;\r
+                                       }\r
+                                       break;\r
+\r
+                               // ローカルフォルダを開く\r
+                               case MENU_OPEN :\r
+                                       if(hWndCurFocus == GetLocalHwnd())\r
                                                DoubleClickProc(WIN_LOCAL, YES, -1);\r
                                        else\r
                                        {\r
@@ -957,6 +1283,9 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                                        break;\r
 \r
                                case MENU_REMOTE_UPDIR :\r
+                                       // デッドロック対策\r
+                                       if(AskUserOpeDisabled() == YES)\r
+                                               break;\r
                                        SuppressRefresh = 1;\r
                                        SetCurrentDirAsDirHist();\r
                                        ChangeDir(WIN_REMOTE, "..");\r
@@ -964,6 +1293,9 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                                        break;\r
 \r
                                case MENU_LOCAL_UPDIR :\r
+                                       // デッドロック対策\r
+                                       if(AskUserOpeDisabled() == YES)\r
+                                               break;\r
                                        SetCurrentDirAsDirHist();\r
                                        ChangeDir(WIN_LOCAL, "..");\r
                                        break;\r
@@ -982,42 +1314,42 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
 \r
                                case MENU_DOWNLOAD :\r
                                        SetCurrentDirAsDirHist();\r
-                                       DownLoadProc(NO, NO, NO);\r
+                                       DownloadProc(NO, NO, NO);\r
                                        break;\r
 \r
                                case MENU_DOWNLOAD_AS :\r
                                        SetCurrentDirAsDirHist();\r
-                                       DownLoadProc(YES, NO, NO);\r
+                                       DownloadProc(YES, NO, NO);\r
                                        break;\r
 \r
                                case MENU_DOWNLOAD_AS_FILE :\r
                                        SetCurrentDirAsDirHist();\r
-                                       DownLoadProc(NO, YES, NO);\r
+                                       DownloadProc(NO, YES, NO);\r
                                        break;\r
 \r
                                case MENU_DOWNLOAD_ALL :\r
                                        SetCurrentDirAsDirHist();\r
-                                       DownLoadProc(NO, NO, YES);\r
+                                       DownloadProc(NO, NO, YES);\r
                                        break;\r
 \r
                                case MENU_DOWNLOAD_NAME :\r
                                        SetCurrentDirAsDirHist();\r
-                                       InputDownLoadProc();\r
+                                       InputDownloadProc();\r
                                        break;\r
 \r
                                case MENU_UPLOAD :\r
                                        SetCurrentDirAsDirHist();\r
-                                       UpLoadListProc(NO, NO);\r
+                                       UploadListProc(NO, NO);\r
                                        break;\r
 \r
                                case MENU_UPLOAD_AS :\r
                                        SetCurrentDirAsDirHist();\r
-                                       UpLoadListProc(YES, NO);\r
+                                       UploadListProc(YES, NO);\r
                                        break;\r
 \r
                                case MENU_UPLOAD_ALL :\r
                                        SetCurrentDirAsDirHist();\r
-                                       UpLoadListProc(NO, YES);\r
+                                       UploadListProc(NO, YES);\r
                                        break;\r
 \r
                                case MENU_MIRROR_UPLOAD :\r
@@ -1148,6 +1480,7 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                                case MENU_KNJ_EUC :\r
                                case MENU_KNJ_JIS :\r
                                case MENU_KNJ_UTF8N :\r
+                               case MENU_KNJ_UTF8BOM :\r
                                case MENU_KNJ_NONE :\r
                                        SetHostKanjiCode(LOWORD(wParam));\r
                                        break;\r
@@ -1156,6 +1489,7 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                                case MENU_L_KNJ_EUC :\r
                                case MENU_L_KNJ_JIS :\r
                                case MENU_L_KNJ_UTF8N :\r
+                               case MENU_L_KNJ_UTF8BOM :\r
                                        SetLocalKanjiCode(LOWORD(wParam));\r
                                        break;\r
 \r
@@ -1164,6 +1498,9 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                                        break;\r
 \r
                                case MENU_REFRESH :\r
+                                       // デッドロック対策\r
+                                       if(AskUserOpeDisabled() == YES)\r
+                                               break;\r
                                        // 同時接続対応\r
                                        CancelFlg = NO;\r
                                        SuppressRefresh = 1;\r
@@ -1186,10 +1523,16 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                                        break;\r
 \r
                                case REFRESH_LOCAL :\r
+                                       // デッドロック対策\r
+                                       if(AskUserOpeDisabled() == YES)\r
+                                               break;\r
                                        GetLocalDirForWnd();\r
                                        break;\r
 \r
                                case REFRESH_REMOTE :\r
+                                       // デッドロック対策\r
+                                       if(AskUserOpeDisabled() == YES)\r
+                                               break;\r
                                        // 同時接続対応\r
                                        CancelFlg = NO;\r
                                        SuppressRefresh = 1;\r
@@ -1220,7 +1563,9 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                                        break;\r
 \r
                                case MENU_HELP_TROUBLE :\r
-                                       ShellExecute(NULL, "open", MYWEB_URL, NULL, ".", SW_SHOW);\r
+                                       // 任意のコードが実行されるバグ修正\r
+//                                     ShellExecute(NULL, "open", MYWEB_URL, NULL, ".", SW_SHOW);\r
+                                       ShellExecute(NULL, "open", MYWEB_URL, NULL, NULL, SW_SHOW);\r
                                        break;\r
 \r
                                case MENU_BMARK_ADD :\r
@@ -1240,11 +1585,15 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                                        break;\r
 \r
                                case MENU_SELECT_ALL :\r
-                                       SelectFileInList(hWndCurFocus, SELECT_ALL);\r
+                                       // ローカル側自動更新\r
+//                                     SelectFileInList(hWndCurFocus, SELECT_ALL);\r
+                                       SelectFileInList(hWndCurFocus, SELECT_ALL, NULL);\r
                                        break;\r
 \r
                                case MENU_SELECT :\r
-                                       SelectFileInList(hWndCurFocus, SELECT_REGEXP);\r
+                                       // ローカル側自動更新\r
+//                                     SelectFileInList(hWndCurFocus, SELECT_REGEXP);\r
+                                       SelectFileInList(hWndCurFocus, SELECT_REGEXP, NULL);\r
                                        break;\r
 \r
                                case MENU_FIND :\r
@@ -1256,6 +1605,9 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                                        break;\r
 \r
                                case MENU_DOTFILE :\r
+                                       // デッドロック対策\r
+                                       if(AskUserOpeDisabled() == YES)\r
+                                               break;\r
                                        // 同時接続対応\r
                                        CancelFlg = NO;\r
                                        DotFile ^= 1;\r
@@ -1274,7 +1626,7 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
 \r
                                case MENU_REGSAVE :\r
                                        GetListTabWidth();\r
-                                       SaveRegistory();\r
+                                       SaveRegistry();\r
                                        SaveSettingsToFile();\r
                                        break;\r
 \r
@@ -1290,7 +1642,9 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                                case MENU_REGINIT :\r
                                        if(DialogBox(hInstFtp, MAKEINTRESOURCE(reginit_dlg), hWnd, ExeEscDialogProc) == YES)\r
                                        {\r
-                                               ClearRegistory();\r
+                                               ClearRegistry();\r
+                                               // ポータブル版判定\r
+                                               ClearIni();\r
                                                SaveExit = NO;\r
                                                PostMessage(hWnd, WM_CLOSE, 0, 0L);\r
                                        }\r
@@ -1302,9 +1656,34 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                                                if( DialogBox(hInstFtp, MAKEINTRESOURCE(forcepasschange_dlg), hWnd, ExeEscDialogProc) != YES){\r
                                                        break;\r
                                                }\r
+                                               // セキュリティ強化\r
+                                               if(EnterMasterPasswordAndSet(newmasterpasswd_dlg, hWnd) != 0)\r
+                                                       SetTaskMsg(MSGJPN303);\r
                                        }\r
-                                       if( EnterMasterPasswordAndSet( newmasterpasswd_dlg, hWnd ) != 0 ){\r
-                                               SetTaskMsg( MSGJPN303 );\r
+                                       // セキュリティ強化\r
+//                                     if( EnterMasterPasswordAndSet( newmasterpasswd_dlg, hWnd ) != 0 ){\r
+//                                             SetTaskMsg( MSGJPN303 );\r
+//                                     }\r
+                                       else if(GetMasterPasswordStatus() == PASSWORD_OK)\r
+                                       {\r
+                                               char Password[MAX_PASSWORD_LEN + 1];\r
+                                               GetMasterPassword(Password);\r
+                                               SetMasterPassword(NULL);\r
+                                               while(ValidateMasterPassword() == YES && GetMasterPasswordStatus() == PASSWORD_UNMATCH)\r
+                                               {\r
+                                                       if(EnterMasterPasswordAndSet(masterpasswd_dlg, hWnd) == 0)\r
+                                                               break;\r
+                                               }\r
+                                               if(GetMasterPasswordStatus() == PASSWORD_OK && EnterMasterPasswordAndSet(newmasterpasswd_dlg, hWnd) != 0)\r
+                                               {\r
+                                                       SetTaskMsg(MSGJPN303);\r
+                                                       SaveRegistry();\r
+                                               }\r
+                                               else\r
+                                               {\r
+                                                       SetMasterPassword(Password);\r
+                                                       ValidateMasterPassword();\r
+                                               }\r
                                        }\r
                                        break;\r
 \r
@@ -1326,6 +1705,11 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                                        OtpCalcTool();\r
                                        break;\r
 \r
+                               // FTPS対応\r
+                               case MENU_FW_FTP_FILTER :\r
+                                       TurnStatefulFTPFilter();\r
+                                       break;\r
+\r
                                case MENU_URL_COPY :\r
                                        CopyURLtoClipBoard();\r
                                        break;\r
@@ -1338,6 +1722,45 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                                                LocalRbuttonMenu(1);\r
                                        break;\r
 \r
+#if defined(HAVE_TANDEM)\r
+                               case MENU_SWITCH_OSS :\r
+                                       SwitchOSSProc();\r
+                                       break;\r
+#endif\r
+\r
+                               // 上位のディレクトリへ移動対応\r
+                               case MENU_REMOTE_MOVE_UPDIR :\r
+                                       MoveRemoteFileProc(-1);\r
+                                       break;\r
+\r
+                               // FileZilla XML形式エクスポート対応\r
+                               case MENU_EXPORT_FILEZILLA_XML :\r
+                                       // 平文で出力するためマスターパスワードを再確認\r
+                                       if(GetMasterPasswordStatus() == PASSWORD_OK)\r
+                                       {\r
+                                               char Password[MAX_PASSWORD_LEN + 1];\r
+                                               GetMasterPassword(Password);\r
+                                               SetMasterPassword(NULL);\r
+                                               while(ValidateMasterPassword() == YES && GetMasterPasswordStatus() == PASSWORD_UNMATCH)\r
+                                               {\r
+                                                       if(EnterMasterPasswordAndSet(masterpasswd_dlg, hWnd) == 0)\r
+                                                               break;\r
+                                               }\r
+                                               if(GetMasterPasswordStatus() == PASSWORD_OK)\r
+                                                       SaveSettingsToFileZillaXml();\r
+                                               else\r
+                                               {\r
+                                                       SetMasterPassword(Password);\r
+                                                       ValidateMasterPassword();\r
+                                               }\r
+                                       }\r
+                                       break;\r
+\r
+                               // ソフトウェア自動更新\r
+                               case MENU_UPDATES_CHECK :\r
+                                       UpdateSoftware(NO, NO);\r
+                                       break;\r
+\r
                                default :\r
                                        if((LOWORD(wParam) >= MENU_BMARK_TOP) &&\r
                                           (LOWORD(wParam) < MENU_BMARK_TOP+100))\r
@@ -1355,8 +1778,13 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                        switch(((LPNMHDR)lParam)->code)\r
                        {\r
                                /* ツールチップコントロールメッセージの処理 */\r
-                               case TTN_NEEDTEXT:\r
+                               // UTF-8対応\r
+//                             case TTN_NEEDTEXT:\r
+                               case TTN_NEEDTEXTW:\r
                                        lpttt = (LPTOOLTIPTEXT)lParam;\r
+                                       // UTF-8対応\r
+                                       // lptttは単なる警告回避用\r
+                                       wlpttt = (LPTOOLTIPTEXTW)lParam;\r
                                        lpttt->hinst = hInstFtp;\r
                                        switch(lpttt->hdr.idFrom)\r
                                        {\r
@@ -1375,7 +1803,15 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                                                case MENU_DOWNLOAD :\r
                                                        lpttt->lpszText = MSGJPN157;\r
                                                        break;\r
+#if defined(HAVE_TANDEM)\r
+                                               case MENU_DOWNLOAD_AS :\r
+                                                       lpttt->lpszText = MSGJPN065;\r
+                                                       break;\r
 \r
+                                               case MENU_UPLOAD_AS :\r
+                                                       lpttt->lpszText = MSGJPN064;\r
+                                                       break;\r
+#endif\r
                                                case MENU_UPLOAD :\r
                                                        lpttt->lpszText = MSGJPN158;\r
                                                        break;\r
@@ -1446,6 +1882,10 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                                                        lpttt->lpszText = MSGJPN308;\r
                                                        break;\r
 \r
+                                               case MENU_KNJ_UTF8BOM :\r
+                                                       lpttt->lpszText = MSGJPN330;\r
+                                                       break;\r
+\r
                                                case MENU_KNJ_NONE :\r
                                                        lpttt->lpszText = MSGJPN173;\r
                                                        break;\r
@@ -1466,6 +1906,10 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                                                        lpttt->lpszText = MSGJPN312;\r
                                                        break;\r
 \r
+                                               case MENU_L_KNJ_UTF8BOM :\r
+                                                       lpttt->lpszText = MSGJPN331;\r
+                                                       break;\r
+\r
                                                case MENU_KANACNV :\r
                                                        lpttt->lpszText = MSGJPN174;\r
                                                        break;\r
@@ -1478,15 +1922,14 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                                                        lpttt->lpszText = MSGJPN176;\r
                                                        break;\r
                                        }\r
-                                       // UTF-8からShift_JISへ変換\r
+                                       // UTF-8対応\r
+                                       // UTF-8からUTF-16 LEへ変換\r
                                        {\r
                                                static wchar_t StringBufferUTF16[1024];\r
-                                               static char StringBufferSJIS[1024];\r
                                                if(lpttt->lpszText)\r
                                                {\r
                                                        MtoW(StringBufferUTF16, sizeof(StringBufferUTF16)/ sizeof(wchar_t), lpttt->lpszText, -1);\r
-                                                       WtoA(StringBufferSJIS, sizeof(StringBufferSJIS)/ sizeof(char), StringBufferUTF16, -1);\r
-                                                       lpttt->lpszText = StringBufferSJIS;\r
+                                                       wlpttt->lpszText = StringBufferUTF16;\r
                                                }\r
                                        }\r
                                        break;\r
@@ -1557,7 +2000,10 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                        break;\r
 \r
                case WM_REFRESH_LOCAL_FLG :\r
-                       PostMessage(hWnd,  WM_COMMAND, MAKEWPARAM(REFRESH_LOCAL, 0), 0);\r
+                       // 外部アプリケーションへドロップ後にローカル側のファイル一覧に作業フォルダが表示されるバグ対策\r
+//                     PostMessage(hWnd,  WM_COMMAND, MAKEWPARAM(REFRESH_LOCAL, 0), 0);\r
+                       if(SuppressRefresh == 0)\r
+                               PostMessage(hWnd,  WM_COMMAND, MAKEWPARAM(REFRESH_LOCAL, 0), 0);\r
                        break;\r
 \r
                case WM_REFRESH_REMOTE_FLG :\r
@@ -1571,6 +2017,14 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                        break;\r
 \r
                case WM_DESTROY :\r
+                       // ローカル側自動更新\r
+                       KillTimer(hWnd, 1);\r
+                       if(ChangeNotification != INVALID_HANDLE_VALUE)\r
+                               FindCloseChangeNotification(ChangeNotification);\r
+                       // タスクバー進捗表示\r
+                       KillTimer(hWnd, 2);\r
+                       // ソフトウェア自動更新\r
+                       KillTimer(hWnd, 3);\r
 //                     WSACleanup();\r
 //                     DestroyWindow(hWndFtp);\r
                        PostQuitMessage(0);\r
@@ -1645,6 +2099,18 @@ static void StartupProc(char *Cmd)
        if(CmdOption & OPT_SAVEON)\r
                SuppressSave = NO;\r
 \r
+       // UTF-8対応\r
+       if(CmdOption & OPT_SJIS)\r
+               Kanji = KANJI_SJIS;\r
+       if(CmdOption & OPT_UTF8N)\r
+               Kanji = KANJI_UTF8N;\r
+       if(CmdOption & OPT_UTF8BOM)\r
+               Kanji = KANJI_UTF8BOM;\r
+       if(CmdOption & OPT_SJIS_NAME)\r
+               FnameKanji = KANJI_SJIS;\r
+       if(CmdOption & OPT_UTF8N_NAME)\r
+               FnameKanji = KANJI_UTF8N;\r
+\r
        if(Sts == 0)\r
        {\r
                if(ConnectOnStart == YES)\r
@@ -1716,9 +2182,14 @@ static int AnalyzeComLine(char *Str, int *AutoConnect, int *CmdOption, char *unc
                                *CmdOption |= OPT_MIRROR;\r
                        else if((strcmp(&Tmp[1], "d") == 0) || (strcmp(&Tmp[1], "-mirrordown") == 0))\r
                                *CmdOption |= OPT_MIRRORDOWN;\r
-                       else if((strcmp(&Tmp[1], "e") == 0) || (strcmp(&Tmp[1], "-euc") == 0))\r
+                       // 廃止予定\r
+//                     else if((strcmp(&Tmp[1], "e") == 0) || (strcmp(&Tmp[1], "-euc") == 0))\r
+//                             *CmdOption |= OPT_EUC;\r
+//                     else if((strcmp(&Tmp[1], "j") == 0) || (strcmp(&Tmp[1], "-jis") == 0))\r
+//                             *CmdOption |= OPT_JIS;\r
+                       else if((strcmp(&Tmp[1], "eu") == 0) || (strcmp(&Tmp[1], "e") == 0) || (strcmp(&Tmp[1], "-euc") == 0))\r
                                *CmdOption |= OPT_EUC;\r
-                       else if((strcmp(&Tmp[1], "j") == 0) || (strcmp(&Tmp[1], "-jis") == 0))\r
+                       else if((strcmp(&Tmp[1], "ji") == 0) || (strcmp(&Tmp[1], "j") == 0) || (strcmp(&Tmp[1], "-jis") == 0))\r
                                *CmdOption |= OPT_JIS;\r
                        else if((strcmp(&Tmp[1], "a") == 0) || (strcmp(&Tmp[1], "-ascii") == 0))\r
                                *CmdOption |= OPT_ASCII;\r
@@ -1732,9 +2203,14 @@ static int AnalyzeComLine(char *Str, int *AutoConnect, int *CmdOption, char *unc
                                *CmdOption |= OPT_QUIT;\r
                        else if((strcmp(&Tmp[1], "k") == 0) || (strcmp(&Tmp[1], "-kana") == 0))\r
                                *CmdOption |= OPT_KANA;\r
-                       else if((strcmp(&Tmp[1], "u") == 0) || (strcmp(&Tmp[1], "-eucname") == 0))\r
+                       // 廃止予定\r
+//                     else if((strcmp(&Tmp[1], "u") == 0) || (strcmp(&Tmp[1], "-eucname") == 0))\r
+//                             *CmdOption |= OPT_EUC_NAME;\r
+//                     else if((strcmp(&Tmp[1], "i") == 0) || (strcmp(&Tmp[1], "-jisname") == 0))\r
+//                             *CmdOption |= OPT_JIS_NAME;\r
+                       else if((strcmp(&Tmp[1], "eun") == 0) || (strcmp(&Tmp[1], "u") == 0) || (strcmp(&Tmp[1], "-eucname") == 0))\r
                                *CmdOption |= OPT_EUC_NAME;\r
-                       else if((strcmp(&Tmp[1], "i") == 0) || (strcmp(&Tmp[1], "-jisname") == 0))\r
+                       else if((strcmp(&Tmp[1], "jin") == 0) || (strcmp(&Tmp[1], "i") == 0) || (strcmp(&Tmp[1], "-jisname") == 0))\r
                                *CmdOption |= OPT_JIS_NAME;\r
                        else if((strcmp(&Tmp[1], "n") == 0) || (strcmp(&Tmp[1], "-ini") == 0))\r
                        {\r
@@ -1788,22 +2264,48 @@ static int AnalyzeComLine(char *Str, int *AutoConnect, int *CmdOption, char *unc
                        }\r
                        // プロセス保護\r
 #ifdef ENABLE_PROCESS_PROTECTION\r
-                       else if(strcmp(Tmp, "--restart") == 0)\r
+                       else if(strcmp(&Tmp[1], "-restart") == 0)\r
                        {\r
                        }\r
-                       else if(strcmp(Tmp, "--protect") == 0)\r
+                       else if(strcmp(&Tmp[1], "-protect") == 0)\r
                        {\r
                        }\r
-                       else if(strcmp(Tmp, "--protect-high") == 0)\r
+                       else if(strcmp(&Tmp[1], "-protect-high") == 0)\r
                        {\r
                        }\r
-                       else if(strcmp(Tmp, "--protect-medium") == 0)\r
+                       else if(strcmp(&Tmp[1], "-protect-medium") == 0)\r
                        {\r
                        }\r
-                       else if(strcmp(Tmp, "--protect-low") == 0)\r
+                       else if(strcmp(&Tmp[1], "-protect-low") == 0)\r
                        {\r
                        }\r
 #endif\r
+                       // UTF-8対応\r
+                       else if((strcmp(&Tmp[1], "sj") == 0) || (strcmp(&Tmp[1], "-sjis") == 0))\r
+                               *CmdOption |= OPT_SJIS;\r
+                       else if((strcmp(&Tmp[1], "u8") == 0) || (strcmp(&Tmp[1], "-utf8") == 0))\r
+                               *CmdOption |= OPT_UTF8N;\r
+                       else if((strcmp(&Tmp[1], "8b") == 0) || (strcmp(&Tmp[1], "-utf8bom") == 0))\r
+                               *CmdOption |= OPT_UTF8BOM;\r
+                       else if((strcmp(&Tmp[1], "sjn") == 0) || (strcmp(&Tmp[1], "-sjisname") == 0))\r
+                               *CmdOption |= OPT_SJIS_NAME;\r
+                       else if((strcmp(&Tmp[1], "u8n") == 0) || (strcmp(&Tmp[1], "-utf8name") == 0))\r
+                               *CmdOption |= OPT_UTF8N_NAME;\r
+                       // ソフトウェア自動更新\r
+                       else if(strcmp(&Tmp[1], "-software-update") == 0)\r
+                       {\r
+                               if((Str = GetToken(Str, Tmp)) == NULL)\r
+                               {\r
+                                       Ret = -1;\r
+                               }\r
+                       }\r
+                       else if(strcmp(&Tmp[1], "-software-cleanup") == 0)\r
+                       {\r
+                               if((Str = GetToken(Str, Tmp)) == NULL)\r
+                               {\r
+                                       Ret = -1;\r
+                               }\r
+                       }\r
                        else\r
                        {\r
                                SetTaskMsg(MSGJPN180, Tmp);\r
@@ -1916,7 +2418,7 @@ static char *GetToken(char *Str, char *Buf)
                InQuote = 0;\r
                while(*Str != NUL)\r
                {\r
-                       if(*Str == 0x22)\r
+                       if(*Str == '\"')\r
                                InQuote = !InQuote;\r
                        else\r
                        {\r
@@ -1950,6 +2452,9 @@ static char *GetToken(char *Str, char *Buf)
 \r
 static void ExitProc(HWND hWnd)\r
 {\r
+       // 環境依存の不具合対策\r
+       char Tmp[FMAX_PATH+1];\r
+\r
        CancelFlg = YES;\r
 \r
        CloseTransferThread();\r
@@ -1968,7 +2473,10 @@ static void ExitProc(HWND hWnd)
        if(SaveExit == YES)\r
        {\r
                GetListTabWidth();\r
-               SaveRegistory();\r
+               SaveRegistry();\r
+               // ポータブル版判定\r
+               if(RegType == REGTYPE_REG)\r
+                       ClearIni();\r
 \r
                if((CacheEntry > 0) && (CacheSave == YES))\r
                        SaveCache();\r
@@ -1978,6 +2486,14 @@ static void ExitProc(HWND hWnd)
        else\r
                DeleteCache();\r
 \r
+       // 環境依存の不具合対策\r
+       GetAppTempPath(Tmp);\r
+       SetYenTail(Tmp);\r
+       strcat(Tmp, "file");\r
+       _rmdir(Tmp);\r
+       GetAppTempPath(Tmp);\r
+       _rmdir(Tmp);\r
+\r
        if(RasClose == YES)\r
        {\r
                DisconnectRas(RasCloseNotify);\r
@@ -2021,7 +2537,9 @@ void DoubleClickProc(int Win, int Mode, int App)
 \r
                                if(Win == WIN_LOCAL)\r
                                {\r
-                                       if((App != -1) || (Type == NODE_FILE))\r
+                                       // ローカルフォルダを開く\r
+//                                     if((App != -1) || (Type == NODE_FILE))\r
+                                       if((App != -1) || (Type == NODE_FILE) || (Mode == YES))\r
                                        {\r
                                                if((DclickOpen == YES) || (Mode == YES))\r
                                                {\r
@@ -2051,6 +2569,10 @@ void DoubleClickProc(int Win, int Mode, int App)
 \r
                                                        strcpy(Remote, TmpPath);\r
                                                        SetYenTail(Remote);\r
+                                                       // 環境依存の不具合対策\r
+                                                       strcat(Remote, "file");\r
+                                                       _mkdir(Remote);\r
+                                                       SetYenTail(Remote);\r
                                                        if (UseDiffViewer == YES) {\r
                                                                strcat(Remote, "remote.");\r
                                                        }\r
@@ -2094,12 +2616,12 @@ void DoubleClickProc(int Win, int Mode, int App)
                                                        /* 不正なパスを検出 */\r
                                                        if(CheckPathViolation(&MainTransPkt) == NO)\r
                                                        {\r
-//                                                             if((Sts = DoDownLoad(AskCmdCtrlSkt(), &MainTransPkt, NO)) == 429)\r
+//                                                             if((Sts = DoDownload(AskCmdCtrlSkt(), &MainTransPkt, NO)) == 429)\r
 //                                                             {\r
 //                                                                     ReConnectCmdSkt();\r
                                                                        // 同時接続対応\r
                                                                        CancelFlg = NO;\r
-                                                                       Sts = DoDownLoad(AskCmdCtrlSkt(), &MainTransPkt, NO, &CancelFlg);\r
+                                                                       Sts = DoDownload(AskCmdCtrlSkt(), &MainTransPkt, NO, &CancelFlg);\r
 //                                                             }\r
                                                        }\r
 \r
@@ -2151,6 +2673,11 @@ static void ChangeDir(int Win, char *Path)
        char Local[FMAX_PATH+1];\r
        char Remote[FMAX_PATH+1];\r
 \r
+       // 同時接続対応\r
+       CancelFlg = NO;\r
+\r
+       // デッドロック対策\r
+       DisableUserOpe();\r
        Sync = AskSyncMoveMode();\r
        if(Sync == YES)\r
        {\r
@@ -2182,6 +2709,8 @@ static void ChangeDir(int Win, char *Path)
                                GetRemoteDirForWnd(CACHE_NORMAL, &CancelFlg);\r
                }\r
        }\r
+       // デッドロック対策\r
+       EnableUserOpe();\r
        return;\r
 }\r
 \r
@@ -2229,16 +2758,24 @@ static void ResizeWindowProc(void)
        SendMessage(GetSbarWnd(), WM_SIZE, SIZE_RESTORED, MAKELPARAM(Rect.right, Rect.bottom));\r
 \r
        CalcWinSize();\r
-       SetWindowPos(GetMainTbarWnd(), 0, 0, 0, Rect.right, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER);\r
-       SetWindowPos(GetLocalTbarWnd(), 0, 0, TOOLWIN_HEIGHT, LocalWidth, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER);\r
-       SetWindowPos(GetRemoteTbarWnd(), 0, LocalWidth + SepaWidth, TOOLWIN_HEIGHT, RemoteWidth, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER);\r
+       // 高DPI対応\r
+//     SetWindowPos(GetMainTbarWnd(), 0, 0, 0, Rect.right, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER);\r
+//     SetWindowPos(GetLocalTbarWnd(), 0, 0, TOOLWIN_HEIGHT, LocalWidth, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER);\r
+//     SetWindowPos(GetRemoteTbarWnd(), 0, LocalWidth + SepaWidth, TOOLWIN_HEIGHT, RemoteWidth, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER);\r
+       SetWindowPos(GetMainTbarWnd(), 0, 0, 0, Rect.right, AskToolWinHeight(), SWP_NOACTIVATE | SWP_NOZORDER);\r
+       SetWindowPos(GetLocalTbarWnd(), 0, 0, AskToolWinHeight(), LocalWidth, AskToolWinHeight(), SWP_NOACTIVATE | SWP_NOZORDER);\r
+       SetWindowPos(GetRemoteTbarWnd(), 0, LocalWidth + SepaWidth, AskToolWinHeight(), RemoteWidth, AskToolWinHeight(), SWP_NOACTIVATE | SWP_NOZORDER);\r
        SendMessage(GetLocalTbarWnd(), TB_GETITEMRECT, 3, (LPARAM)&Rect);\r
        SetWindowPos(GetLocalHistHwnd(), 0, Rect.right, Rect.top, LocalWidth - Rect.right, 200, SWP_NOACTIVATE | SWP_NOZORDER);\r
        SendMessage(GetRemoteTbarWnd(), TB_GETITEMRECT, 3, (LPARAM)&Rect);\r
        SetWindowPos(GetRemoteHistHwnd(), 0, Rect.right, Rect.top, RemoteWidth - Rect.right, 200, SWP_NOACTIVATE | SWP_NOZORDER);\r
-       SetWindowPos(GetLocalHwnd(), 0, 0, TOOLWIN_HEIGHT*2, LocalWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER);\r
-       SetWindowPos(GetRemoteHwnd(), 0, LocalWidth + SepaWidth, TOOLWIN_HEIGHT*2, RemoteWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER);\r
-       SetWindowPos(GetTaskWnd(), 0, 0, TOOLWIN_HEIGHT*2+ListHeight+SepaWidth, ClientWidth, TaskHeight, SWP_NOACTIVATE | SWP_NOZORDER);\r
+       // 高DPI対応\r
+//     SetWindowPos(GetLocalHwnd(), 0, 0, TOOLWIN_HEIGHT*2, LocalWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER);\r
+//     SetWindowPos(GetRemoteHwnd(), 0, LocalWidth + SepaWidth, TOOLWIN_HEIGHT*2, RemoteWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER);\r
+//     SetWindowPos(GetTaskWnd(), 0, 0, TOOLWIN_HEIGHT*2+ListHeight+SepaWidth, ClientWidth, TaskHeight, SWP_NOACTIVATE | SWP_NOZORDER);\r
+       SetWindowPos(GetLocalHwnd(), 0, 0, AskToolWinHeight()*2, LocalWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER);\r
+       SetWindowPos(GetRemoteHwnd(), 0, LocalWidth + SepaWidth, AskToolWinHeight()*2, RemoteWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER);\r
+       SetWindowPos(GetTaskWnd(), 0, 0, AskToolWinHeight()*2+ListHeight+SepaWidth, ClientWidth, TaskHeight, SWP_NOACTIVATE | SWP_NOZORDER);\r
 #endif\r
 \r
        return;\r
@@ -2278,7 +2815,9 @@ static void CalcWinSize(void)
 \r
        GetClientRect(GetSbarWnd(), &Rect);\r
 \r
-       ListHeight = max1(0, ClientHeight - TOOLWIN_HEIGHT * 2 - TaskHeight - SepaWidth - Rect.bottom);\r
+       // 高DPI対応\r
+//     ListHeight = max1(0, ClientHeight - TOOLWIN_HEIGHT * 2 - TaskHeight - SepaWidth - Rect.bottom);\r
+       ListHeight = max1(0, ClientHeight - AskToolWinHeight() * 2 - TaskHeight - SepaWidth - Rect.bottom);\r
 \r
        return;\r
 }\r
@@ -2326,8 +2865,11 @@ static void CheckResizeFrame(WPARAM Keys, int x, int y)
 \r
        if((Resizing == RESIZE_OFF) && (Keys == 0))\r
        {\r
+               // 高DPI対応\r
+//             if((x >= LocalWidth) && (x <= LocalWidth + SepaWidth) &&\r
+//                (y > TOOLWIN_HEIGHT) && (y < (TOOLWIN_HEIGHT * 2 + ListHeight)))\r
                if((x >= LocalWidth) && (x <= LocalWidth + SepaWidth) &&\r
-                  (y > TOOLWIN_HEIGHT) && (y < (TOOLWIN_HEIGHT * 2 + ListHeight)))\r
+                  (y > AskToolWinHeight()) && (y < (AskToolWinHeight() * 2 + ListHeight)))\r
                {\r
                        /* 境界位置変更用カーソルに変更 */\r
                        SetCapture(hWndFtp);\r
@@ -2336,7 +2878,9 @@ static void CheckResizeFrame(WPARAM Keys, int x, int y)
                        Resizing = RESIZE_PREPARE;\r
                        ResizePos = RESIZE_HPOS;\r
                }\r
-               else if((y >= TOOLWIN_HEIGHT*2+ListHeight) && (y <= TOOLWIN_HEIGHT*2+ListHeight+SepaWidth))\r
+               // 高DPI対応\r
+//             else if((y >= TOOLWIN_HEIGHT*2+ListHeight) && (y <= TOOLWIN_HEIGHT*2+ListHeight+SepaWidth))\r
+               else if((y >= AskToolWinHeight()*2+ListHeight) && (y <= AskToolWinHeight()*2+ListHeight+SepaWidth))\r
                {\r
                        /* 境界位置変更用カーソルに変更 */\r
                        SetCapture(hWndFtp);\r
@@ -2356,17 +2900,25 @@ static void CheckResizeFrame(WPARAM Keys, int x, int y)
                        GetClientRect(GetSbarWnd(), &Rect1);\r
                        Rect.left += GetSystemMetrics(SM_CXFRAME);\r
                        Rect.right -= GetSystemMetrics(SM_CXFRAME);\r
-                       Rect.top += TOOLWIN_HEIGHT*2 + GetSystemMetrics(SM_CYMENU) + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME);\r
+                       // 高DPI対応\r
+//                     Rect.top += TOOLWIN_HEIGHT*2 + GetSystemMetrics(SM_CYMENU) + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME);\r
+                       Rect.top += AskToolWinHeight()*2 + GetSystemMetrics(SM_CYMENU) + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME);\r
                        Rect.bottom -= GetSystemMetrics(SM_CYFRAME) + Rect1.bottom;\r
                        ClipCursor(&Rect);\r
                }\r
                else\r
                {\r
+                       // 高DPI対応\r
+//                     if(((ResizePos == RESIZE_HPOS) &&\r
+//                             ((x < LocalWidth) || (x > LocalWidth + SepaWidth) ||\r
+//                              (y <= TOOLWIN_HEIGHT) || (y >= (TOOLWIN_HEIGHT * 2 + ListHeight)))) ||\r
+//                        ((ResizePos == RESIZE_VPOS) &&\r
+//                             ((y < TOOLWIN_HEIGHT*2+ListHeight) || (y > TOOLWIN_HEIGHT*2+ListHeight+SepaWidth))))\r
                        if(((ResizePos == RESIZE_HPOS) &&\r
                                ((x < LocalWidth) || (x > LocalWidth + SepaWidth) ||\r
-                                (y <= TOOLWIN_HEIGHT) || (y >= (TOOLWIN_HEIGHT * 2 + ListHeight)))) ||\r
+                                (y <= AskToolWinHeight()) || (y >= (AskToolWinHeight() * 2 + ListHeight)))) ||\r
                           ((ResizePos == RESIZE_VPOS) &&\r
-                               ((y < TOOLWIN_HEIGHT*2+ListHeight) || (y > TOOLWIN_HEIGHT*2+ListHeight+SepaWidth))))\r
+                               ((y < AskToolWinHeight()*2+ListHeight) || (y > AskToolWinHeight()*2+ListHeight+SepaWidth))))\r
                        {\r
                                /* 元のカーソルに戻す */\r
                                ReleaseCapture();\r
@@ -2448,11 +3000,21 @@ void ExecViewer(char *Fname, int App)
 \r
        AskLocalCurDir(CurDir, FMAX_PATH);\r
 \r
-       if((App == -1) && (FindExecutable(Fname, NULL, AssocProg) > (HINSTANCE)32))\r
+       // 任意のコードが実行されるバグ修正\r
+       // 拡張子が無いと補完されるため\r
+//     if((App == -1) && (FindExecutable(Fname, NULL, AssocProg) > (HINSTANCE)32))\r
+       if((App == -1) && (strlen(GetFileExt(GetFileName(Fname))) > 0) && (FindExecutable(Fname, NULL, AssocProg) > (HINSTANCE)32))\r
        {\r
                DoPrintf("ShellExecute - %s", Fname);\r
                ShellExecute(NULL, "open", Fname, NULL, CurDir, SW_SHOW);\r
        }\r
+       // ローカルフォルダを開く\r
+       else if((App == -1) && (GetFileAttributes(Fname) & FILE_ATTRIBUTE_DIRECTORY))\r
+       {\r
+               MakeDistinguishableFileName(ComLine, Fname);\r
+               DoPrintf("ShellExecute - %s", Fname);\r
+               ShellExecute(NULL, "open", ComLine, NULL, Fname, SW_SHOW);\r
+       }\r
        else\r
        {\r
                App = max1(0, App);\r
@@ -2634,7 +3196,9 @@ static void DeleteAlltempFile(void)
 *              BOOL TRUE/FALSE\r
 *----------------------------------------------------------------------------*/\r
 \r
-static BOOL CALLBACK AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
+// 64ビット対応\r
+//static BOOL CALLBACK AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
+static INT_PTR CALLBACK AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
 {\r
        static char Tmp[80];\r
        int Ver;\r
@@ -2762,7 +3326,11 @@ int BackgrndMessageProc(void)
        Ret = NO;\r
        while(PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE))\r
        {\r
-               if(!HtmlHelp(NULL, NULL, HH_PRETRANSLATEMESSAGE, (DWORD)&Msg))\r
+               // マルチコアCPUの特定環境下でファイル通信中にクラッシュするバグ対策\r
+//             if(!HtmlHelp(NULL, NULL, HH_PRETRANSLATEMESSAGE, (DWORD)&Msg))\r
+               // 64ビット対応\r
+//             if(!IsMainThread() || !HtmlHelp(NULL, NULL, HH_PRETRANSLATEMESSAGE, (DWORD)&Msg))\r
+               if(!IsMainThread() || !HtmlHelp(NULL, NULL, HH_PRETRANSLATEMESSAGE, (DWORD_PTR)&Msg))\r
                {\r
                        /* ディレクトリ名の表示コンボボックスでBSやRETが効くように */\r
                        /* コンボボックス内ではアクセラレータを無効にする */\r
@@ -2884,11 +3452,14 @@ BOOL __stdcall SSLTimeoutCallback(BOOL* pbAborted)
 BOOL __stdcall SSLConfirmCallback(BOOL* pbAborted, BOOL bVerified, LPCSTR Certificate, LPCSTR CommonName)\r
 {\r
        BOOL bResult;\r
-       int i;\r
        uint32 Hash[5];\r
+       int i;\r
        char* pm0;\r
        bResult = FALSE;\r
        sha_memory((char*)Certificate, (uint32)(strlen(Certificate) * sizeof(char)), (uint32*)&Hash);\r
+       // sha.cはビッグエンディアンのため\r
+       for(i = 0; i < 5; i++)\r
+               Hash[i] = _byteswap_ulong(Hash[i]);\r
        i = 0;\r
        while(i < MAX_CERT_CACHE_HASH)\r
        {\r
@@ -2919,3 +3490,181 @@ BOOL __stdcall SSLConfirmCallback(BOOL* pbAborted, BOOL bVerified, LPCSTR Certif
        return bResult;\r
 }\r
 \r
+BOOL LoadSSLRootCAFile()\r
+{\r
+       BOOL bResult;\r
+       HANDLE hFile;\r
+       DWORD Size;\r
+       BYTE* pBuffer;\r
+       uint32 Hash[5];\r
+       int i;\r
+       bResult = FALSE;\r
+       if((hFile = CreateFile(SSLRootCAFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) != INVALID_HANDLE_VALUE)\r
+       {\r
+               Size = GetFileSize(hFile, NULL);\r
+               if(pBuffer = (BYTE*)malloc(Size))\r
+               {\r
+                       if(ReadFile(hFile, pBuffer, Size, &Size, NULL))\r
+                       {\r
+                               sha_memory((char*)pBuffer, (uint32)Size, (uint32*)&Hash);\r
+                               // sha.cはビッグエンディアンのため\r
+                               for(i = 0; i < 5; i++)\r
+                                       Hash[i] = _byteswap_ulong(Hash[i]);\r
+                               // 同梱する"ssl.pem"に合わせてSHA1ハッシュ値を変更すること\r
+                               if(memcmp(&Hash, &SSLRootCAFileHash, 20) == 0 || memcmp(&Hash, "\xC8\xF6\x0B\x07\x10\x42\x55\xE7\x57\x7F\xE9\x52\xE0\x3F\xA8\xE4\x08\x2B\xB0\xE2", 20) == 0\r
+                                       || DialogBox(GetFtpInst(), MAKEINTRESOURCE(updatesslroot_dlg), GetMainHwnd(), ExeEscDialogProc) == YES)\r
+                               {\r
+                                       memcpy(&SSLRootCAFileHash, &Hash, 20);\r
+                                       if(SetSSLRootCertificate(pBuffer, Size))\r
+                                               bResult = TRUE;\r
+                               }\r
+                       }\r
+                       free(pBuffer);\r
+               }\r
+               CloseHandle(hFile);\r
+       }\r
+       return bResult;\r
+}\r
+\r
+// マルチコアCPUの特定環境下でファイル通信中にクラッシュするバグ対策\r
+BOOL IsMainThread()\r
+{\r
+       if(GetCurrentThreadId() != MainThreadId)\r
+               return FALSE;\r
+       return TRUE;\r
+}\r
+\r
+// ポータブル版判定\r
+void CheckPortableVersion()\r
+{\r
+       HANDLE hFile;\r
+       if((hFile = CreateFile(PortableFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) != INVALID_HANDLE_VALUE)\r
+       {\r
+               PortableVersion = YES;\r
+               CloseHandle(hFile);\r
+       }\r
+       else\r
+               PortableVersion = NO;\r
+}\r
+\r
+int AskPortableVersion(void)\r
+{\r
+       return(PortableVersion);\r
+}\r
+\r
+// 全設定暗号化対応\r
+int Restart()\r
+{\r
+       int Sts;\r
+       char* CommandLine;\r
+       STARTUPINFO si;\r
+       PROCESS_INFORMATION pi;\r
+       Sts = FFFTP_FAIL;\r
+       if(CommandLine = (char*)malloc(sizeof(char) * (strlen(GetCommandLine())  + 1)))\r
+       {\r
+               strcpy(CommandLine, GetCommandLine());\r
+               GetStartupInfo(&si);\r
+               if(CreateProcess(NULL, CommandLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))\r
+               {\r
+                       CloseHandle(pi.hThread);\r
+                       CloseHandle(pi.hProcess);\r
+                       Sts = FFFTP_SUCCESS;\r
+               }\r
+               free(CommandLine);\r
+       }\r
+       return Sts;\r
+}\r
+\r
+void RestartAndTerminate()\r
+{\r
+       Restart();\r
+       exit(1);\r
+}\r
+\r
+// タスクバー進捗表示\r
+int LoadTaskbarList3()\r
+{\r
+       int Sts;\r
+       Sts = FFFTP_FAIL;\r
+       if(CoCreateInstance(&CLSID_TaskbarList, NULL, CLSCTX_ALL, &IID_ITaskbarList3, (void**)&pTaskbarList3) == S_OK)\r
+       {\r
+               Sts = FFFTP_SUCCESS;\r
+       }\r
+       return Sts;\r
+}\r
+\r
+void FreeTaskbarList3()\r
+{\r
+       if(pTaskbarList3 != NULL)\r
+               pTaskbarList3->lpVtbl->Release(pTaskbarList3);\r
+       pTaskbarList3 = NULL;\r
+}\r
+\r
+int IsTaskbarList3Loaded()\r
+{\r
+       int Sts;\r
+       Sts = NO;\r
+       if(pTaskbarList3 != NULL)\r
+               Sts = YES;\r
+       return Sts;\r
+}\r
+\r
+void UpdateTaskbarProgress()\r
+{\r
+       if(AskTransferSizeTotal() > 0)\r
+       {\r
+               if(AskTransferErrorDisplay() > 0)\r
+                       pTaskbarList3->lpVtbl->SetProgressState(pTaskbarList3, GetMainHwnd(), TBPF_ERROR);\r
+               else\r
+                       pTaskbarList3->lpVtbl->SetProgressState(pTaskbarList3, GetMainHwnd(), TBPF_NORMAL);\r
+               pTaskbarList3->lpVtbl->SetProgressValue(pTaskbarList3, GetMainHwnd(), (ULONGLONG)(AskTransferSizeTotal() - AskTransferSizeLeft()), (ULONGLONG)AskTransferSizeTotal());\r
+       }\r
+       else\r
+               pTaskbarList3->lpVtbl->SetProgressState(pTaskbarList3, GetMainHwnd(), TBPF_NOPROGRESS);\r
+}\r
+\r
+// 高DPI対応\r
+int AskToolWinHeight(void)\r
+{\r
+       return(ToolWinHeight);\r
+}\r
+\r
+// ソフトウェア自動更新\r
+void UpdateSoftware(int NoError, int NoConfirm)\r
+{\r
+       DWORD Version;\r
+       char VersionString[32];\r
+       char Tmp[FMAX_PATH+1];\r
+       // 念のためマスターパスワードの一致を確認\r
+       if(GetMasterPasswordStatus() == PASSWORD_OK)\r
+       {\r
+               Version = RELEASE_VERSION_NUM;\r
+               LastAutoCheckForUpdates = time(NULL);\r
+               if(CheckForUpdates(FALSE, NULL, &Version, VersionString))\r
+               {\r
+                       if(Version > RELEASE_VERSION_NUM)\r
+                       {\r
+                               sprintf(Tmp, MSGJPN362, VER_STR, VersionString);\r
+                               if(NoConfirm == YES || MessageBox(GetMainHwnd(), Tmp, "FFFTP", MB_YESNO) == IDYES)\r
+                               {\r
+                                       strcpy(Tmp, TmpPath);\r
+                                       SetYenTail(Tmp);\r
+                                       strcat(Tmp, "update");\r
+                                       _mkdir(Tmp);\r
+                                       if(CheckForUpdates(TRUE, Tmp, &Version, VersionString))\r
+                                       {\r
+                                               MessageBox(GetMainHwnd(), MSGJPN365, "FFFTP", MB_OK);\r
+                                               ApplyUpdatesOnExit = YES;\r
+                                       }\r
+                                       else if(NoError == NO)\r
+                                               MessageBox(GetMainHwnd(), MSGJPN363, "FFFTP", MB_OK | MB_ICONERROR);\r
+                               }\r
+                       }\r
+                       else if(NoError == NO)\r
+                               MessageBox(GetMainHwnd(), MSGJPN364, "FFFTP", MB_OK);\r
+               }\r
+               else if(NoError == NO)\r
+                       MessageBox(GetMainHwnd(), MSGJPN363, "FFFTP", MB_OK | MB_ICONERROR);\r
+       }\r
+}\r
+\r