OSDN Git Service

Fix bugs of all settings encryption.
authors_kawamoto <s_kawamoto@users.sourceforge.jp>
Wed, 30 Apr 2014 15:58:10 +0000 (00:58 +0900)
committers_kawamoto <s_kawamoto@users.sourceforge.jp>
Wed, 30 Apr 2014 15:58:10 +0000 (00:58 +0900)
Fix security issues of exporting to FileZiila XML.

FFFTP_Eng_Release/FFFTP.exe
Release/FFFTP.exe
main.c
registry.c

index c1a6253..6135062 100644 (file)
Binary files a/FFFTP_Eng_Release/FFFTP.exe and b/FFFTP_Eng_Release/FFFTP.exe differ
index b5974a5..fcdc201 100644 (file)
Binary files a/Release/FFFTP.exe and b/Release/FFFTP.exe differ
diff --git a/main.c b/main.c
index d74f0a5..e21a13e 100644 (file)
--- a/main.c
+++ b/main.c
@@ -1684,7 +1684,25 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
 \r
                                // FileZilla XML形式エクスポート対応\r
                                case MENU_EXPORT_FILEZILLA_XML :\r
-                                       SaveSettingsToFileZillaXml();\r
+                                       // 平文で出力するためマスターパスワードを再確認\r
+                                       if(GetMasterPasswordStatus() == PASSWORD_OK)\r
+                                       {\r
+                                               char Password[MAX_PASSWORD_LEN + 1];\r
+                                               GetMasterPassword(Password);\r
+                                               SetMasterPassword(NULL);\r
+                                               while(ValidateMasterPassword() == YES && GetMasterPasswordStatus() == PASSWORD_UNMATCH)\r
+                                               {\r
+                                                       if(EnterMasterPasswordAndSet(masterpasswd_dlg, NULL) == 0)\r
+                                                               break;\r
+                                               }\r
+                                               if(GetMasterPasswordStatus() == PASSWORD_OK)\r
+                                                       SaveSettingsToFileZillaXml();\r
+                                               else\r
+                                               {\r
+                                                       SetMasterPassword(Password);\r
+                                                       ValidateMasterPassword();\r
+                                               }\r
+                                       }\r
                                        break;\r
 \r
                                default :\r
index ee3ef2d..7f03155 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
@@ -697,26 +700,23 @@ void SaveRegistry(void)
                WriteBinaryToReg(hKey3, "EncryptAllChecksum", &EncryptSettingsChecksum, 20);\r
                if(EncryptAllSettings == YES)\r
                {\r
-                       if(RegType == REGTYPE_REG)\r
+                       if(OpenSubKey(hKey3, "Options", &hKey4) == FFFTP_SUCCESS)\r
                        {\r
-                               if(RegCreateKeyEx(hKey3, "Options", 0, "", REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, (HKEY*)&hKey4, NULL) == ERROR_SUCCESS)\r
+                               for(i = 0; ; i++)\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
+                                       sprintf(Str, "Host%d", i);\r
+                                       if(DeleteSubKey(hKey4, Str) != FFFTP_SUCCESS)\r
+                                               break;\r
                                }\r
-                               RegDeleteKey(hKey3, "Options");\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
                }\r
                CloseReg(hKey3);\r
        }\r
@@ -783,27 +783,30 @@ int LoadRegistry(void)
                // 全設定暗号化対応\r
                if(Version >= 1990)\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
