OSDN Git Service

Add options to control the behavior of mirroring transfer.
[ffftp/ffftp.git] / registry.c
index 8f41e39..15da21b 100644 (file)
 \r
 /*===== プロトタイプ =====*/\r
 \r
-static void SaveStr(HKEY hKey, char *Key, char *Str, char *DefaultStr);\r
-static void SaveIntNum(HKEY hKey, char *Key, int Num, int DefaultNum);\r
+// バグ修正\r
+//static void SaveStr(HKEY hKey, char *Key, char *Str, char *DefaultStr);\r
+//static void SaveIntNum(HKEY hKey, char *Key, int Num, int DefaultNum);\r
+static void SaveStr(void *Handle, char *Key, char *Str, char *DefaultStr);\r
+static void SaveIntNum(void *Handle, char *Key, int Num, int DefaultNum);\r
 static void MakeFontData(LOGFONT Font, HFONT hFont, char *Buf);\r
 static int RestoreFontData(char *Str, LOGFONT *Font);\r
 \r
@@ -90,11 +93,22 @@ static int WriteBinaryToReg(void *Handle, char *Name, void *Bin, int Len);
 static int StrCatOut(char *Src, int Len, char *Dst);\r
 static int StrReadIn(char *Src, int Max, char *Dst);\r
 \r
-int CheckPasswordValidity( char* Password, int length, const char* HashStr );\r
-void CreatePasswordHash( char* Password, int length, char* HashStr );\r
+// 全設定暗号化対応\r
+//int CheckPasswordValidity( char* Password, int length, const char* HashStr );\r
+//void CreatePasswordHash( char* Password, int length, char* HashStr );\r
+int CheckPasswordValidity( char* Password, int length, const char* HashStr, int StretchCount );\r
+void CreatePasswordHash( char* Password, int length, char* HashStr, int StretchCount );\r
 void SetHashSalt( DWORD salt );\r
+// 全設定暗号化対応\r
+void SetHashSalt1(void* Salt, int Length);\r
 \r
-DWORD GetRandamDWRODValue(void);\r
+DWORD GetRandamDWORDValue(void);\r
+\r
+// 全設定暗号化対応\r
+void GetMaskWithHMACSHA1(DWORD IV, const char* Salt, int SaltLength, void* pHash);\r
+void MaskSettingsData(const char* Salt, int SaltLength, void* Data, DWORD Size, int EscapeZero);\r
+void UnmaskSettingsData(const char* Salt, int SaltLength, void* Data, DWORD Size, int EscapeZero);\r
+void CalculateSettingsDataChecksum(void* Data, DWORD Size);\r
 \r
 /* 2010.01.30 genta 追加 */\r
 static char SecretKey[FMAX_PATH+1];\r
@@ -107,6 +121,11 @@ static ulong RndSource[9];
 // UTF-8対応\r
 static int IniKanjiCode = KANJI_NOCNV;\r
 \r
+// 全設定暗号化対応\r
+static int EncryptSettings = NO;\r
+static BYTE EncryptSettingsChecksum[20];\r
+static int EncryptSettingsError = NO;\r
+\r
 /*===== 外部参照 =====*/\r
 \r
 /* 設定値 */\r
@@ -155,7 +174,7 @@ extern int FwallPort;
 extern int FwallType;\r
 extern int FwallDefault;\r
 extern int FwallSecurity;\r
-extern int FwallResolv;\r
+extern int FwallResolve;\r
 extern int FwallLower;\r
 extern int FwallDelimiter;\r
 extern int PasvDefault;\r
@@ -193,6 +212,35 @@ extern int FolderAttrNum;
 // 暗号化通信対応\r
 extern BYTE CertificateCacheHash[MAX_CERT_CACHE_HASH][20];\r
 extern BYTE SSLRootCAFileHash[20];\r
+// ファイルアイコン表示対応\r
+extern int DispFileIcon;\r
+// タイムスタンプのバグ修正\r
+extern int DispTimeSeconds;\r
+// ファイルの属性を数字で表示\r
+extern int DispPermissionsNumber;\r
+// ディレクトリ自動作成\r
+extern int MakeAllDir;\r
+// UTF-8対応\r
+extern int LocalKanjiCode;\r
+// UPnP対応\r
+extern int UPnPEnabled;\r
+// 全設定暗号化対応\r
+extern int EncryptAllSettings;\r
+// ローカル側自動更新\r
+extern int AutoRefreshFileList;\r
+// 古い処理内容を消去\r
+extern int RemoveOldLog;\r
+// バージョン確認\r
+extern int ReadOnlySettings;\r
+// ソフトウェア自動更新\r
+extern int AutoCheckForUpdates;\r
+extern int AutoApplyUpdates;\r
+extern int AutoCheckForUptatesInterval;\r
+extern time_t LastAutoCheckForUpdates;\r
+// ファイル一覧バグ修正\r
+extern int AbortOnListError;\r
+// ミラーリング設定追加\r
+extern int MirrorNoTransferContents; \r
 \r
 /*----- マスタパスワードの設定 ----------------------------------------------\r
 *\r
@@ -217,6 +265,12 @@ void SetMasterPassword( const char* Password )
        IsMasterPasswordError = PASSWORD_OK;\r
 }\r
 \r
+// セキュリティ強化\r
+void GetMasterPassword(char* Password)\r
+{\r
+       strcpy(Password, SecretKey);\r
+}\r
+\r
 /*----- マスタパスワードの状態取得 ----------------------------------------------\r
 *\r
 *      Parameter\r
@@ -258,19 +312,62 @@ int ValidateMasterPassword(void)
        if(i == FFFTP_SUCCESS){\r
                char checkbuf[48];\r
                int salt = 0;\r
-\r
-               if( ReadIntValueFromReg(hKey3, "CredentialSalt", &salt)){\r
-                       SetHashSalt( salt );\r
+               // 全設定暗号化対応\r
+               int stretch = 0;\r
+               unsigned char salt1[16];\r
+\r
+               // 全設定暗号化対応\r
+//             if( ReadIntValueFromReg(hKey3, "CredentialSalt", &salt)){\r
+//                     SetHashSalt( salt );\r
+//             }\r
+//             if( ReadStringFromReg(hKey3, "CredentialCheck", checkbuf, sizeof( checkbuf )) == FFFTP_SUCCESS ){\r
+//                     switch( CheckPasswordValidity( SecretKey, SecretKeyLength, checkbuf ) ){\r
+//                     case 0: /* not match */\r
+//                             IsMasterPasswordError = PASSWORD_UNMATCH;\r
+//                             break;\r
+//                     case 1: /* match */\r
+//                             IsMasterPasswordError = PASSWORD_OK;\r
+//                             break;\r
+//                     case 2: /* invalid hash */\r
+//                     default:\r
+//                             IsMasterPasswordError = BAD_PASSWORD_HASH;\r
+//                             break;\r
+//                     }\r
+//             }\r
+               if(ReadStringFromReg(hKey3, "CredentialCheck1", checkbuf, sizeof(checkbuf)) == FFFTP_SUCCESS)\r
+               {\r
+                       if(ReadBinaryFromReg(hKey3, "CredentialSalt1", &salt1, sizeof(salt1)) == FFFTP_SUCCESS)\r
+                               SetHashSalt1(&salt1, 16);\r
+                       else\r
+                               SetHashSalt1(NULL, 0);\r
+                       ReadIntValueFromReg(hKey3, "CredentialStretch", &stretch);\r
+                       switch(CheckPasswordValidity(SecretKey, SecretKeyLength, checkbuf, stretch))\r
+                       {\r
+                       case 0:\r
+                               IsMasterPasswordError = PASSWORD_UNMATCH;\r
+                               break;\r
+                       case 1:\r
+                               IsMasterPasswordError = PASSWORD_OK;\r
+                               break;\r
+                       default:\r
+                               IsMasterPasswordError = BAD_PASSWORD_HASH;\r
+                               break;\r
+                       }\r
                }\r
-               if( ReadStringFromReg(hKey3, "CredentialCheck", checkbuf, sizeof( checkbuf )) == FFFTP_SUCCESS ){\r
-                       switch( CheckPasswordValidity( SecretKey, SecretKeyLength, checkbuf ) ){\r
-                       case 0: /* not match */\r
+               else if(ReadStringFromReg(hKey3, "CredentialCheck", checkbuf, sizeof(checkbuf)) == FFFTP_SUCCESS)\r
+               {\r
+                       if(ReadIntValueFromReg(hKey3, "CredentialSalt", &salt) == FFFTP_SUCCESS)\r
+                               SetHashSalt(salt);\r
+                       else\r
+                               SetHashSalt1(NULL, 0);\r
+                       switch(CheckPasswordValidity(SecretKey, SecretKeyLength, checkbuf, 0))\r
+                       {\r
+                       case 0:\r
                                IsMasterPasswordError = PASSWORD_UNMATCH;\r
                                break;\r
-                       case 1: /* match */\r
+                       case 1:\r
                                IsMasterPasswordError = PASSWORD_OK;\r
                                break;\r
-                       case 2: /* invalid hash */\r
                        default:\r
                                IsMasterPasswordError = BAD_PASSWORD_HASH;\r
                                break;\r
@@ -291,7 +388,7 @@ int ValidateMasterPassword(void)
 *              なし\r
 *----------------------------------------------------------------------------*/\r
 \r
-void SaveRegistory(void)\r
+void SaveRegistry(void)\r
 {\r
        void *hKey3;\r
        void *hKey4;\r
@@ -312,21 +409,67 @@ void SaveRegistory(void)
                return;\r
        }\r
 \r
+       // 全設定暗号化対応\r
+       if(EncryptSettingsError == YES)\r
+               return;\r
+\r
+       // バージョン確認\r
+       if(ReadOnlySettings == YES)\r
+               return;\r
+\r
        SetRegType(RegType);\r
        if(CreateReg("FFFTP", &hKey3) == FFFTP_SUCCESS)\r
        {\r
                char buf[48];\r
                int salt = GetTickCount();\r
+               // 全設定暗号化対応\r
+               unsigned char salt1[16];\r
+               FILETIME ft[4];\r
        \r
                WriteIntValueToReg(hKey3, "Version", VER_NUM);\r
-               WriteIntValueToReg(hKey3, "CredentialSalt", salt);\r
-               \r
-               SetHashSalt( salt );\r
-               /* save password hash */\r
-               CreatePasswordHash( SecretKey, SecretKeyLength, buf );\r
-               WriteStringToReg(hKey3, "CredentialCheck", buf);\r
+               // 全設定暗号化対応\r
+//             WriteIntValueToReg(hKey3, "CredentialSalt", salt);\r
+//             \r
+//             SetHashSalt( salt );\r
+//             /* save password hash */\r
+//             CreatePasswordHash( SecretKey, SecretKeyLength, buf );\r
+//             WriteStringToReg(hKey3, "CredentialCheck", buf);\r
+               if(EncryptAllSettings == YES)\r
+               {\r
+                       GetProcessTimes(GetCurrentProcess(), &ft[0], &ft[1], &ft[2], &ft[3]);\r
+                       memcpy(&salt1[0], &salt, 4);\r
+                       memcpy(&salt1[4], &ft[0].dwLowDateTime, 4);\r
+                       memcpy(&salt1[8], &ft[2].dwLowDateTime, 4);\r
+                       memcpy(&salt1[12], &ft[3].dwLowDateTime, 4);\r
+                       SetHashSalt1(&salt1, 16);\r
+                       WriteBinaryToReg(hKey3, "CredentialSalt1", &salt1, sizeof(salt1));\r
+                       WriteIntValueToReg(hKey3, "CredentialStretch", 65535);\r
+                       CreatePasswordHash(SecretKey, SecretKeyLength, buf, 65535);\r
+                       WriteStringToReg(hKey3, "CredentialCheck1", buf);\r
+               }\r
+               else\r
+               {\r
+                       SetHashSalt( salt );\r
+                       WriteIntValueToReg(hKey3, "CredentialSalt", salt);\r
+                       CreatePasswordHash(SecretKey, SecretKeyLength, buf, 0);\r
+                       WriteStringToReg(hKey3, "CredentialCheck", buf);\r
+               }\r
 \r
-               if(CreateSubKey(hKey3, "Options", &hKey4) == FFFTP_SUCCESS)\r
+               // 全設定暗号化対応\r
+               WriteIntValueToReg(hKey3, "EncryptAll", EncryptAllSettings);\r
+               sprintf(Buf, "%d", EncryptAllSettings);\r
+               EncodePassword(Buf, Str);\r
+               WriteStringToReg(hKey3, "EncryptAllDetector", Str);\r
+               EncryptSettings = EncryptAllSettings;\r
+               memset(&EncryptSettingsChecksum, 0, 20);\r
+\r
+               // 全設定暗号化対応\r
+//             if(CreateSubKey(hKey3, "Options", &hKey4) == FFFTP_SUCCESS)\r
+               if(EncryptAllSettings == YES)\r
+                       strcpy(Str, "EncryptedOptions");\r
+               else\r
+                       strcpy(Str, "Options");\r
+               if(CreateSubKey(hKey3, Str, &hKey4) == FFFTP_SUCCESS)\r
                {\r
                        WriteIntValueToReg(hKey4, "NoSave", SuppressSave);\r
 \r
@@ -409,7 +552,7 @@ void SaveRegistory(void)
                                WriteIntValueToReg(hKey4, "FwallDef", FwallDefault);\r
                                WriteIntValueToReg(hKey4, "FwallSec", FwallSecurity);\r
                                WriteIntValueToReg(hKey4, "PasvDef", PasvDefault);\r
-                               WriteIntValueToReg(hKey4, "FwallRes", FwallResolv);\r
+                               WriteIntValueToReg(hKey4, "FwallRes", FwallResolve);\r
                                WriteIntValueToReg(hKey4, "FwallLow", FwallLower);\r
                                WriteIntValueToReg(hKey4, "FwallDel", FwallDelimiter);\r
 \r
@@ -422,7 +565,10 @@ void SaveRegistory(void)
 \r
                                WriteMultiStringToReg(hKey4, "DefAttr", DefAttrList);\r
 \r
-                               GetTempPath(FMAX_PATH, Str);\r
+                               // 環境依存の不具合対策\r
+//                             GetTempPath(FMAX_PATH, Str);\r
+                               GetAppTempPath(Str);\r
+                               SetYenTail(Str);\r
                                SaveStr(hKey4, "Tmp", TmpPath, Str);\r
 \r
                                WriteBinaryToReg(hKey4, "Hdlg", &HostDlgSize, sizeof(SIZE));\r
@@ -484,6 +630,7 @@ void SaveRegistory(void)
                                                        SaveIntNum(hKey5, "SFTP", Hist.UseSFTP, DefaultHist.UseSFTP);\r
                                                        EncodePassword(Hist.PrivateKey, Str);\r
                                                        SaveStr(hKey5, "PKey", Str, DefaultHist.PrivateKey);\r
+                                                       SaveIntNum(hKey5, "NoWeak", Hist.NoWeakEncryption, DefaultHist.NoWeakEncryption);\r
                                                        // 同時接続対応\r
                                                        SaveIntNum(hKey5, "ThreadCount", Hist.MaxThreadCount, DefaultHist.MaxThreadCount);\r
                                                        SaveIntNum(hKey5, "ReuseCmdSkt", Hist.ReuseCmdSkt, DefaultHist.ReuseCmdSkt);\r
@@ -493,6 +640,11 @@ void SaveRegistory(void)
                                                        SaveIntNum(hKey5, "NetType", Hist.NetType, DefaultHist.NetType);\r
                                                        // 自動切断対策\r
                                                        SaveIntNum(hKey5, "Noop", Hist.NoopInterval, DefaultHist.NoopInterval);\r
+                                                       // 再転送対応\r
+                                                       SaveIntNum(hKey5, "ErrMode", Hist.TransferErrorMode, DefaultHist.TransferErrorMode);\r
+                                                       SaveIntNum(hKey5, "ErrNotify", Hist.TransferErrorNotify, DefaultHist.TransferErrorNotify);\r
+                                                       // セッションあたりの転送量制限対策\r
+                                                       SaveIntNum(hKey5, "ErrReconnect", Hist.TransferErrorReconnect, DefaultHist.TransferErrorReconnect);\r
 \r
                                                        CloseSubKey(hKey5);\r
                                                        n++;\r
@@ -509,6 +661,66 @@ void SaveRegistory(void)
                                                break;\r
                                }\r
 \r
+                               // ホスト共通設定機能\r
+                               if(CreateSubKey(hKey4, "DefaultHost", &hKey5) == FFFTP_SUCCESS)\r
+                               {\r
+                                       CopyDefaultDefaultHost(&DefaultHost);\r
+                                       CopyDefaultHost(&Host);\r
+                                       WriteIntValueToReg(hKey5, "Set", Host.Level);\r
+                                       SaveStr(hKey5, "HostName", Host.HostName, DefaultHost.HostName);\r
+                                       SaveStr(hKey5, "HostAdrs", Host.HostAdrs, DefaultHost.HostAdrs);\r
+                                       SaveStr(hKey5, "UserName", Host.UserName, DefaultHost.UserName);\r
+                                       SaveStr(hKey5, "Account", Host.Account, DefaultHost.Account);\r
+                                       SaveStr(hKey5, "LocalDir", Host.LocalInitDir, NULL);\r
+                                       SaveStr(hKey5, "RemoteDir", Host.RemoteInitDir, DefaultHost.RemoteInitDir);\r
+                                       SaveStr(hKey5, "Chmod", Host.ChmodCmd, DefaultHost.ChmodCmd);\r
+                                       SaveStr(hKey5, "Nlst", Host.LsName, DefaultHost.LsName);\r
+                                       SaveStr(hKey5, "Init", Host.InitCmd, DefaultHost.InitCmd);\r
+                                       if(Host.Anonymous == NO)\r
+                                               EncodePassword(Host.PassWord, Str);\r
+                                       else\r
+                                               strcpy(Str, DefaultHost.PassWord);\r
+                                       SaveStr(hKey5, "Password", Str, DefaultHost.PassWord);\r
+                                       SaveIntNum(hKey5, "Port", Host.Port, DefaultHost.Port);\r
+                                       SaveIntNum(hKey5, "Anonymous", Host.Anonymous, DefaultHost.Anonymous);\r
+                                       SaveIntNum(hKey5, "Kanji", Host.KanjiCode, DefaultHost.KanjiCode);\r
+                                       SaveIntNum(hKey5, "KanaCnv", Host.KanaCnv, DefaultHost.KanaCnv);\r
+                                       SaveIntNum(hKey5, "NameKanji", Host.NameKanjiCode, DefaultHost.NameKanjiCode);\r
+                                       SaveIntNum(hKey5, "NameKana", Host.NameKanaCnv, DefaultHost.NameKanaCnv);\r
+                                       SaveIntNum(hKey5, "Pasv", Host.Pasv, DefaultHost.Pasv);\r
+                                       SaveIntNum(hKey5, "Fwall", Host.FireWall, DefaultHost.FireWall);\r
+                                       SaveIntNum(hKey5, "List", Host.ListCmdOnly, DefaultHost.ListCmdOnly);\r
+                                       SaveIntNum(hKey5, "NLST-R", Host.UseNLST_R, DefaultHost.UseNLST_R);\r
+                                       SaveIntNum(hKey5, "Last", Host.LastDir, DefaultHost.LastDir);\r
+                                       SaveIntNum(hKey5, "Tzone", Host.TimeZone, DefaultHost.TimeZone);\r
+                                       SaveIntNum(hKey5, "Type", Host.HostType, DefaultHost.HostType);\r
+                                       SaveIntNum(hKey5, "Sync", Host.SyncMove, DefaultHost.SyncMove);\r
+                                       SaveIntNum(hKey5, "Fpath", Host.NoFullPath, DefaultHost.NoFullPath);\r
+                                       WriteBinaryToReg(hKey5, "Sort", &Host.Sort, sizeof(Host.Sort));\r
+                                       SaveIntNum(hKey5, "Secu", Host.Security, DefaultHost.Security);\r
+                                       WriteMultiStringToReg(hKey5, "Bmarks", Host.BookMark);\r
+                                       SaveIntNum(hKey5, "Dial", Host.Dialup, DefaultHost.Dialup);\r
+                                       SaveIntNum(hKey5, "UseIt", Host.DialupAlways, DefaultHost.DialupAlways);\r
+                                       SaveIntNum(hKey5, "Notify", Host.DialupNotify, DefaultHost.DialupNotify);\r
+                                       SaveStr(hKey5, "DialTo", Host.DialEntry, DefaultHost.DialEntry);\r
+                                       SaveIntNum(hKey5, "NoEncryption", Host.UseNoEncryption, DefaultHost.UseNoEncryption);\r
+                                       SaveIntNum(hKey5, "FTPES", Host.UseFTPES, DefaultHost.UseFTPES);\r
+                                       SaveIntNum(hKey5, "FTPIS", Host.UseFTPIS, DefaultHost.UseFTPIS);\r
+                                       SaveIntNum(hKey5, "SFTP", Host.UseSFTP, DefaultHost.UseSFTP);\r
+                                       EncodePassword(Host.PrivateKey, Str);\r
+                                       SaveStr(hKey5, "PKey", Str, DefaultHost.PrivateKey);\r
+                                       SaveIntNum(hKey5, "NoWeak", Host.NoWeakEncryption, DefaultHost.NoWeakEncryption);\r
+                                       SaveIntNum(hKey5, "ThreadCount", Host.MaxThreadCount, DefaultHost.MaxThreadCount);\r
+                                       SaveIntNum(hKey5, "ReuseCmdSkt", Host.ReuseCmdSkt, DefaultHost.ReuseCmdSkt);\r
+                                       SaveIntNum(hKey5, "MLSD", Host.UseMLSD, DefaultHost.UseMLSD);\r
+                                       SaveIntNum(hKey5, "NetType", Host.NetType, DefaultHost.NetType);\r
+                                       SaveIntNum(hKey5, "Noop", Host.NoopInterval, DefaultHost.NoopInterval);\r
+                                       SaveIntNum(hKey5, "ErrMode", Host.TransferErrorMode, DefaultHost.TransferErrorMode);\r
+                                       SaveIntNum(hKey5, "ErrNotify", Host.TransferErrorNotify, DefaultHost.TransferErrorNotify);\r
+                                       SaveIntNum(hKey5, "ErrReconnect", Host.TransferErrorReconnect, DefaultHost.TransferErrorReconnect);\r
+                                       CloseSubKey(hKey5);\r
+                               }\r
+\r
                                /* ホストの設定を保存 */\r
                                CopyDefaultHost(&DefaultHost);\r
                                i = 0;\r
@@ -568,6 +780,7 @@ void SaveRegistory(void)
                                                        SaveIntNum(hKey5, "SFTP", Host.UseSFTP, DefaultHost.UseSFTP);\r
                                                        EncodePassword(Host.PrivateKey, Str);\r
                                                        SaveStr(hKey5, "PKey", Str, DefaultHost.PrivateKey);\r
+                                                       SaveIntNum(hKey5, "NoWeak", Host.NoWeakEncryption, DefaultHost.NoWeakEncryption);\r
                                                        // 同時接続対応\r
                                                        SaveIntNum(hKey5, "ThreadCount", Host.MaxThreadCount, DefaultHost.MaxThreadCount);\r
                                                        SaveIntNum(hKey5, "ReuseCmdSkt", Host.ReuseCmdSkt, DefaultHost.ReuseCmdSkt);\r
@@ -577,6 +790,11 @@ void SaveRegistory(void)
                                                        SaveIntNum(hKey5, "NetType", Host.NetType, DefaultHost.NetType);\r
                                                        // 自動切断対策\r
                                                        SaveIntNum(hKey5, "Noop", Host.NoopInterval, DefaultHost.NoopInterval);\r
+                                                       // 再転送対応\r
+                                                       SaveIntNum(hKey5, "ErrMode", Host.TransferErrorMode, DefaultHost.TransferErrorMode);\r
+                                                       SaveIntNum(hKey5, "ErrNotify", Host.TransferErrorNotify, DefaultHost.TransferErrorNotify);\r
+                                                       // セッションあたりの転送量制限対策\r
+                                                       SaveIntNum(hKey5, "ErrReconnect", Host.TransferErrorReconnect, DefaultHost.TransferErrorReconnect);\r
                                                }\r
                                                CloseSubKey(hKey5);\r
                                        }\r
@@ -602,9 +820,82 @@ void SaveRegistory(void)
                                StrCatOut((char*)&SSLRootCAFileHash, sizeof(SSLRootCAFileHash), Buf);\r
                                EncodePassword(Buf, Str);\r
                                WriteStringToReg(hKey4, "RootCertHash", Str);\r
+                               // ファイルアイコン表示対応\r
+                               WriteIntValueToReg(hKey4, "ListIcon", DispFileIcon);\r
+                               // タイムスタンプのバグ修正\r
+                               WriteIntValueToReg(hKey4, "ListSecond", DispTimeSeconds);\r
+                               // ファイルの属性を数字で表示\r
+                               WriteIntValueToReg(hKey4, "ListPermitNum", DispPermissionsNumber);\r
+                               // ディレクトリ自動作成\r
+                               WriteIntValueToReg(hKey4, "MakeDir", MakeAllDir);\r
+                               // UTF-8対応\r
+                               WriteIntValueToReg(hKey4, "Kanji", LocalKanjiCode);\r
+                               // UPnP対応\r
+                               WriteIntValueToReg(hKey4, "UPnP", UPnPEnabled);\r
+                               // ローカル側自動更新\r
+                               WriteIntValueToReg(hKey4, "ListRefresh", AutoRefreshFileList);\r
+                               // 古い処理内容を消去\r
+                               WriteIntValueToReg(hKey4, "OldLog", RemoveOldLog);\r
+                               // ソフトウェア自動更新\r
+                               WriteIntValueToReg(hKey4, "UpdCheck", AutoCheckForUpdates);\r
+                               WriteIntValueToReg(hKey4, "UpdApply", AutoApplyUpdates);\r
+                               WriteIntValueToReg(hKey4, "UpdInterval", AutoCheckForUptatesInterval);\r
+                               WriteBinaryToReg(hKey4, "UpdLastCheck", &LastAutoCheckForUpdates, sizeof(LastAutoCheckForUpdates));\r
+                               // ファイル一覧バグ修正\r
+                               WriteIntValueToReg(hKey4, "AbortListErr", AbortOnListError);\r
+                               // ミラーリング設定追加\r
+                               WriteIntValueToReg(hKey4, "MirNoTransfer", MirrorNoTransferContents);\r
                        }\r
                        CloseSubKey(hKey4);\r
                }\r
+               // 全設定暗号化対応\r
+               EncryptSettings = NO;\r
+               WriteBinaryToReg(hKey3, "EncryptAllChecksum", &EncryptSettingsChecksum, 20);\r
+               if(EncryptAllSettings == YES)\r
+               {\r
+                       if(OpenSubKey(hKey3, "Options", &hKey4) == FFFTP_SUCCESS)\r
+                       {\r
+                               for(i = 0; ; i++)\r
+                               {\r
+                                       sprintf(Str, "Host%d", i);\r
+                                       if(DeleteSubKey(hKey4, Str) != FFFTP_SUCCESS)\r
+                                               break;\r
+                               }\r
+                               for(i = 0; ; i++)\r
+                               {\r
+                                       sprintf(Str, "History%d", i);\r
+                                       if(DeleteSubKey(hKey4, Str) != FFFTP_SUCCESS)\r
+                                               break;\r
+                               }\r
+                               CloseSubKey(hKey4);\r
+                       }\r
+                       DeleteSubKey(hKey3, "Options");\r
+                       DeleteValue(hKey3, "CredentialSalt");\r
+                       DeleteValue(hKey3, "CredentialCheck");\r
+               }\r
+               else\r
+               {\r
+                       if(OpenSubKey(hKey3, "EncryptedOptions", &hKey4) == FFFTP_SUCCESS)\r
+                       {\r
+                               for(i = 0; ; i++)\r
+                               {\r
+                                       sprintf(Str, "Host%d", i);\r
+                                       if(DeleteSubKey(hKey4, Str) != FFFTP_SUCCESS)\r
+                                               break;\r
+                               }\r
+                               for(i = 0; ; i++)\r
+                               {\r
+                                       sprintf(Str, "History%d", i);\r
+                                       if(DeleteSubKey(hKey4, Str) != FFFTP_SUCCESS)\r
+                                               break;\r
+                               }\r
+                               CloseSubKey(hKey4);\r
+                       }\r
+                       DeleteSubKey(hKey3, "EncryptedOptions");\r
+                       DeleteValue(hKey3, "CredentialSalt1");\r
+                       DeleteValue(hKey3, "CredentialStretch");\r
+                       DeleteValue(hKey3, "CredentialCheck1");\r
+               }\r
                CloseReg(hKey3);\r
        }\r
        return;\r