+                       if(GetMasterPasswordStatus() == PASSWORD_OK)\r
                        {\r
-                               switch(MessageBox(GetMainHwnd(), MSGJPN343, "FFFTP", MB_ABORTRETRYIGNORE | MB_DEFBUTTON2))\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
-                               case IDABORT:\r
-                                       CloseReg(hKey3);\r
-                                       ClearRegistry();\r
-                                       ClearIni();\r
-                                       RestartAndTerminate();\r
-                                       break;\r
-                               case IDRETRY:\r
-                                       EncryptSettingsError = YES;\r
-                                       break;\r
-                               case IDIGNORE:\r
-                                       break;\r
+                                       switch(MessageBox(GetMainHwnd(), MSGJPN343, "FFFTP", MB_ABORTRETRYIGNORE | MB_DEFBUTTON2))\r
+                                       {\r
+                                       case IDABORT:\r
+                                               CloseReg(hKey3);\r
+                                               ClearRegistry();\r
+                                               ClearIni();\r
+                                               RestartAndTerminate();\r
+                                               break;\r
+                                       case IDRETRY:\r
+                                               EncryptSettingsError = YES;\r
+                                               break;\r
+                                       case IDIGNORE:\r
+                                               break;\r
+                                       }\r
                                }\r
                        }\r
                }\r
@@ -1178,23 +1181,26 @@ int LoadRegistry(void)
                EncryptSettings = NO;\r
                if(Version >= 1990)\r
                {\r
-                       memset(&Checksum, 0, 20);\r
-                       ReadBinaryFromReg(hKey3, "EncryptAllChecksum", &Checksum, 20);\r
-                       if(memcmp(&Checksum, &EncryptSettingsChecksum, 20) != 0)\r
+                       if(GetMasterPasswordStatus() == PASSWORD_OK)\r
                        {\r
-                               switch(MessageBox(GetMainHwnd(), MSGJPN343, "FFFTP", MB_ABORTRETRYIGNORE | MB_DEFBUTTON2))\r
+                               memset(&Checksum, 0, 20);\r
+                               ReadBinaryFromReg(hKey3, "EncryptAllChecksum", &Checksum, 20);\r
+                               if(memcmp(&Checksum, &EncryptSettingsChecksum, 20) != 0)\r
                                {\r
-                               case IDABORT:\r
-                                       CloseReg(hKey3);\r
-                                       ClearRegistry();\r
-                                       ClearIni();\r
-                                       RestartAndTerminate();\r
-                                       break;\r
-                               case IDRETRY:\r
-                                       EncryptSettingsError = YES;\r
-                                       break;\r
-                               case IDIGNORE:\r
-                                       break;\r
+                                       switch(MessageBox(GetMainHwnd(), MSGJPN343, "FFFTP", MB_ABORTRETRYIGNORE | MB_DEFBUTTON2))\r
+                                       {\r
+                                       case IDABORT:\r
+                                               CloseReg(hKey3);\r
+                                               ClearRegistry();\r
+                                               ClearIni();\r
+                                               RestartAndTerminate();\r
+                                               break;\r
+                                       case IDRETRY:\r
+                                               EncryptSettingsError = YES;\r
+                                               break;\r
+                                       case IDIGNORE:\r
+                                               break;\r
+                                       }\r
                                }\r
                        }\r
                }\r
@@ -1501,12 +1507,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
@@ -1527,12 +1537,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
@@ -2075,6 +2089,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
@@ -2127,10 +2147,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
@@ -2161,10 +2192,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
@@ -2200,7 +2242,10 @@ static int CloseReg(void *Handle)
 \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
                // ポータブル版判定\r