@@ -622,7 +913,7 @@ void SaveRegistory(void)
 *              NO:  読み出し失敗(設定無し)\r
 *----------------------------------------------------------------------------*/\r
 \r
-int LoadRegistory(void)\r
+int LoadRegistry(void)\r
 {\r
        void *hKey3;\r
        void *hKey4;\r
@@ -633,12 +924,16 @@ int LoadRegistory(void)
 //     char Str[256];  /* ASCII_EXT_LENより大きい事 */\r
        char Str[PRIVATE_KEY_LEN*4+1];\r
        char Buf[FMAX_PATH+1];\r
+       // 全設定暗号化対応\r
+       char Buf2[FMAX_PATH+1];\r
        char *Pos;\r
        char *Pos2;\r
        HOSTDATA Host;\r
        HISTORYDATA Hist;\r
        int Sts;\r
        int Version;\r
+       // 全設定暗号化対応\r
+       BYTE Checksum[20];\r
 \r
        Sts = NO;\r
 \r
@@ -663,7 +958,45 @@ int LoadRegistory(void)
                if(Version < 1980)\r
                        IniKanjiCode = KANJI_SJIS;\r
 \r
-               if(OpenSubKey(hKey3, "Options", &hKey4) == FFFTP_SUCCESS)\r
+               // 全設定暗号化対応\r
+               if(GetMasterPasswordStatus() == PASSWORD_OK)\r
+               {\r
+                       ReadIntValueFromReg(hKey3, "EncryptAll", &EncryptAllSettings);\r
+                       sprintf(Buf, "%d", EncryptAllSettings);\r
+                       ReadStringFromReg(hKey3, "EncryptAllDetector", Str, 255);\r
+                       DecodePassword(Str, Buf2);\r
+                       EncryptSettings = EncryptAllSettings;\r
+                       memset(&EncryptSettingsChecksum, 0, 20);\r
+                       if(strcmp(Buf, Buf2) != 0)\r
+                       {\r
+                               switch(DialogBox(GetFtpInst(), MAKEINTRESOURCE(corruptsettings_dlg), GetMainHwnd(), AnyButtonDialogProc))\r
+                               {\r
+                               case IDCANCEL:\r
+                                       Terminate();\r
+                                       break;\r
+                               case IDABORT:\r
+                                       CloseReg(hKey3);\r
+                                       ClearRegistry();\r
+                                       ClearIni();\r
+                                       Restart();\r
+                                       Terminate();\r
+                                       break;\r
+                               case IDRETRY:\r
+                                       EncryptSettingsError = YES;\r
+                                       break;\r
+                               case IDIGNORE:\r
+                                       break;\r
+                               }\r
+                       }\r
+               }\r
+\r
+               // 全設定暗号化対応\r
+//             if(OpenSubKey(hKey3, "Options", &hKey4) == FFFTP_SUCCESS)\r
+               if(EncryptAllSettings == YES)\r
+                       strcpy(Str, "EncryptedOptions");\r
+               else\r
+                       strcpy(Str, "Options");\r
+               if(OpenSubKey(hKey3, Str, &hKey4) == FFFTP_SUCCESS)\r
                {\r
                        ReadIntValueFromReg(hKey4, "WinPosX", &WinPosX);\r
                        ReadIntValueFromReg(hKey4, "WinPosY", &WinPosY);\r
@@ -725,8 +1058,12 @@ int LoadRegistory(void)
                        if(ReadMultiStringFromReg(hKey4, "AsciiFile", AsciiExt, ASCII_EXT_LEN+1) == FFFTP_FAIL)\r
                        {\r
                                /* 旧ASCIIモードの拡張子の設定を新しいものに変換 */\r
-                               ReadStringFromReg(hKey4, "Ascii", Str, ASCII_EXT_LEN+1);\r
-                               memset(AsciiExt, NUL, ASCII_EXT_LEN+1);\r
+                               // アスキーモード判別の改良\r
+//                             ReadStringFromReg(hKey4, "Ascii", Str, ASCII_EXT_LEN+1);\r
+//                             memset(AsciiExt, NUL, ASCII_EXT_LEN+1);\r
+                               Str[0] = NUL;\r
+                               if(ReadStringFromReg(hKey4, "Ascii", Str, ASCII_EXT_LEN+1) == FFFTP_SUCCESS)\r
+                                       memset(AsciiExt, NUL, ASCII_EXT_LEN+1);\r
                                Pos = Str;\r
                                while(*Pos != NUL)\r
                                {\r
@@ -744,6 +1081,27 @@ int LoadRegistory(void)
                                                Pos++;\r
                                }\r
                        }\r
+                       // アスキーモード判別の改良\r
+                       if(Version < 1986)\r
+                       {\r
+                               Pos = "*.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
+                               while(*Pos != NUL)\r
+                               {\r
+                                       Pos2 = AsciiExt;\r
+                                       while(*Pos2 != NUL)\r
+                                       {\r
+                                               if(_stricmp(Pos2, Pos) == 0)\r
+                                                       break;\r
+                                               Pos2 = strchr(Pos2, NUL) + 1;\r
+                                       }\r
+                                       if(*Pos2 == NUL)\r
+                                       {\r
+                                               if((StrMultiLen(AsciiExt) + strlen(Pos) + 2) < ASCII_EXT_LEN)\r
+                                                       strncpy(AsciiExt + StrMultiLen(AsciiExt), Pos, strlen(Pos) + 2);\r
+                                       }\r
+                                       Pos = strchr(Pos, NUL) + 1;\r
+                               }\r
+                       }\r
 \r
                        ReadIntValueFromReg(hKey4, "LowUp", &FnameCnv);\r
                        ReadIntValueFromReg(hKey4, "Tout", &TimeOut);\r
@@ -771,7 +1129,7 @@ int LoadRegistory(void)
                        ReadIntValueFromReg(hKey4, "FwallDef", &FwallDefault);\r
                        ReadIntValueFromReg(hKey4, "FwallSec", &FwallSecurity);\r
                        ReadIntValueFromReg(hKey4, "PasvDef", &PasvDefault);\r
-                       ReadIntValueFromReg(hKey4, "FwallRes", &FwallResolv);\r
+                       ReadIntValueFromReg(hKey4, "FwallRes", &FwallResolve);\r
                        ReadIntValueFromReg(hKey4, "FwallLow", &FwallLower);\r
                        ReadIntValueFromReg(hKey4, "FwallDel", &FwallDelimiter);\r
 \r
@@ -848,6 +1206,7 @@ int LoadRegistory(void)
                                        strcpy(Str, "");\r
                                        ReadStringFromReg(hKey5, "PKey", Str, PRIVATE_KEY_LEN*4+1);\r
                                        DecodePassword(Str, Hist.PrivateKey);\r
+                                       ReadIntValueFromReg(hKey5, "NoWeak", &Hist.NoWeakEncryption);\r
                                        // 同時接続対応\r
                                        ReadIntValueFromReg(hKey5, "ThreadCount", &Hist.MaxThreadCount);\r
                                        ReadIntValueFromReg(hKey5, "ReuseCmdSkt", &Hist.ReuseCmdSkt);\r
@@ -857,12 +1216,83 @@ int LoadRegistory(void)
                                        ReadIntValueFromReg(hKey5, "NetType", &Hist.NetType);\r
                                        // 自動切断対策\r
                                        ReadIntValueFromReg(hKey5, "Noop", &Hist.NoopInterval);\r
+                                       // 再転送対応\r
+                                       ReadIntValueFromReg(hKey5, "ErrMode", &Hist.TransferErrorMode);\r
+                                       ReadIntValueFromReg(hKey5, "ErrNotify", &Hist.TransferErrorNotify);\r
+                                       // セッションあたりの転送量制限対策\r
+                                       ReadIntValueFromReg(hKey5, "ErrReconnect", &Hist.TransferErrorReconnect);\r
 \r
                                        CloseSubKey(hKey5);\r
                                        AddHistoryToHistory(&Hist);\r
                                }\r
                        }\r
 \r
+                       // ホスト共通設定機能\r
+                       if(OpenSubKey(hKey4, "DefaultHost", &hKey5) == FFFTP_SUCCESS)\r
+                       {\r
+                               CopyDefaultDefaultHost(&Host);\r
+                               ReadIntValueFromReg(hKey5, "Set", &Host.Level);\r
+                               ReadStringFromReg(hKey5, "HostName", Host.HostName, HOST_NAME_LEN+1);\r
+                               ReadStringFromReg(hKey5, "HostAdrs", Host.HostAdrs, HOST_ADRS_LEN+1);\r
+                               ReadStringFromReg(hKey5, "UserName", Host.UserName, USER_NAME_LEN+1);\r
+                               ReadStringFromReg(hKey5, "Account", Host.Account, ACCOUNT_LEN+1);\r
+                               ReadStringFromReg(hKey5, "LocalDir", Host.LocalInitDir, INIT_DIR_LEN+1);\r
+                               ReadStringFromReg(hKey5, "RemoteDir", Host.RemoteInitDir, INIT_DIR_LEN+1);\r
+                               ReadStringFromReg(hKey5, "Chmod", Host.ChmodCmd, CHMOD_CMD_LEN+1);\r
+                               ReadStringFromReg(hKey5, "Nlst", Host.LsName, NLST_NAME_LEN+1);\r
+                               ReadStringFromReg(hKey5, "Init", Host.InitCmd, INITCMD_LEN+1);\r
+                               ReadIntValueFromReg(hKey5, "Port", &Host.Port);\r
+                               ReadIntValueFromReg(hKey5, "Anonymous", &Host.Anonymous);\r
+                               ReadIntValueFromReg(hKey5, "Kanji", &Host.KanjiCode);\r
+                               ReadIntValueFromReg(hKey5, "KanaCnv", &Host.KanaCnv);\r
+                               ReadIntValueFromReg(hKey5, "NameKanji", &Host.NameKanjiCode);\r
+                               ReadIntValueFromReg(hKey5, "NameKana", &Host.NameKanaCnv);\r
+                               ReadIntValueFromReg(hKey5, "Pasv", &Host.Pasv);\r
+                               ReadIntValueFromReg(hKey5, "Fwall", &Host.FireWall);\r
+                               ReadIntValueFromReg(hKey5, "List", &Host.ListCmdOnly);\r
+                               ReadIntValueFromReg(hKey5, "NLST-R", &Host.UseNLST_R);\r
+                               ReadIntValueFromReg(hKey5, "Last", &Host.LastDir);\r
+                               ReadIntValueFromReg(hKey5, "Tzone", &Host.TimeZone);\r
+                               ReadIntValueFromReg(hKey5, "Type", &Host.HostType);\r
+                               ReadIntValueFromReg(hKey5, "Sync", &Host.SyncMove);\r
+                               ReadIntValueFromReg(hKey5, "Fpath", &Host.NoFullPath);\r
+                               ReadBinaryFromReg(hKey5, "Sort", &Host.Sort, sizeof(Host.Sort));\r
+                               ReadIntValueFromReg(hKey5, "Secu", &Host.Security);\r
+                               if(Host.Anonymous != YES)\r
+                               {\r
+                                       strcpy(Str, "");\r
+                                       ReadStringFromReg(hKey5, "Password", Str, 255);\r
+                                       DecodePassword(Str, Host.PassWord);\r
+                               }\r
+                               else\r
+                                       strcpy(Host.PassWord, UserMailAdrs);\r
+                               ReadMultiStringFromReg(hKey5, "Bmarks", Host.BookMark, BOOKMARK_SIZE);\r
+                               ReadIntValueFromReg(hKey5, "Dial", &Host.Dialup);\r
+                               ReadIntValueFromReg(hKey5, "UseIt", &Host.DialupAlways);\r
+                               ReadIntValueFromReg(hKey5, "Notify", &Host.DialupNotify);\r
+                               ReadStringFromReg(hKey5, "DialTo", Host.DialEntry, RAS_NAME_LEN+1);\r
+                               ReadIntValueFromReg(hKey5, "NoEncryption", &Host.UseNoEncryption);\r
+                               ReadIntValueFromReg(hKey5, "FTPES", &Host.UseFTPES);\r
+                               ReadIntValueFromReg(hKey5, "FTPIS", &Host.UseFTPIS);\r
+                               ReadIntValueFromReg(hKey5, "SFTP", &Host.UseSFTP);\r
+                               strcpy(Str, "");\r
+                               ReadStringFromReg(hKey5, "PKey", Str, PRIVATE_KEY_LEN*4+1);\r
+                               DecodePassword(Str, Host.PrivateKey);\r
+                               ReadIntValueFromReg(hKey5, "NoWeak", &Host.NoWeakEncryption);\r
+                               ReadIntValueFromReg(hKey5, "ThreadCount", &Host.MaxThreadCount);\r
+                               ReadIntValueFromReg(hKey5, "ReuseCmdSkt", &Host.ReuseCmdSkt);\r
+                               ReadIntValueFromReg(hKey5, "MLSD", &Host.UseMLSD);\r
+                               ReadIntValueFromReg(hKey5, "NetType", &Host.NetType);\r
+                               ReadIntValueFromReg(hKey5, "Noop", &Host.NoopInterval);\r
+                               ReadIntValueFromReg(hKey5, "ErrMode", &Host.TransferErrorMode);\r
+                               ReadIntValueFromReg(hKey5, "ErrNotify", &Host.TransferErrorNotify);\r
+                               ReadIntValueFromReg(hKey5, "ErrReconnect", &Host.TransferErrorReconnect);\r
+\r
+                               CloseSubKey(hKey5);\r
+\r
+                               SetDefaultHost(&Host);\r
+                       }\r
+\r
                        /* ホストの設定を読み込む */\r
                        Sets = 0;\r
                        ReadIntValueFromReg(hKey4, "SetNum", &Sets);\r
@@ -941,15 +1371,27 @@ int LoadRegistory(void)
                                        strcpy(Str, "");\r
                                        ReadStringFromReg(hKey5, "PKey", Str, PRIVATE_KEY_LEN*4+1);\r
                                        DecodePassword(Str, Host.PrivateKey);\r
+                                       ReadIntValueFromReg(hKey5, "NoWeak", &Host.NoWeakEncryption);\r
                                        // 同時接続対応\r
                                        ReadIntValueFromReg(hKey5, "ThreadCount", &Host.MaxThreadCount);\r
                                        ReadIntValueFromReg(hKey5, "ReuseCmdSkt", &Host.ReuseCmdSkt);\r
+                                       // 1.98d以前で同時接続数が1より大きい場合はソケットの再利用なし\r
+                                       if(Version < 1985)\r
+                                       {\r
+                                               if(Host.MaxThreadCount > 1)\r
+                                                       Host.ReuseCmdSkt = NO;\r
+                                       }\r
                                        // MLSD対応\r
                                        ReadIntValueFromReg(hKey5, "MLSD", &Host.UseMLSD);\r
                                        // IPv6対応\r
                                        ReadIntValueFromReg(hKey5, "NetType", &Host.NetType);\r
                                        // 自動切断対策\r
                                        ReadIntValueFromReg(hKey5, "Noop", &Host.NoopInterval);\r
+                                       // 再転送対応\r
+                                       ReadIntValueFromReg(hKey5, "ErrMode", &Host.TransferErrorMode);\r
+                                       ReadIntValueFromReg(hKey5, "ErrNotify", &Host.TransferErrorNotify);\r
+                                       // セッションあたりの転送量制限対策\r
+                                       ReadIntValueFromReg(hKey5, "ErrReconnect", &Host.TransferErrorReconnect);\r
 \r
                                        CloseSubKey(hKey5);\r
 \r
@@ -965,9 +1407,65 @@ int LoadRegistory(void)
                        ReadStringFromReg(hKey4, "RootCertHash", Str, PRIVATE_KEY_LEN*4+1);\r
                        DecodePassword(Str, Buf);\r
                        StrReadIn(Buf, sizeof(SSLRootCAFileHash), (char*)&SSLRootCAFileHash);\r
+                       // ファイルアイコン表示対応\r
+                       ReadIntValueFromReg(hKey4, "ListIcon", &DispFileIcon);\r
+                       // タイムスタンプのバグ修正\r
+                       ReadIntValueFromReg(hKey4, "ListSecond", &DispTimeSeconds);\r
+                       // ファイルの属性を数字で表示\r
+                       ReadIntValueFromReg(hKey4, "ListPermitNum", &DispPermissionsNumber);\r
+                       // ディレクトリ自動作成\r
+                       ReadIntValueFromReg(hKey4, "MakeDir", &MakeAllDir);\r
+                       // UTF-8対応\r
+                       ReadIntValueFromReg(hKey4, "Kanji", &LocalKanjiCode);\r
+                       // UPnP対応\r
+                       ReadIntValueFromReg(hKey4, "UPnP", &UPnPEnabled);\r
+                       // ローカル側自動更新\r
+                       ReadIntValueFromReg(hKey4, "ListRefresh", &AutoRefreshFileList);\r
+                       // 古い処理内容を消去\r
+                       ReadIntValueFromReg(hKey4, "OldLog", &RemoveOldLog);\r
+                       // ソフトウェア自動更新\r
+                       ReadIntValueFromReg(hKey4, "UpdCheck", &AutoCheckForUpdates);\r
+                       ReadIntValueFromReg(hKey4, "UpdApply", &AutoApplyUpdates);\r
+                       ReadIntValueFromReg(hKey4, "UpdInterval", &AutoCheckForUptatesInterval);\r
+                       ReadBinaryFromReg(hKey4, "UpdLastCheck", &LastAutoCheckForUpdates, sizeof(LastAutoCheckForUpdates));\r
+                       // ファイル一覧バグ修正\r
+                       ReadIntValueFromReg(hKey4, "AbortListErr", &AbortOnListError);\r
+                       // ミラーリング設定追加\r
+                       ReadIntValueFromReg(hKey4, "MirNoTransfer", &MirrorNoTransferContents);\r
 \r
                        CloseSubKey(hKey4);\r
                }\r