@@ -2383,8 +2428,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
@@ -2428,8 +2484,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
@@ -2466,7 +2533,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
@@ -2493,7 +2565,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
@@ -2522,7 +2596,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
@@ -2550,12 +2626,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
@@ -2571,7 +2651,13 @@ static int ReadIntValueFromReg(void *Handle, char *Name, int *Value)
        {\r
                if(EncryptSettings == YES)\r
                {\r
-                       UnmaskSettingsData(Name, strlen(Name), Value, sizeof(int), NO);\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
@@ -2596,12 +2682,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
-               MaskSettingsData(Name, strlen(Name), &Value, sizeof(int), NO);\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
@@ -2615,7 +2713,7 @@ static int WriteIntValueToReg(void *Handle, char *Name, int Value)
        // 全設定暗号化対応\r
        if(EncryptSettings == YES)\r
        {\r
-               UnmaskSettingsData(Name, strlen(Name), &Value, sizeof(int), NO);\r
+               UnmaskSettingsData(Path, strlen(Path), &Value, sizeof(int), NO);\r
                CalculateSettingsDataChecksum(&Value, sizeof(int));\r
        }\r
        return(FFFTP_SUCCESS);\r
@@ -2643,11 +2741,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
@@ -2696,7 +2798,13 @@ static int ReadStringFromReg(void *Handle, char *Name, char *Str, DWORD Size)
        {\r
                if(EncryptSettings == YES)\r
                {\r
-                       UnmaskSettingsData(Name, strlen(Name), Str, strlen(Str) + 1, YES);\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
@@ -2720,14 +2828,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
-               MaskSettingsData(Name, strlen(Name), Str, strlen(Str) + 1, 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
        // 全設定暗号化対応\r
 //             RegSetValueEx(Handle, Name, 0, REG_SZ, (CONST BYTE *)Str, strlen(Str)+1);\r
-               RegSetValueEx(Handle, Name, 0, EncryptSettings == YES ? REG_BINARY : 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
@@ -2741,7 +2859,7 @@ static int WriteStringToReg(void *Handle, char *Name, char *Str)
        // 全設定暗号化対応\r
        if(EncryptSettings == YES)\r
        {\r
-               UnmaskSettingsData(Name, strlen(Name), Str, strlen(Str) + 1, YES);\r
+               UnmaskSettingsData(Path, strlen(Path), Str, strlen(Str) + 1, YES);\r
                CalculateSettingsDataChecksum(Str, strlen(Str) + 1);\r
        }\r
        return(FFFTP_SUCCESS);\r
@@ -2769,11 +2887,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
@@ -2825,7 +2947,13 @@ static int ReadMultiStringFromReg(void *Handle, char *Name, char *Str, DWORD Siz
        {\r
                if(EncryptSettings == YES)\r
                {\r
-                       UnmaskSettingsData(Name, strlen(Name), Str, StrMultiLen(Str) + 1, YES);\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
@@ -2849,14 +2977,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
-               MaskSettingsData(Name, strlen(Name), Str, StrMultiLen(Str) + 1, 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
        // 全設定暗号化対応\r
 //             RegSetValueEx(Handle, Name, 0, REG_MULTI_SZ, (CONST BYTE *)Str, StrMultiLen(Str)+1);\r
-               RegSetValueEx(Handle, Name, 0, EncryptSettings == YES ? REG_BINARY : 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
@@ -2870,7 +3008,7 @@ static int WriteMultiStringToReg(void *Handle, char *Name, char *Str)
        // 全設定暗号化対応\r
        if(EncryptSettings == YES)\r
        {\r
-               UnmaskSettingsData(Name, strlen(Name), Str, StrMultiLen(Str) + 1, YES);\r
+               UnmaskSettingsData(Path, strlen(Path), Str, StrMultiLen(Str) + 1, YES);\r
                CalculateSettingsDataChecksum(Str, StrMultiLen(Str) + 1);\r
        }\r
        return(FFFTP_SUCCESS);\r
@@ -2894,11 +3032,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
@@ -2915,7 +3057,13 @@ static int ReadBinaryFromReg(void *Handle, char *Name, void *Bin, DWORD Size)
        {\r
                if(EncryptSettings == YES)\r
                {\r
-                       UnmaskSettingsData(Name, strlen(Name), Bin, Size, NO);\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
@@ -2940,12 +3088,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
-               MaskSettingsData(Name, strlen(Name), Bin, Len, NO);\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
@@ -2959,7 +3119,7 @@ static int WriteBinaryToReg(void *Handle, char *Name, void *Bin, int Len)
        // 全設定暗号化対応\r
        if(EncryptSettings == YES)\r
        {\r
-               UnmaskSettingsData(Name, strlen(Name), Bin, Len, NO);\r
+               UnmaskSettingsData(Path, strlen(Path), Bin, Len, NO);\r
                CalculateSettingsDataChecksum(Bin, Len);\r
        }\r
        return(FFFTP_SUCCESS);\r