+               // 全設定暗号化対応\r
+               EncryptSettings = NO;\r
+               if(Version >= 1990)\r
+               {\r
+                       if(GetMasterPasswordStatus() == PASSWORD_OK)\r
+                       {\r
+                               memset(&Checksum, 0, 20);\r
+                               ReadBinaryFromReg(hKey3, "EncryptAllChecksum", &Checksum, 20);\r
+                               if(memcmp(&Checksum, &EncryptSettingsChecksum, 20) != 0)\r
+                               {\r
+                                       switch(DialogBox(GetFtpInst(), MAKEINTRESOURCE(corruptsettings_dlg), GetMainHwnd(), AnyButtonDialogProc))\r
+                                       {\r
+                                       case IDCANCEL:\r
+                                               Terminate();\r
+                                               break;\r
+                                       case IDABORT:\r
+                                               CloseReg(hKey3);\r
+                                               ClearRegistry();\r
+                                               ClearIni();\r
+                                               Restart();\r
+                                               Terminate();\r
+                                               break;\r
+                                       case IDRETRY:\r
+                                               EncryptSettingsError = YES;\r
+                                               break;\r
+                                       case IDIGNORE:\r
+                                               break;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
                CloseReg(hKey3);\r
        }\r
        else\r
@@ -1006,7 +1504,7 @@ int LoadRegistory(void)
 *                      YES/NO=設定無し\r
 *----------------------------------------------------------------------------*/\r
 \r
-DWORD LoadHideDriveListRegistory(void)\r
+DWORD LoadHideDriveListRegistry(void)\r
 {\r
        HKEY hKey1;\r
        HKEY hKey2;\r
@@ -1058,7 +1556,7 @@ DWORD LoadHideDriveListRegistory(void)
 *              なし\r
 *----------------------------------------------------------------------------*/\r
 \r
-void ClearRegistory(void)\r
+void ClearRegistry(void)\r
 {\r
        HKEY hKey2;\r
        HKEY hKey3;\r
@@ -1088,6 +1586,24 @@ void ClearRegistory(void)
                                RegCloseKey(hKey4);\r
                        }\r
                        RegDeleteKey(hKey3, "Options");\r
+                       // 全設定暗号化対応\r
+                       if(RegCreateKeyEx(hKey3, "EncryptedOptions", 0, "", REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey4, &Dispos) == ERROR_SUCCESS)\r
+                       {\r
+                               for(i = 0; ; i++)\r
+                               {\r
+                                       sprintf(Str, "Host%d", i);\r
+                                       if(RegDeleteKey(hKey4, Str) != ERROR_SUCCESS)\r
+                                               break;\r
+                               }\r
+                               for(i = 0; ; i++)\r
+                               {\r
+                                       sprintf(Str, "History%d", i);\r
+                                       if(RegDeleteKey(hKey4, Str) != ERROR_SUCCESS)\r
+                                               break;\r
+                               }\r
+                               RegCloseKey(hKey4);\r
+                       }\r
+                       RegDeleteKey(hKey3, "EncryptedOptions");\r
                        RegCloseKey(hKey3);\r
                }\r
                RegDeleteKey(hKey2, "FFFTP");\r
@@ -1097,6 +1613,20 @@ void ClearRegistory(void)
 }\r
 \r
 \r
+// ポータブル版判定\r
+void ClearIni(void)\r
+{\r
+//     FILE *Strm;\r
+//     if((Strm = fopen(AskIniFilePath(), "rt")) != NULL)\r
+//     {\r
+//             fclose(Strm);\r
+//             MoveFileToTrashCan(AskIniFilePath());\r
+//     }\r
+       DeleteFile(AskIniFilePath());\r
+       return;\r
+}\r
+\r
+\r
 /*----- 設定をファイルに保存 --------------------------------------------------\r
 *\r
 *      Parameter\r
@@ -1133,7 +1663,7 @@ void SaveSettingsToFile(void)
                                        {\r
                                                if(ShellExecute(NULL, "open", "regedit", Tmp, NULL, SW_SHOW) <= (HINSTANCE)32)\r
                                                {\r
-                                                       MessageBox(NULL, MSGJPN285, "FFFTP", MB_OK);\r
+                                                       MessageBox(GetMainHwnd(), MSGJPN285, "FFFTP", MB_OK | MB_ICONERROR);\r
                                                }\r
                                                SetCurrentDirectory(CurDir);\r
                                        }\r
@@ -1197,7 +1727,7 @@ int LoadSettingsFromFile(void)
                                        {\r
                                                if(ShellExecute(NULL, "open", "regedit", Tmp, NULL, SW_SHOW) <= (HINSTANCE)32)\r
                                                {\r
-                                                       MessageBox(NULL, MSGJPN285, "FFFTP", MB_OK);\r
+                                                       MessageBox(GetMainHwnd(), MSGJPN285, "FFFTP", MB_OK | MB_ICONERROR);\r
                                                }\r
                                                else\r
                                                {\r
@@ -1216,7 +1746,9 @@ int LoadSettingsFromFile(void)
                        Ret = YES;\r
                }\r
                else\r
-                       MessageBox(NULL, MSGJPN293, "FFFTP", MB_OK);\r
+                       // バグ修正\r
+//                     MessageBox(NULL, MSGJPN293, "FFFTP", MB_OK);\r
+                       MessageBox(GetMainHwnd(), MSGJPN293, "FFFTP", MB_OK | MB_ICONERROR);\r
        }\r
        return(Ret);\r
 }\r
@@ -1239,12 +1771,16 @@ int LoadSettingsFromFile(void)
 *              文字列がデフォルトの文字列と同じならセーブしない\r
 *----------------------------------------------------------------------------*/\r
 \r
-static void SaveStr(HKEY hKey, char *Key, char *Str, char *DefaultStr)\r
+// バグ修正\r
+//static void SaveStr(HKEY hKey, char *Key, char *Str, char *DefaultStr)\r
+static void SaveStr(void *Handle, char *Key, char *Str, char *DefaultStr)\r
 {\r
        if((DefaultStr != NULL) && (strcmp(Str, DefaultStr) == 0))\r
-               DeleteValue(hKey, Key);\r
+//             DeleteValue(hKey, Key);\r
+               DeleteValue(Handle, Key);\r
        else\r
-               WriteStringToReg(hKey, Key, Str);\r
+//             WriteStringToReg(hKey, Key, Str);\r
+               WriteStringToReg(Handle, Key, Str);\r
 \r
        return;\r
 }\r
@@ -1265,12 +1801,16 @@ static void SaveStr(HKEY hKey, char *Key, char *Str, char *DefaultStr)
 *              数値がデフォルトの値と同じならセーブしない\r
 *----------------------------------------------------------------------------*/\r
 \r
-static void SaveIntNum(HKEY hKey, char *Key, int Num, int DefaultNum)\r
+// バグ修正\r
+//static void SaveIntNum(HKEY hKey, char *Key, int Num, int DefaultNum)\r
+static void SaveIntNum(void *Handle, char *Key, int Num, int DefaultNum)\r
 {\r
        if(Num == DefaultNum)\r
-               DeleteValue(hKey, Key);\r
+//             DeleteValue(hKey, Key);\r
+               DeleteValue(Handle, Key);\r
        else\r
-               WriteIntValueToReg(hKey, Key, Num);\r
+//             WriteIntValueToReg(hKey, Key, Num);\r
+               WriteIntValueToReg(Handle, Key, Num);\r
 \r
        return;\r
 }\r
@@ -1509,7 +2049,7 @@ static void EncodePassword3(char *Str, char *Buf, const char *Key)
                        /* PAD部分を乱数で埋める StrPad[StrLen](が有効な場合) は NUL */\r
                        for(StrPadIndex = StrLen + 1; StrPadIndex < StrPadLen;)\r
                        {\r
-                               RandValue = GetRandamDWRODValue();\r
+                               RandValue = GetRandamDWORDValue();\r
                                for(RandByteCount = 0; RandByteCount < 4; RandByteCount++)\r
                                {\r
                                        if(StrPadIndex < StrPadLen)\r
@@ -1523,7 +2063,7 @@ static void EncodePassword3(char *Str, char *Buf, const char *Key)
                        // IVの初期化\r
                        for(IvIndex = 0; IvIndex < AES_BLOCK_SIZE;)\r
                        {\r
-                               RandValue = GetRandamDWRODValue();\r
+                               RandValue = GetRandamDWORDValue();\r
                                for(RandByteCount = 0; RandByteCount < 4; RandByteCount++)\r
                                {\r
                                        if(IvIndex < AES_BLOCK_SIZE)\r
@@ -1813,6 +2353,12 @@ typedef struct regdatatbl {
        struct regdatatbl *Next;\r
 } REGDATATBL;\r
 \r
+// 全設定暗号化対応\r
+typedef struct regdatatbl_reg {\r
+       char KeyName[80+1];                     /* キー名 */\r
+       HKEY hKey;\r
+} REGDATATBL_REG;\r
+\r
 /*===== プロトタイプ =====*/\r
 \r
 static BOOL WriteOutRegToFile(REGDATATBL *Pos);\r
@@ -1865,10 +2411,21 @@ static int OpenReg(char *Name, void **Handle)
        Sts = FFFTP_FAIL;\r
        if(TmpRegType == REGTYPE_REG)\r
        {\r
-               strcpy(Tmp, "Software\\Sota\\");\r
-               strcat(Tmp, Name);\r
-               if(RegOpenKeyEx(HKEY_CURRENT_USER, Tmp, 0, KEY_READ, (HKEY *)Handle) == ERROR_SUCCESS)\r
-                       Sts = FFFTP_SUCCESS;\r
+               // 全設定暗号化対応\r
+//             strcpy(Tmp, "Software\\Sota\\");\r
+//             strcat(Tmp, Name);\r
+//             if(RegOpenKeyEx(HKEY_CURRENT_USER, Tmp, 0, KEY_READ, (HKEY *)Handle) == ERROR_SUCCESS)\r
+//                     Sts = FFFTP_SUCCESS;\r
+               if((*Handle = malloc(sizeof(REGDATATBL_REG))) != NULL)\r
+               {\r
+                       strcpy(((REGDATATBL_REG *)(*Handle))->KeyName, Name);\r
+                       strcpy(Tmp, "Software\\Sota\\");\r
+                       strcat(Tmp, Name);\r
+                       if(RegOpenKeyEx(HKEY_CURRENT_USER, Tmp, 0, KEY_READ, &(((REGDATATBL_REG *)(*Handle))->hKey)) == ERROR_SUCCESS)\r
+                               Sts = FFFTP_SUCCESS;\r
+                       if(Sts != FFFTP_SUCCESS)\r
+                               free(*Handle);\r
+               }\r
        }\r
        else\r
        {\r
@@ -1899,10 +2456,21 @@ static int CreateReg(char *Name, void **Handle)
        Sts = FFFTP_FAIL;\r
        if(TmpRegType == REGTYPE_REG)\r
        {\r
-               strcpy(Tmp, "Software\\Sota\\");\r
-               strcat(Tmp, Name);\r
-               if(RegCreateKeyEx(HKEY_CURRENT_USER, Tmp, 0, "", REG_OPTION_NON_VOLATILE, KEY_CREATE_SUB_KEY | KEY_SET_VALUE, NULL, (HKEY *)Handle, &Dispos) == ERROR_SUCCESS)\r
-                       Sts = FFFTP_SUCCESS;\r
+               // 全設定暗号化対応\r
+//             strcpy(Tmp, "Software\\Sota\\");\r
+//             strcat(Tmp, Name);\r
+//             if(RegCreateKeyEx(HKEY_CURRENT_USER, Tmp, 0, "", REG_OPTION_NON_VOLATILE, KEY_CREATE_SUB_KEY | KEY_SET_VALUE, NULL, (HKEY *)Handle, &Dispos) == ERROR_SUCCESS)\r
+//                     Sts = FFFTP_SUCCESS;\r
+               if((*Handle = malloc(sizeof(REGDATATBL_REG))) != NULL)\r
+               {\r
+                       strcpy(((REGDATATBL_REG *)(*Handle))->KeyName, Name);\r
+                       strcpy(Tmp, "Software\\Sota\\");\r
+                       strcat(Tmp, Name);\r
+                       if(RegCreateKeyEx(HKEY_CURRENT_USER, Tmp, 0, "", REG_OPTION_NON_VOLATILE, KEY_CREATE_SUB_KEY | KEY_SET_VALUE, NULL, &(((REGDATATBL_REG *)(*Handle))->hKey), &Dispos) == ERROR_SUCCESS)\r
+                               Sts = FFFTP_SUCCESS;\r
+                       if(Sts != FFFTP_SUCCESS)\r
+                               free(*Handle);\r
+               }\r
        }\r
        else\r
        {\r
@@ -1933,18 +2501,23 @@ static int CloseReg(void *Handle)
 {\r
        REGDATATBL *Pos;\r
        REGDATATBL *Next;\r
-       FILE *Strm;\r
+       // ポータブル版判定\r
+//     FILE *Strm;\r
 \r
        if(TmpRegType == REGTYPE_REG)\r
        {\r
-               RegCloseKey(Handle);\r
+               // 全設定暗号化対応\r
+//             RegCloseKey(Handle);\r
+               RegCloseKey(((REGDATATBL_REG *)Handle)->hKey);\r
+               free(Handle);\r
 \r
                /* INIファイルを削除 */\r
-               if((Strm = fopen(AskIniFilePath(), "rt")) != NULL)\r
-               {\r
-                       fclose(Strm);\r
-                       MoveFileToTrashCan(AskIniFilePath());\r
-               }\r
+               // ポータブル版判定\r
+//             if((Strm = fopen(AskIniFilePath(), "rt")) != NULL)\r
+//             {\r
+//                     fclose(Strm);\r
+//                     MoveFileToTrashCan(AskIniFilePath());\r
+//             }\r
        }\r
        else\r
        {\r
@@ -1953,7 +2526,7 @@ static int CloseReg(void *Handle)
                        if(WriteOutRegToFile(Handle) == TRUE)\r
                        {\r
 //                             /* レジストリをクリア */\r
-//                             ClearRegistory();\r
+//                             ClearRegistry();\r
                        }\r
                }\r
                /* テーブルを削除 */\r
@@ -2004,7 +2577,9 @@ static BOOL WriteOutRegToFile(REGDATATBL *Pos)
                Ret = TRUE;\r
        }\r
        else\r
-               MessageBox(NULL, MSGJPN240, "FFFTP", MB_OK);\r
+               // バグ修正\r
+//             MessageBox(NULL, MSGJPN240, "FFFTP", MB_OK);\r
+               MessageBox(GetMainHwnd(), MSGJPN240, "FFFTP", MB_OK | MB_ICONERROR);\r
 \r
        return(Ret);\r
 }\r
@@ -2033,6 +2608,8 @@ static int ReadInReg(char *Name, REGDATATBL **Handle)
 \r
        Sts = FFFTP_FAIL;\r
        *Handle = NULL;\r
+       // バグ修正\r
+       New = NULL;\r
 \r
        if((Strm = fopen(AskIniFilePath(), "rt")) != NULL)\r
        {\r
@@ -2051,7 +2628,10 @@ static int ReadInReg(char *Name, REGDATATBL **Handle)
                                                {\r
                                                        if((Tmp = strchr(Buf, ']')) != NULL)\r
                                                                *Tmp = NUL;\r
-                                                       strcpy(New->KeyName, Buf+1);\r
+                                                       // バグ修正\r
+//                                                     strcpy(New->KeyName, Buf+1);\r
+                                                       strncpy(New->KeyName, Buf+1, 80);\r
+                                                       New->KeyName[80] = NUL;\r
                                                        New->ValLen = 0;\r
                                                        New->Next = NULL;\r
                                                        Data = New->ValTbl;\r
@@ -2068,9 +2648,19 @@ static int ReadInReg(char *Name, REGDATATBL **Handle)
                                        }\r
                                        else if(strlen(Buf) > 0)\r
                                        {\r
-                                               strcpy(Data, Buf);\r
-                                               Data += strlen(Buf) + 1;\r
-                                               New->ValLen += strlen(Buf) + 1;\r
+                                               // バグ修正\r
+//                                             strcpy(Data, Buf);\r
+//                                             Data += strlen(Buf) + 1;\r
+//                                             New->ValLen += strlen(Buf) + 1;\r
+                                               if(Data != NULL && New != NULL)\r
+                                               {\r
+                                                       if(New->ValLen + strlen(Buf) + 1 <= REG_SECT_MAX)\r
+                                                       {\r
+                                                               strcpy(Data, Buf);\r
+                                                               Data += strlen(Buf) + 1;\r
+                                                               New->ValLen += strlen(Buf) + 1;\r
+                                                       }\r
+                                               }\r
                                        }\r
                                }\r
                        }\r
@@ -2104,8 +2694,19 @@ static int OpenSubKey(void *Parent, char *Name, void **Handle)
        Sts = FFFTP_FAIL;\r
        if(TmpRegType == REGTYPE_REG)\r
        {\r
-               if(RegOpenKeyEx(Parent, Name, 0, KEY_READ, (HKEY *)Handle) == ERROR_SUCCESS)\r
-                       Sts = FFFTP_SUCCESS;\r
+               // 全設定暗号化対応\r
+//             if(RegOpenKeyEx(Parent, Name, 0, KEY_READ, (HKEY *)Handle) == ERROR_SUCCESS)\r
+//                     Sts = FFFTP_SUCCESS;\r
+               if((*Handle = malloc(sizeof(REGDATATBL_REG))) != NULL)\r
+               {\r
+                       strcpy(((REGDATATBL_REG *)(*Handle))->KeyName, ((REGDATATBL_REG *)Parent)->KeyName);\r
+                       strcat(((REGDATATBL_REG *)(*Handle))->KeyName, "\\");\r
+                       strcat(((REGDATATBL_REG *)(*Handle))->KeyName, Name);\r
+                       if(RegOpenKeyEx(((REGDATATBL_REG *)Parent)->hKey, Name, 0, KEY_READ, &(((REGDATATBL_REG *)(*Handle))->hKey)) == ERROR_SUCCESS)\r
+                               Sts = FFFTP_SUCCESS;\r
+                       if(Sts != FFFTP_SUCCESS)\r
+                               free(*Handle);\r
+               }\r
        }\r
        else\r
        {\r
@@ -2149,8 +2750,19 @@ static int CreateSubKey(void *Parent, char *Name, void **Handle)
        Sts = FFFTP_FAIL;\r
        if(TmpRegType == REGTYPE_REG)\r
        {\r
-               if(RegCreateKeyEx(Parent, Name, 0, "", REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, (HKEY *)Handle, &Dispos) == ERROR_SUCCESS)\r
-                       Sts = FFFTP_SUCCESS;\r
+               // 全設定暗号化対応\r
+//             if(RegCreateKeyEx(Parent, Name, 0, "", REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, (HKEY *)Handle, &Dispos) == ERROR_SUCCESS)\r
+//                     Sts = FFFTP_SUCCESS;\r
+               if((*Handle = malloc(sizeof(REGDATATBL_REG))) != NULL)\r
+               {\r
+                       strcpy(((REGDATATBL_REG *)(*Handle))->KeyName, ((REGDATATBL_REG *)Parent)->KeyName);\r
+                       strcat(((REGDATATBL_REG *)(*Handle))->KeyName, "\\");\r
+                       strcat(((REGDATATBL_REG *)(*Handle))->KeyName, Name);\r
+                       if(RegCreateKeyEx(((REGDATATBL_REG *)Parent)->hKey, Name, 0, "", REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &(((REGDATATBL_REG *)(*Handle))->hKey), &Dispos) == ERROR_SUCCESS)\r
+                               Sts = FFFTP_SUCCESS;\r
+                       if(Sts != FFFTP_SUCCESS)\r
+                               free(*Handle);\r
+               }\r
        }\r
        else\r
        {\r
@@ -2187,7 +2799,12 @@ static int CreateSubKey(void *Parent, char *Name, void **Handle)
 static int CloseSubKey(void *Handle)\r
 {\r
        if(TmpRegType == REGTYPE_REG)\r
-               RegCloseKey(Handle);\r
+       // 全設定暗号化対応\r
+//             RegCloseKey(Handle);\r
+       {\r
+               RegCloseKey(((REGDATATBL_REG *)Handle)->hKey);\r
+               free(Handle);\r
+       }\r
        else\r
        {\r
                /* Nothing */\r
@@ -2214,7 +2831,9 @@ static int DeleteSubKey(void *Handle, char *Name)
        Sts = FFFTP_FAIL;\r
        if(TmpRegType == REGTYPE_REG)\r
        {\r
-               if(RegDeleteKey(Handle, Name) == ERROR_SUCCESS)\r
+               // 全設定暗号化対応\r
+//             if(RegDeleteKey(Handle, Name) == ERROR_SUCCESS)\r
+               if(RegDeleteKey(((REGDATATBL_REG *)Handle)->hKey, Name) == ERROR_SUCCESS)\r
                        Sts = FFFTP_SUCCESS;\r
        }\r
        else\r
@@ -2243,7 +2862,9 @@ static int DeleteValue(void *Handle, char *Name)
        Sts = FFFTP_FAIL;\r
        if(TmpRegType == REGTYPE_REG)\r
        {\r
-               if(RegDeleteValue(Handle, Name) == ERROR_SUCCESS)\r
+               // 全設定暗号化対応\r
+//             if(RegDeleteValue(Handle, Name) == ERROR_SUCCESS)\r
+               if(RegDeleteValue(((REGDATATBL_REG *)Handle)->hKey, Name) == ERROR_SUCCESS)\r
                        Sts = FFFTP_SUCCESS;\r
        }\r
        else\r
@@ -2271,12 +2892,16 @@ static int ReadIntValueFromReg(void *Handle, char *Name, int *Value)
        int Sts;\r
        DWORD Size;\r
        char *Pos;\r
+       // 全設定暗号化対応\r
+       char Path[80];\r
 \r
        Sts = FFFTP_FAIL;\r
        if(TmpRegType == REGTYPE_REG)\r
        {\r
                Size = sizeof(int);\r
-               if(RegQueryValueEx(Handle, Name, NULL, NULL, (BYTE *)Value, &Size) == ERROR_SUCCESS)\r
+               // 全設定暗号化対応\r
+//             if(RegQueryValueEx(Handle, Name, NULL, NULL, (BYTE *)Value, &Size) == ERROR_SUCCESS)\r
+               if(RegQueryValueEx(((REGDATATBL_REG *)Handle)->hKey, Name, NULL, NULL, (BYTE *)Value, &Size) == ERROR_SUCCESS)\r
                        Sts = FFFTP_SUCCESS;\r
        }\r
        else\r
@@ -2287,6 +2912,21 @@ static int ReadIntValueFromReg(void *Handle, char *Name, int *Value)
                        Sts = FFFTP_SUCCESS;\r
                }\r
        }\r
+       // 全設定暗号化対応\r
+       if(Sts == FFFTP_SUCCESS)\r
+       {\r
+               if(EncryptSettings == YES)\r
+               {\r
+                       if(TmpRegType == REGTYPE_REG)\r
+                               strcpy(Path, ((REGDATATBL_REG *)Handle)->KeyName);\r
+                       else\r
+                               strcpy(Path, ((REGDATATBL *)Handle)->KeyName);\r
+                       strcat(Path, "\\");\r
+                       strcat(Path, Name);\r
+                       UnmaskSettingsData(Path, strlen(Path), Value, sizeof(int), NO);\r
+                       CalculateSettingsDataChecksum(Value, sizeof(int));\r
+               }\r
+       }\r
        return(Sts);\r
 }\r
 \r
@@ -2308,9 +2948,24 @@ static int WriteIntValueToReg(void *Handle, char *Name, int Value)
        REGDATATBL *Pos;\r
        char *Data;\r
        char Tmp[20];\r
+       // 全設定暗号化対応\r
+       char Path[80];\r
 \r
+       // 全設定暗号化対応\r
+       if(EncryptSettings == YES)\r
+       {\r
+               if(TmpRegType == REGTYPE_REG)\r
+                       strcpy(Path, ((REGDATATBL_REG *)Handle)->KeyName);\r
+               else\r
+                       strcpy(Path, ((REGDATATBL *)Handle)->KeyName);\r
+               strcat(Path, "\\");\r
+               strcat(Path, Name);\r
+               MaskSettingsData(Path, strlen(Path), &Value, sizeof(int), NO);\r
+       }\r
        if(TmpRegType == REGTYPE_REG)\r
-               RegSetValueEx(Handle, Name, 0, REG_DWORD, (CONST BYTE *)&Value, sizeof(int));\r
+               // 全設定暗号化対応\r
+//             RegSetValueEx(Handle, Name, 0, REG_DWORD, (CONST BYTE *)&Value, sizeof(int));\r
+               RegSetValueEx(((REGDATATBL_REG *)Handle)->hKey, Name, 0, REG_DWORD, (CONST BYTE *)&Value, sizeof(int));\r
        else\r
        {\r
                Pos = (REGDATATBL *)Handle;\r
@@ -2321,6 +2976,12 @@ static int WriteIntValueToReg(void *Handle, char *Name, int Value)
                strcat(Data, Tmp);\r
                Pos->ValLen += strlen(Data) + 1;\r
        }\r
+       // 全設定暗号化対応\r
+       if(EncryptSettings == YES)\r
+       {\r
+               UnmaskSettingsData(Path, strlen(Path), &Value, sizeof(int), NO);\r
+               CalculateSettingsDataChecksum(&Value, sizeof(int));\r
+       }\r
        return(FFFTP_SUCCESS);\r
 }\r
 \r
@@ -2346,11 +3007,15 @@ static int ReadStringFromReg(void *Handle, char *Name, char *Str, DWORD Size)
        DWORD TempSize;\r
        char* pa0;\r
        wchar_t* pw0;\r
+       // 全設定暗号化対応\r
+       char Path[80];\r
 \r
        Sts = FFFTP_FAIL;\r
        if(TmpRegType == REGTYPE_REG)\r
        {\r
-               if(RegQueryValueEx(Handle, Name, NULL, NULL, (BYTE *)Str, &Size) == ERROR_SUCCESS)\r
+               // 全設定暗号化対応\r
+//             if(RegQueryValueEx(Handle, Name, NULL, NULL, (BYTE *)Str, &Size) == ERROR_SUCCESS)\r
+               if(RegQueryValueEx(((REGDATATBL_REG *)Handle)->hKey, Name, NULL, NULL, (BYTE *)Str, &Size) == ERROR_SUCCESS)\r
                {\r
                        if(*(Str + Size - 1) != NUL)\r
                                *(Str + Size) = NUL;\r
@@ -2373,10 +3038,7 @@ static int ReadStringFromReg(void *Handle, char *Name, char *Str, DWORD Size)
                                TempSize = StrReadIn(Pos, TempSize, Str);\r
                                *(Str + TempSize) = NUL;\r
                                Sts = FFFTP_SUCCESS;\r
-                               if(!CheckStringM(Str))\r
-                                       break;\r
-                               // UTF-8ではない可能性がある\r
-                               // Shift_JISとみなす\r
+                               break;\r
                        case KANJI_SJIS:\r
                                if(pa0 = AllocateStringA(Size * 4))\r
                                {\r
@@ -2397,6 +3059,21 @@ static int ReadStringFromReg(void *Handle, char *Name, char *Str, DWORD Size)
                        }\r
                }\r
        }\r
+       // 全設定暗号化対応\r
+       if(Sts == FFFTP_SUCCESS)\r
+       {\r
+               if(EncryptSettings == YES)\r
+               {\r
+                       if(TmpRegType == REGTYPE_REG)\r
+                               strcpy(Path, ((REGDATATBL_REG *)Handle)->KeyName);\r
+                       else\r
+                               strcpy(Path, ((REGDATATBL *)Handle)->KeyName);\r
+                       strcat(Path, "\\");\r
+                       strcat(Path, Name);\r
+                       UnmaskSettingsData(Path, strlen(Path), Str, strlen(Str) + 1, YES);\r
+                       CalculateSettingsDataChecksum(Str, strlen(Str) + 1);\r
+               }\r
+       }\r
        return(Sts);\r
 }\r
 \r
@@ -2417,9 +3094,24 @@ static int WriteStringToReg(void *Handle, char *Name, char *Str)
 {\r
        REGDATATBL *Pos;\r
        char *Data;\r
+       // 全設定暗号化対応\r
+       char Path[80];\r
 \r
+       // 全設定暗号化対応\r
+       if(EncryptSettings == YES)\r
+       {\r
+               if(TmpRegType == REGTYPE_REG)\r
+                       strcpy(Path, ((REGDATATBL_REG *)Handle)->KeyName);\r
+               else\r
+                       strcpy(Path, ((REGDATATBL *)Handle)->KeyName);\r
+               strcat(Path, "\\");\r
+               strcat(Path, Name);\r
+               MaskSettingsData(Path, strlen(Path), Str, strlen(Str) + 1, YES);\r
+       }\r
        if(TmpRegType == REGTYPE_REG)\r
-               RegSetValueEx(Handle, Name, 0, REG_SZ, (CONST BYTE *)Str, strlen(Str)+1);\r
+       // 全設定暗号化対応\r
+//             RegSetValueEx(Handle, Name, 0, REG_SZ, (CONST BYTE *)Str, strlen(Str)+1);\r
+               RegSetValueEx(((REGDATATBL_REG *)Handle)->hKey, Name, 0, EncryptSettings == YES ? REG_BINARY : REG_SZ, (CONST BYTE *)Str, strlen(Str)+1);\r
        else\r
        {\r
                Pos = (REGDATATBL *)Handle;\r
@@ -2430,6 +3122,12 @@ static int WriteStringToReg(void *Handle, char *Name, char *Str)
                Data = Pos->ValTbl + Pos->ValLen;\r
                Pos->ValLen += StrCatOut(Str, strlen(Str), Data) + 1;\r
        }\r
+       // 全設定暗号化対応\r
+       if(EncryptSettings == YES)\r
+       {\r
+               UnmaskSettingsData(Path, strlen(Path), Str, strlen(Str) + 1, YES);\r
+               CalculateSettingsDataChecksum(Str, strlen(Str) + 1);\r
+       }\r
        return(FFFTP_SUCCESS);\r
 }\r
 \r
@@ -2455,11 +3153,15 @@ static int ReadMultiStringFromReg(void *Handle, char *Name, char *Str, DWORD Siz
        DWORD TempSize;\r
        char* pa0;\r
        wchar_t* pw0;\r
+       // 全設定暗号化対応\r
+       char Path[80];\r
 \r
        Sts = FFFTP_FAIL;\r
        if(TmpRegType == REGTYPE_REG)\r
        {\r
-               if(RegQueryValueEx(Handle, Name, NULL, NULL, (BYTE *)Str, &Size) == ERROR_SUCCESS)\r
+               // 全設定暗号化対応\r
+//             if(RegQueryValueEx(Handle, Name, NULL, NULL, (BYTE *)Str, &Size) == ERROR_SUCCESS)\r
+               if(RegQueryValueEx(((REGDATATBL_REG *)Handle)->hKey, Name, NULL, NULL, (BYTE *)Str, &Size) == ERROR_SUCCESS)\r
                {\r
                        if(*(Str + Size - 1) != NUL)\r
                                *(Str + Size) = NUL;\r
@@ -2478,14 +3180,12 @@ static int ReadMultiStringFromReg(void *Handle, char *Name, char *Str, DWORD Siz
                        switch(IniKanjiCode)\r
                        {\r
                        case KANJI_NOCNV:\r
-                               TempSize = min1(Size-1, strlen(Pos));\r
+                               TempSize = min1(Size - 2, strlen(Pos));\r
                                TempSize = StrReadIn(Pos, TempSize, Str);\r
                                *(Str + TempSize) = NUL;\r
+                               *(Str + TempSize + 1) = NUL;\r
                                Sts = FFFTP_SUCCESS;\r
-                               if(!CheckMultiStringM(Str))\r
-                                       break;\r
-                               // UTF-8ではない可能性がある\r
-                               // Shift_JISとみなす\r
+                               break;\r
                        case KANJI_SJIS:\r
                                if(pa0 = AllocateStringA(Size * 4))\r
                                {\r
@@ -2508,6 +3208,21 @@ static int ReadMultiStringFromReg(void *Handle, char *Name, char *Str, DWORD Siz
                        }\r
                }\r
        }\r
+       // 全設定暗号化対応\r
+       if(Sts == FFFTP_SUCCESS)\r
+       {\r
+               if(EncryptSettings == YES)\r
+               {\r
+                       if(TmpRegType == REGTYPE_REG)\r
+                               strcpy(Path, ((REGDATATBL_REG *)Handle)->KeyName);\r
+                       else\r
+                               strcpy(Path, ((REGDATATBL *)Handle)->KeyName);\r
+                       strcat(Path, "\\");\r
+                       strcat(Path, Name);\r
+                       UnmaskSettingsData(Path, strlen(Path), Str, StrMultiLen(Str) + 1, YES);\r
+                       CalculateSettingsDataChecksum(Str, StrMultiLen(Str) + 1);\r
+               }\r
+       }\r
        return(Sts);\r
 }\r
 \r
@@ -2528,9 +3243,24 @@ static int WriteMultiStringToReg(void *Handle, char *Name, char *Str)
 {\r
        REGDATATBL *Pos;\r
        char *Data;\r
+       // 全設定暗号化対応\r
+       char Path[80];\r
 \r
+       // 全設定暗号化対応\r
+       if(EncryptSettings == YES)\r
+       {\r
+               if(TmpRegType == REGTYPE_REG)\r
+                       strcpy(Path, ((REGDATATBL_REG *)Handle)->KeyName);\r
+               else\r
+                       strcpy(Path, ((REGDATATBL *)Handle)->KeyName);\r
+               strcat(Path, "\\");\r
+               strcat(Path, Name);\r
+               MaskSettingsData(Path, strlen(Path), Str, StrMultiLen(Str) + 1, YES);\r
+       }\r
        if(TmpRegType == REGTYPE_REG)\r
-               RegSetValueEx(Handle, Name, 0, REG_MULTI_SZ, (CONST BYTE *)Str, StrMultiLen(Str)+1);\r
+       // 全設定暗号化対応\r
+//             RegSetValueEx(Handle, Name, 0, REG_MULTI_SZ, (CONST BYTE *)Str, StrMultiLen(Str)+1);\r
+               RegSetValueEx(((REGDATATBL_REG *)Handle)->hKey, Name, 0, EncryptSettings == YES ? REG_BINARY : REG_MULTI_SZ, (CONST BYTE *)Str, StrMultiLen(Str)+1);\r
        else\r
        {\r
                Pos = (REGDATATBL *)Handle;\r
@@ -2541,6 +3271,12 @@ static int WriteMultiStringToReg(void *Handle, char *Name, char *Str)
                Data = Pos->ValTbl + Pos->ValLen;\r
                Pos->ValLen += StrCatOut(Str, StrMultiLen(Str), Data) + 1;\r
        }\r
+       // 全設定暗号化対応\r
+       if(EncryptSettings == YES)\r
+       {\r
+               UnmaskSettingsData(Path, strlen(Path), Str, StrMultiLen(Str) + 1, YES);\r
+               CalculateSettingsDataChecksum(Str, StrMultiLen(Str) + 1);\r
+       }\r
        return(FFFTP_SUCCESS);\r
 }\r
 \r
@@ -2562,11 +3298,15 @@ static int ReadBinaryFromReg(void *Handle, char *Name, void *Bin, DWORD Size)
 {\r
        int Sts;\r
        char *Pos;\r
+       // 全設定暗号化対応\r
+       char Path[80];\r
 \r
        Sts = FFFTP_FAIL;\r
        if(TmpRegType == REGTYPE_REG)\r
        {\r
-               if(RegQueryValueEx(Handle, Name, NULL, NULL, (BYTE *)Bin, &Size) == ERROR_SUCCESS)\r
+               // 全設定暗号化対応\r
+//             if(RegQueryValueEx(Handle, Name, NULL, NULL, (BYTE *)Bin, &Size) == ERROR_SUCCESS)\r
+               if(RegQueryValueEx(((REGDATATBL_REG *)Handle)->hKey, Name, NULL, NULL, (BYTE *)Bin, &Size) == ERROR_SUCCESS)\r
                        Sts = FFFTP_SUCCESS;\r
        }\r
        else\r
@@ -2578,6 +3318,21 @@ static int ReadBinaryFromReg(void *Handle, char *Name, void *Bin, DWORD Size)
                        Sts = FFFTP_SUCCESS;\r
                }\r
        }\r
+       // 全設定暗号化対応\r
+       if(Sts == FFFTP_SUCCESS)\r
+       {\r
+               if(EncryptSettings == YES)\r
+               {\r
+                       if(TmpRegType == REGTYPE_REG)\r
+                               strcpy(Path, ((REGDATATBL_REG *)Handle)->KeyName);\r
+                       else\r
+                               strcpy(Path, ((REGDATATBL *)Handle)->KeyName);\r
+                       strcat(Path, "\\");\r
+                       strcat(Path, Name);\r
+                       UnmaskSettingsData(Path, strlen(Path), Bin, Size, NO);\r
+                       CalculateSettingsDataChecksum(Bin, Size);\r
+               }\r
+       }\r
        return(Sts);\r
 }\r
 \r
@@ -2599,9 +3354,24 @@ static int WriteBinaryToReg(void *Handle, char *Name, void *Bin, int Len)
 {\r
        REGDATATBL *Pos;\r
        char *Data;\r
+       // 全設定暗号化対応\r
+       char Path[80];\r
 \r
+       // 全設定暗号化対応\r
+       if(EncryptSettings == YES)\r
+       {\r
+               if(TmpRegType == REGTYPE_REG)\r
+                       strcpy(Path, ((REGDATATBL_REG *)Handle)->KeyName);\r
+               else\r
+                       strcpy(Path, ((REGDATATBL *)Handle)->KeyName);\r
+               strcat(Path, "\\");\r
+               strcat(Path, Name);\r
+               MaskSettingsData(Path, strlen(Path), Bin, Len, NO);\r
+       }\r
        if(TmpRegType == REGTYPE_REG)\r
-               RegSetValueEx(Handle, Name, 0, REG_BINARY, (CONST BYTE *)Bin, Len);\r
+       // 全設定暗号化対応\r
+//             RegSetValueEx(Handle, Name, 0, REG_BINARY, (CONST BYTE *)Bin, Len);\r
+               RegSetValueEx(((REGDATATBL_REG *)Handle)->hKey, Name, 0, REG_BINARY, (CONST BYTE *)Bin, Len);\r
        else\r
        {\r
                Pos = (REGDATATBL *)Handle;\r
@@ -2612,6 +3382,12 @@ static int WriteBinaryToReg(void *Handle, char *Name, void *Bin, int Len)
                Data = Pos->ValTbl + Pos->ValLen;\r
                Pos->ValLen += StrCatOut(Bin, Len, Data) + 1;\r
        }\r
+       // 全設定暗号化対応\r
+       if(EncryptSettings == YES)\r
+       {\r
+               UnmaskSettingsData(Path, strlen(Path), Bin, Len, NO);\r
+               CalculateSettingsDataChecksum(Bin, Len);\r
+       }\r
        return(FFFTP_SUCCESS);\r
 }\r
 \r
@@ -2749,8 +3525,11 @@ static char *ScanValue(void *Handle, char *Name)
 *                      1: 一致\r
 *                      2: 異常\r
 *----------------------------------------------------------------------------*/\r
-int CheckPasswordValidity( char* Password, int length, const char* HashStr )\r
+// 全設定暗号化対応\r
+//int CheckPasswordValidity( char* Password, int length, const char* HashStr )\r
+int CheckPasswordValidity( char* Password, int length, const char* HashStr, int StretchCount )\r
 {\r
+       char Buf[MAX_PASSWORD_LEN + 32];\r
        ulong hash1[5];\r
        ulong hash2[5];\r
        \r
@@ -2779,6 +3558,12 @@ int CheckPasswordValidity( char* Password, int length, const char* HashStr )
        \r
        /* Password をハッシュする */\r
        sha_memory( Password, length, hash2 );\r
+       for(i = 0; i < StretchCount; i++)\r
+       {\r
+               memcpy(&Buf[0], &hash2, 20);\r
+               memcpy(&Buf[20], Password, length);\r
+               sha_memory(Buf, 20 + length, hash2);\r
+       }\r
        \r
        if( memcmp( (char*)hash1, (char*)hash2, sizeof( hash1 )) == 0 ){\r
                return 1;\r
@@ -2795,13 +3580,22 @@ int CheckPasswordValidity( char* Password, int length, const char* HashStr )
 *      Return Value\r
 *              None\r
 *----------------------------------------------------------------------------*/\r
-void CreatePasswordHash( char* Password, int length, char* HashStr )\r
+// 全設定暗号化対応\r
+//void CreatePasswordHash( char* Password, int length, char* HashStr )\r
+void CreatePasswordHash( char* Password, int length, char* HashStr, int StretchCount )\r
 {\r
+       char Buf[MAX_PASSWORD_LEN + 32];\r
        ulong hash[5];\r
        int i, j;\r
        unsigned char *p = (unsigned char *)HashStr;\r
 \r
        sha_memory( Password, length, hash );\r
+       for(i = 0; i < StretchCount; i++)\r
+       {\r
+               memcpy(&Buf[0], &hash, 20);\r
+               memcpy(&Buf[20], Password, length);\r
+               sha_memory(Buf, 20 + length, hash);\r
+       }\r
 \r
        for( i = 0; i < 5; i++ ){\r
                ulong rest = hash[i];\r
@@ -2815,15 +3609,34 @@ void CreatePasswordHash( char* Password, int length, char* HashStr )
 \r
 void SetHashSalt( DWORD salt )\r
 {\r
-       unsigned char* pos = &SecretKey[strlen(SecretKey) + 1];\r
+       // 全設定暗号化対応\r
+//     unsigned char* pos = &SecretKey[strlen(SecretKey) + 1];\r
+       unsigned char c[4];\r
+       unsigned char* pos = &c[0];\r
        *pos++ = ( salt >> 24 ) & 0xff;\r
        *pos++ = ( salt >> 16 ) & 0xff;\r
        *pos++ = ( salt >>  8 ) & 0xff;\r
        *pos++ = ( salt       ) & 0xff;\r
        \r
-       SecretKeyLength = strlen( SecretKey ) + 5;\r
+//     SecretKeyLength = strlen( SecretKey ) + 5;\r
+       SetHashSalt1(&c, 4);\r
+}\r
+\r
+// 全設定暗号化対応\r
+void SetHashSalt1(void* Salt, int Length)\r
+{\r
+       void* p;\r
+       if(Salt != NULL)\r
+       {\r
+               p = &SecretKey[strlen(SecretKey) + 1];\r
+               memcpy(p, Salt, Length);\r
+               SecretKeyLength = (int)strlen(SecretKey) + 1 + Length;\r
+       }\r
+       else\r
+               SecretKeyLength = (int)strlen(SecretKey) + 1;\r
 }\r
 \r
+\r
 /*----------- 乱数生成をする -------------------------------------------------\r
 *\r
 *      Parameter\r
@@ -2831,7 +3644,7 @@ void SetHashSalt( DWORD salt )
 *      Return Value\r
 *              ランダムな値:コンパイラVS2005/動作環境WinXP以上では rand_s から取得する\r
 *----------------------------------------------------------------------------*/\r
-DWORD GetRandamDWRODValue(void)\r
+DWORD GetRandamDWORDValue(void)\r
 {\r
        DWORD rndValue;\r
        int errorCode;\r
@@ -2893,3 +3706,309 @@ DWORD GetRandamDWRODValue(void)
        }\r
        return rndValue;\r
 }\r
+\r
+// 全設定暗号化対応\r
+void GetMaskWithHMACSHA1(DWORD Nonce, const char* Salt, int SaltLength, void* pHash)\r
+{\r
+       BYTE Key[FMAX_PATH*2+1];\r
+       ulong Hash[5];\r
+       DWORD i;\r
+       for(i = 0; i < 16; i++)\r
+       {\r
+               Nonce = ~Nonce;\r
+               Nonce *= 1566083941;\r
+               Nonce = _byteswap_ulong(Nonce);\r
+               memcpy(&Key[i * 4], &Nonce, 4);\r
+       }\r
+       memcpy(&Key[64], Salt, SaltLength);\r
+       memcpy(&Key[64 + SaltLength], SecretKey, SecretKeyLength);\r
+       sha_memory((char*)&Key, 64 + SaltLength + SecretKeyLength, Hash);\r
+       // sha.cはビッグエンディアンのため\r
+       for(i = 0; i < 5; i++)\r
+               Hash[i] = _byteswap_ulong(Hash[i]);\r
+       memcpy(&Key[0], &Hash, 20);\r
+       memset(&Key[20], 0, 44);\r
+       for(i = 0; i < 64; i++)\r
+               Key[i] ^= 0x36;\r
+       sha_memory((char*)&Key, 64, Hash);\r
+       // sha.cはビッグエンディアンのため\r
+       for(i = 0; i < 5; i++)\r
+               Hash[i] = _byteswap_ulong(Hash[i]);\r
+       memcpy(&Key[64], &Hash, 20);\r
+       for(i = 0; i < 64; i++)\r
+               Key[i] ^= 0x6a;\r
+       sha_memory((char*)&Key, 84, Hash);\r
+       // sha.cはビッグエンディアンのため\r
+       for(i = 0; i < 5; i++)\r
+               Hash[i] = _byteswap_ulong(Hash[i]);\r
+       memcpy(pHash, &Hash, 20);\r
+}\r
+\r
+void MaskSettingsData(const char* Salt, int SaltLength, void* Data, DWORD Size, int EscapeZero)\r
+{\r
+       BYTE* p;\r
+       DWORD i;\r
+       BYTE Mask[20];\r
+       p = (BYTE*)Data;\r
+       for(i = 0; i < Size; i++)\r
+       {\r
+               if(i % 20 == 0)\r
+                       GetMaskWithHMACSHA1(i, Salt, SaltLength, &Mask);\r
+               if(EscapeZero == NO || (p[i] != 0 && p[i] != Mask[i % 20]))\r
+                       p[i] ^= Mask[i % 20];\r
+       }\r
+}\r
+\r
+void UnmaskSettingsData(const char* Salt, int SaltLength, void* Data, DWORD Size, int EscapeZero)\r
+{\r
+       MaskSettingsData(Salt, SaltLength, Data, Size, EscapeZero);\r
+}\r
+\r
+void CalculateSettingsDataChecksum(void* Data, DWORD Size)\r
+{\r
+       ulong Hash[5];\r
+       DWORD i;\r
+       BYTE Mask[20];\r
+       sha_memory((char*)Data, Size, Hash);\r
+       // sha.cはビッグエンディアンのため\r
+       for(i = 0; i < 5; i++)\r
+               Hash[i] = _byteswap_ulong(Hash[i]);\r
+       memcpy(&Mask, &Hash, 20);\r
+       for(i = 0; i < 20; i++)\r
+               EncryptSettingsChecksum[i] ^= Mask[i];\r
+}\r
+\r
+// ポータブル版判定\r
+int IsRegAvailable()\r
+{\r
+       int Sts;\r
+       void* h;\r
+       Sts = NO;\r
+       SetRegType(REGTYPE_REG);\r
+       if(OpenReg("FFFTP", &h) == FFFTP_SUCCESS)\r
+       {\r
+               CloseReg(h);\r
+               Sts = YES;\r
+       }\r
+       return Sts;\r
+}\r
+\r
+int IsIniAvailable()\r
+{\r
+       int Sts;\r
+       void* h;\r
+       Sts = NO;\r
+       SetRegType(REGTYPE_INI);\r
+       if(OpenReg("FFFTP", &h) == FFFTP_SUCCESS)\r
+       {\r
+               CloseReg(h);\r
+               Sts = YES;\r
+       }\r
+       return Sts;\r
+}\r
+\r
+// バージョン確認\r
+int ReadSettingsVersion()\r
+{\r
+       void *hKey3;\r
+       int i;\r
+       int Version;\r
+\r
+       SetRegType(REGTYPE_INI);\r
+       if((i = OpenReg("FFFTP", &hKey3)) != FFFTP_SUCCESS)\r
+       {\r
+               if(AskForceIni() == NO)\r
+               {\r
+                       SetRegType(REGTYPE_REG);\r
+                       i = OpenReg("FFFTP", &hKey3);\r
+               }\r
+       }\r
+       Version = INT_MAX;\r
+       if(i == FFFTP_SUCCESS)\r
+       {\r
+               ReadIntValueFromReg(hKey3, "Version", &Version);\r
+               CloseReg(hKey3);\r
+       }\r
+       return Version;\r
+}\r
+\r
+// FileZilla XML形式エクスポート対応\r
+void SaveSettingsToFileZillaXml()\r
+{\r
+       char Fname[FMAX_PATH+1];\r
+       FILE* f;\r
+       TIME_ZONE_INFORMATION tzi;\r
+       int Level;\r
+       int i;\r
+       HOSTDATA Host;\r
+       char Tmp[FMAX_PATH+1];\r
+       char* p1;\r
+       char* p2;\r
+       strcpy(Fname, "FileZilla.xml");\r
+       if(SelectFile(GetMainHwnd(), Fname, MSGJPN286, MSGJPN356, "xml", OFN_EXTENSIONDIFFERENT | OFN_OVERWRITEPROMPT, 1) == TRUE)\r
+       {\r
+               if((f = fopen(Fname, "wt")) != NULL)\r
+               {\r
+                       fputs("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>\n", f);\r
+                       fputs("<FileZilla3>\n", f);\r
+                       fputs("<Servers>\n", f);\r
+                       GetTimeZoneInformation(&tzi);\r
+                       Level = 0;\r
+                       i = 0;\r
+                       while(CopyHostFromList(i, &Host) == FFFTP_SUCCESS)\r
+                       {\r
+                               while((Host.Level & SET_LEVEL_MASK) < Level)\r
+                               {\r
+                                       fputs("</Folder>\n", f);\r
+                                       Level--;\r
+                               }\r
+                               if(Host.Level & SET_LEVEL_GROUP)\r
+                               {\r
+                                       fputs("<Folder expanded=\"1\">\n", f);\r
+                                       fprintf(f, "%s&#x0A;\n", Host.HostName);\r
+                                       Level++;\r
+                               }\r
+                               else\r
+                               {\r
+                                       fputs("<Server>\n", f);\r
+                                       fprintf(f, "<Host>%s</Host>\n", Host.HostAdrs);\r
+                                       fprintf(f, "<Port>%d</Port>\n", Host.Port);\r
+                                       if(Host.UseNoEncryption == YES)\r
+                                               fprintf(f, "<Protocol>%s</Protocol>\n", "0");\r
+                                       else if(Host.UseFTPES == YES)\r
+                                               fprintf(f, "<Protocol>%s</Protocol>\n", "4");\r
+                                       else if(Host.UseFTPIS == YES)\r
+                                               fprintf(f, "<Protocol>%s</Protocol>\n", "3");\r
+                                       else\r
+                                               fprintf(f, "<Protocol>%s</Protocol>\n", "0");\r
+                                       fprintf(f, "<Type>%s</Type>\n", "0");\r
+                                       fprintf(f, "<User>%s</User>\n", Host.UserName);\r
+                                       fprintf(f, "<Pass>%s</Pass>\n", Host.PassWord);\r
+                                       fprintf(f, "<Account>%s</Account>\n", Host.Account);\r
+                                       if(Host.Anonymous == YES || strlen(Host.UserName) == 0)\r
+                                               fprintf(f, "<Logontype>%s</Logontype>\n", "0");\r
+                                       else\r
+                                               fprintf(f, "<Logontype>%s</Logontype>\n", "1");\r
+                                       fprintf(f, "<TimezoneOffset>%d</TimezoneOffset>\n", tzi.Bias + Host.TimeZone * 60);\r
+                                       if(Host.Pasv == YES)\r
+                                               fprintf(f, "<PasvMode>%s</PasvMode>\n", "MODE_PASSIVE");\r
+                                       else\r
+                                               fprintf(f, "<PasvMode>%s</PasvMode>\n", "MODE_ACTIVE");\r
+                                       fprintf(f, "<MaximumMultipleConnections>%d</MaximumMultipleConnections>\n", Host.MaxThreadCount);\r
+                                       switch(Host.NameKanjiCode)\r
+                                       {\r
+                                       case KANJI_SJIS:\r
+                                               fprintf(f, "<EncodingType>%s</EncodingType>\n", "Custom");\r
+                                               fprintf(f, "<CustomEncoding>%s</CustomEncoding>\n", "Shift_JIS");\r
+                                               break;\r
+                                       case KANJI_JIS:\r
+                                               // 非対応\r
+                                               fprintf(f, "<EncodingType>%s</EncodingType>\n", "Auto");\r
+                                               break;\r
+                                       case KANJI_EUC:\r
+                                               fprintf(f, "<EncodingType>%s</EncodingType>\n", "Custom");\r
+                                               fprintf(f, "<CustomEncoding>%s</CustomEncoding>\n", "EUC-JP");\r
+                                               break;\r
+                                       case KANJI_SMB_HEX:\r
+                                               // 非対応\r
+                                               fprintf(f, "<EncodingType>%s</EncodingType>\n", "Auto");\r
+                                               break;\r
+                                       case KANJI_SMB_CAP:\r
+                                               // 非対応\r
+                                               fprintf(f, "<EncodingType>%s</EncodingType>\n", "Auto");\r
+                                               break;\r
+                                       case KANJI_UTF8N:\r
+                                               fprintf(f, "<EncodingType>%s</EncodingType>\n", "UTF-8");\r
+                                               break;\r
+                                       case KANJI_UTF8HFSX:\r
+                                               // 非対応\r
+                                               fprintf(f, "<EncodingType>%s</EncodingType>\n", "Auto");\r
+                                               break;\r
+                                       default:\r
+                                               fprintf(f, "<EncodingType>%s</EncodingType>\n", "Auto");\r
+                                               break;\r
+                                       }\r
+                                       if(Host.FireWall == YES)\r
+                                               fprintf(f, "<BypassProxy>%s</BypassProxy>\n", "0");\r
+                                       else\r
+                                               fprintf(f, "<BypassProxy>%s</BypassProxy>\n", "1");\r
+                                       fprintf(f, "<Name>%s</Name>\n", Host.HostName);\r
+                                       fprintf(f, "<LocalDir>%s</LocalDir>\n", Host.LocalInitDir);\r
+                                       if(strchr(Host.RemoteInitDir, '\\') != NULL)\r
+                                       {\r
+                                               fputs("<RemoteDir>", f);\r
+                                               fputs("8 0", f);\r
+                                               strcpy(Tmp, Host.RemoteInitDir);\r
+                                               p1 = Tmp;\r
+                                               while(*p1 != '\0')\r
+                                               {\r
+                                                       while(*p1 == '\\')\r
+                                                       {\r
+                                                               p1++;\r
+                                                       }\r
+                                                       if((p2 = strchr(p1, '\\')) != NULL)\r
+                                                       {\r
+                                                               *p2 = '\0';\r
+                                                               p2++;\r
+                                                       }\r
+                                                       else\r
+                                                               p2 = strchr(p1, '\0');\r
+                                                       if(*p1 != '\0')\r
+                                                               fprintf(f, " %d %s", _mbslen(p1), p1);\r
+                                                       p1 = p2;\r
+                                               }\r
+                                               fputs("</RemoteDir>\n", f);\r
+                                       }\r
+                                       else if(strchr(Host.RemoteInitDir, '/') != NULL)\r
+                                       {\r
+                                               fputs("<RemoteDir>", f);\r
+                                               fputs("1 0", f);\r
+                                               strcpy(Tmp, Host.RemoteInitDir);\r
+                                               p1 = Tmp;\r
+                                               while(*p1 != '\0')\r
+                                               {\r
+                                                       while(*p1 == '/')\r
+                                                       {\r
+                                                               p1++;\r
+                                                       }\r
+                                                       if((p2 = strchr(p1, '/')) != NULL)\r
+                                                       {\r
+                                                               *p2 = '\0';\r
+                                                               p2++;\r
+                                                       }\r
+                                                       else\r
+                                                               p2 = strchr(p1, '\0');\r
+                                                       if(*p1 != '\0')\r
+                                                               fprintf(f, " %d %s", _mbslen(p1), p1);\r
+                                                       p1 = p2;\r
+                                               }\r
+                                               fputs("</RemoteDir>\n", f);\r
+                                       }\r
+                                       else\r
+                                               fprintf(f, "<RemoteDir>%s</RemoteDir>\n", Host.RemoteInitDir);\r
+                                       if(Host.SyncMove == YES)\r
+                                               fprintf(f, "<SyncBrowsing>%s</SyncBrowsing>\n", "1");\r
+                                       else\r
+                                               fprintf(f, "<SyncBrowsing>%s</SyncBrowsing>\n", "0");\r
+                                       fprintf(f, "%s&#x0A;\n", Host.HostName);\r
+                                       fputs("</Server>\n", f);\r
+                               }\r
+                               i++;\r
+                       }\r
+                       while(Level > 0)\r
+                       {\r
+                               fputs("</Folder>\n", f);\r
+                               Level--;\r
+                       }\r
+                       fputs("</Servers>\n", f);\r
+                       // TODO: 環境設定\r
+//                     fputs("<Settings>\n", f);\r
+//                     fputs("</Settings>\n", f);\r
+                       fputs("</FileZilla3>\n", f);\r
+                       fclose(f);\r
+               }\r
+               else\r
+                       MessageBox(GetMainHwnd(), MSGJPN357, "FFFTP", MB_OK | MB_ICONERROR);\r
+       }\r
+}\r
+\r