OSDN Git Service

Fix bugs of drag-and-drop handling.
[ffftp/ffftp.git] / registry.c
1 /*=============================================================================\r
2 *                                                               レジストリ関係\r
3 *\r
4 *\r
5 ===============================================================================\r
6 / Copyright (C) 1997-2007 Sota. All rights reserved.\r
7 /\r
8 / Redistribution and use in source and binary forms, with or without \r
9 / modification, are permitted provided that the following conditions \r
10 / are met:\r
11 /\r
12 /  1. Redistributions of source code must retain the above copyright \r
13 /     notice, this list of conditions and the following disclaimer.\r
14 /  2. Redistributions in binary form must reproduce the above copyright \r
15 /     notice, this list of conditions and the following disclaimer in the \r
16 /     documentation and/or other materials provided with the distribution.\r
17 /\r
18 / THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR \r
19 / IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES \r
20 / OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r
21 / IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, \r
22 / INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r
23 / BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF \r
24 / USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON \r
25 / ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
26 / (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF \r
27 / THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
28 /============================================================================*/\r
29 \r
30 // VC 8.0(2005)以上でのみ rand_s を利用可能\r
31 #if 1400 <= _MSC_VER\r
32 //#define _CRT_RAND_S\r
33 #endif\r
34 \r
35 #define STRICT\r
36 // IPv6対応\r
37 #include <winsock2.h>\r
38 #include <windows.h>\r
39 #include <stdio.h>\r
40 #include <stdlib.h>\r
41 #include <time.h>\r
42 #include <string.h>\r
43 #include <windowsx.h>\r
44 #include <process.h>\r
45 \r
46 \r
47 #include "common.h"\r
48 #include "resource.h"\r
49 #include "sample.h"\r
50 #include "sha.h"\r
51 #include "aes.h"\r
52 \r
53 \r
54 /*===== プロトタイプ =====*/\r
55 \r
56 // バグ修正\r
57 //static void SaveStr(HKEY hKey, char *Key, char *Str, char *DefaultStr);\r
58 //static void SaveIntNum(HKEY hKey, char *Key, int Num, int DefaultNum);\r
59 static void SaveStr(void *Handle, char *Key, char *Str, char *DefaultStr);\r
60 static void SaveIntNum(void *Handle, char *Key, int Num, int DefaultNum);\r
61 static void MakeFontData(LOGFONT Font, HFONT hFont, char *Buf);\r
62 static int RestoreFontData(char *Str, LOGFONT *Font);\r
63 \r
64 static void EncodePassword(char *Str, char *Buf);\r
65 static void EncodePasswordOriginal(char *Str, char *Buf);\r
66 static void EncodePassword2(char *Str, char *Buf, const char *Key);\r
67 static void EncodePassword3(char *Str, char *Buf, const char *Key);\r
68 \r
69 static void DecodePassword(char *Str, char *Buf);\r
70 static void DecodePasswordOriginal(char *Str, char *Buf);\r
71 static void DecodePassword2(char *Str, char *Buf, const char *Key);\r
72 static void DecodePassword3(char *Str, char *Buf, const char *Key);\r
73 static int CreateAesKey(unsigned char *AesKey, const char* Key);\r
74 \r
75 static void SetRegType(int Type);\r
76 static int OpenReg(char *Name, void **Handle);\r
77 static int CreateReg(char *Name, void **Handle);\r
78 static int CloseReg(void *Handle);\r
79 static int OpenSubKey(void *Parent, char *Name, void **Handle);\r
80 static int CreateSubKey(void *Parent, char *Name, void **Handle);\r
81 static int CloseSubKey(void *Handle);\r
82 static int DeleteSubKey(void *Handle, char *Name);\r
83 static int DeleteValue(void *Handle, char *Name);\r
84 static int ReadIntValueFromReg(void *Handle, char *Name, int *Value);\r
85 static int WriteIntValueToReg(void *Handle, char *Name, int Value);\r
86 static int ReadStringFromReg(void *Handle, char *Name, char *Str, DWORD Size);\r
87 static int WriteStringToReg(void *Handle, char *Name, char *Str);\r
88 static int ReadMultiStringFromReg(void *Handle, char *Name, char *Str, DWORD Size);\r
89 static int WriteMultiStringToReg(void *Handle, char *Name, char *Str);\r
90 static int ReadBinaryFromReg(void *Handle, char *Name, void *Bin, DWORD Size);\r
91 static int WriteBinaryToReg(void *Handle, char *Name, void *Bin, int Len);\r
92 // 暗号化通信対応\r
93 static int StrCatOut(char *Src, int Len, char *Dst);\r
94 static int StrReadIn(char *Src, int Max, char *Dst);\r
95 \r
96 // 全設定暗号化対応\r
97 //int CheckPasswordValidity( char* Password, int length, const char* HashStr );\r
98 //void CreatePasswordHash( char* Password, int length, char* HashStr );\r
99 int CheckPasswordValidity( char* Password, int length, const char* HashStr, int StretchCount );\r
100 void CreatePasswordHash( char* Password, int length, char* HashStr, int StretchCount );\r
101 void SetHashSalt( DWORD salt );\r
102 // 全設定暗号化対応\r
103 void SetHashSalt1(void* Salt, int Length);\r
104 \r
105 DWORD GetRandamDWORDValue(void);\r
106 \r
107 // 全設定暗号化対応\r
108 void GetMaskWithHMACSHA1(DWORD IV, const char* Salt, int SaltLength, void* pHash);\r
109 void MaskSettingsData(const char* Salt, int SaltLength, void* Data, DWORD Size, int EscapeZero);\r
110 void UnmaskSettingsData(const char* Salt, int SaltLength, void* Data, DWORD Size, int EscapeZero);\r
111 void CalculateSettingsDataChecksum(void* Data, DWORD Size);\r
112 \r
113 /* 2010.01.30 genta 追加 */\r
114 static char SecretKey[FMAX_PATH+1];\r
115 static int SecretKeyLength;\r
116 static int IsMasterPasswordError = PASSWORD_OK;\r
117 \r
118 static int IsRndSourceInit = 0;\r
119 static ulong RndSource[9];\r
120 \r
121 // UTF-8対応\r
122 static int IniKanjiCode = KANJI_NOCNV;\r
123 \r
124 // 全設定暗号化対応\r
125 static int EncryptSettings = NO;\r
126 static BYTE EncryptSettingsChecksum[20];\r
127 static int EncryptSettingsError = NO;\r
128 \r
129 /*===== 外部参照 =====*/\r
130 \r
131 /* 設定値 */\r
132 extern int WinPosX;\r
133 extern int WinPosY;\r
134 extern int WinWidth;\r
135 extern int WinHeight;\r
136 extern int LocalWidth;\r
137 extern int TaskHeight;\r
138 extern int LocalTabWidth[4];\r
139 extern int RemoteTabWidth[6];\r
140 extern char UserMailAdrs[USER_MAIL_LEN+1];\r
141 extern char ViewerName[VIEWERS][FMAX_PATH+1];\r
142 extern HFONT ListFont;\r
143 extern LOGFONT ListLogFont;\r
144 extern int LocalFileSort;\r
145 extern int LocalDirSort;\r
146 extern int RemoteFileSort;\r
147 extern int RemoteDirSort;\r
148 extern int TransMode;\r
149 extern int ConnectOnStart;\r
150 extern int DebugConsole;\r
151 extern int SaveWinPos;\r
152 extern char AsciiExt[ASCII_EXT_LEN+1];\r
153 extern int RecvMode;\r
154 extern int SendMode;\r
155 extern int MoveMode;\r
156 extern int ListType;\r
157 extern int CacheEntry;\r
158 extern int CacheSave;\r
159 extern char DefaultLocalPath[FMAX_PATH+1];\r
160 extern int SaveTimeStamp;\r
161 extern int FindMode;\r
162 extern int DotFile;\r
163 extern int DclickOpen;\r
164 extern SOUNDFILE Sound[SOUND_TYPES];\r
165 extern int FnameCnv;\r
166 extern int ConnectAndSet;\r
167 extern int TimeOut;\r
168 extern int RmEOF;\r
169 extern int RegType;\r
170 extern char FwallHost[HOST_ADRS_LEN+1];\r
171 extern char FwallUser[USER_NAME_LEN+1];\r
172 extern char FwallPass[PASSWORD_LEN+1];\r
173 extern int FwallPort;\r
174 extern int FwallType;\r
175 extern int FwallDefault;\r
176 extern int FwallSecurity;\r
177 extern int FwallResolve;\r
178 extern int FwallLower;\r
179 extern int FwallDelimiter;\r
180 extern int PasvDefault;\r
181 extern char MirrorNoTrn[MIRROR_LEN+1];\r
182 extern char MirrorNoDel[MIRROR_LEN+1];\r
183 extern int MirrorFnameCnv;\r
184 //extern int MirrorFolderCnv;\r
185 extern int RasClose;\r
186 extern int RasCloseNotify;\r
187 extern int FileHist;\r
188 extern char DefAttrList[DEFATTRLIST_LEN+1];\r
189 extern SIZE HostDlgSize;\r
190 extern SIZE BmarkDlgSize;\r
191 extern SIZE MirrorDlgSize;\r
192 extern int Sizing;\r
193 extern int SortSave;\r
194 extern char TmpPath[FMAX_PATH+1];\r
195 extern int QuickAnonymous;\r
196 extern int PassToHist;\r
197 extern int VaxSemicolon;\r
198 extern int SendQuit;\r
199 extern int NoRasControl;\r
200 extern int SuppressSave;\r
201 \r
202 extern int UpExistMode;\r
203 extern int ExistMode;\r
204 extern int DispIgnoreHide;\r
205 extern int DispDrives;\r
206 extern int MirUpDelNotify;\r
207 extern int MirDownDelNotify;\r
208 \r
209 extern int FolderAttr;\r
210 extern int FolderAttrNum;\r
211 \r
212 // 暗号化通信対応\r
213 extern BYTE CertificateCacheHash[MAX_CERT_CACHE_HASH][20];\r
214 extern BYTE SSLRootCAFileHash[20];\r
215 // ファイルアイコン表示対応\r
216 extern int DispFileIcon;\r
217 // タイムスタンプのバグ修正\r
218 extern int DispTimeSeconds;\r
219 // ファイルの属性を数字で表示\r
220 extern int DispPermissionsNumber;\r
221 // ディレクトリ自動作成\r
222 extern int MakeAllDir;\r
223 // UTF-8対応\r
224 extern int LocalKanjiCode;\r
225 // UPnP対応\r
226 extern int UPnPEnabled;\r
227 // 全設定暗号化対応\r
228 extern int EncryptAllSettings;\r
229 // ローカル側自動更新\r
230 extern int AutoRefreshFileList;\r
231 // 古い処理内容を消去\r
232 extern int RemoveOldLog;\r
233 // バージョン確認\r
234 extern int ReadOnlySettings;\r
235 // ソフトウェア自動更新\r
236 extern int AutoCheckForUpdates;\r
237 extern int AutoApplyUpdates;\r
238 extern int AutoCheckForUptatesInterval;\r
239 extern time_t LastAutoCheckForUpdates;\r
240 // ファイル一覧バグ修正\r
241 extern int AbortOnListError;\r
242 // ミラーリング設定追加\r
243 extern int MirrorNoTransferContents; \r
244 \r
245 /*----- マスタパスワードの設定 ----------------------------------------------\r
246 *\r
247 *       Parameter\r
248 *               const char* Password : マスターパスワード\r
249 *\r
250 *       Return Value\r
251 *               なし\r
252 *----------------------------------------------------------------------------*/\r
253 void SetMasterPassword( const char* Password )\r
254 {\r
255         ZeroMemory( SecretKey, MAX_PASSWORD_LEN + 12 );\r
256         if( Password != NULL ){\r
257                 strncpy( SecretKey, Password, MAX_PASSWORD_LEN );\r
258         }\r
259         else {\r
260                 strcpy( SecretKey, DEFAULT_PASSWORD );\r
261         }\r
262         SecretKeyLength = strlen( SecretKey );\r
263         \r
264         /* 未検証なので,初期状態はOKにする (強制再設定→保存にを可能にする)*/\r
265         IsMasterPasswordError = PASSWORD_OK;\r
266 }\r
267 \r
268 // セキュリティ強化\r
269 void GetMasterPassword(char* Password)\r
270 {\r
271         strcpy(Password, SecretKey);\r
272 }\r
273 \r
274 /*----- マスタパスワードの状態取得 ----------------------------------------------\r
275 *\r
276 *       Parameter\r
277 *               なし\r
278 *\r
279 *       Return Value\r
280 *               PASSWORD_OK : OK\r
281 *               PASSWORD_UNMATCH : パスワード不一致\r
282 *               BAD_PASSWORD_HASH : パスワード確認失敗\r
283 *----------------------------------------------------------------------------*/\r
284 int GetMasterPasswordStatus(void)\r
285 {\r
286         return IsMasterPasswordError;\r
287 }\r
288 \r
289 /*----- レジストリ/INIファイルのマスターパスワードの検証を行う ------------\r
290 *\r
291 *       Parameter\r
292 *               なし\r
293 *\r
294 *       Return Value\r
295 *               \r
296 *----------------------------------------------------------------------------*/\r
297 \r
298 int ValidateMasterPassword(void)\r
299 {\r
300         void *hKey3;\r
301         int i;\r
302 \r
303         SetRegType(REGTYPE_INI);\r
304         if((i = OpenReg("FFFTP", &hKey3)) != FFFTP_SUCCESS)\r
305         {\r
306                 if(AskForceIni() == NO)\r
307                 {\r
308                         SetRegType(REGTYPE_REG);\r
309                         i = OpenReg("FFFTP", &hKey3);\r
310                 }\r
311         }\r
312         if(i == FFFTP_SUCCESS){\r
313                 char checkbuf[48];\r
314                 int salt = 0;\r
315                 // 全設定暗号化対応\r
316                 int stretch = 0;\r
317                 unsigned char salt1[16];\r
318 \r
319                 // 全設定暗号化対応\r
320 //              if( ReadIntValueFromReg(hKey3, "CredentialSalt", &salt)){\r
321 //                      SetHashSalt( salt );\r
322 //              }\r
323 //              if( ReadStringFromReg(hKey3, "CredentialCheck", checkbuf, sizeof( checkbuf )) == FFFTP_SUCCESS ){\r
324 //                      switch( CheckPasswordValidity( SecretKey, SecretKeyLength, checkbuf ) ){\r
325 //                      case 0: /* not match */\r
326 //                              IsMasterPasswordError = PASSWORD_UNMATCH;\r
327 //                              break;\r
328 //                      case 1: /* match */\r
329 //                              IsMasterPasswordError = PASSWORD_OK;\r
330 //                              break;\r
331 //                      case 2: /* invalid hash */\r
332 //                      default:\r
333 //                              IsMasterPasswordError = BAD_PASSWORD_HASH;\r
334 //                              break;\r
335 //                      }\r
336 //              }\r
337                 if(ReadStringFromReg(hKey3, "CredentialCheck1", checkbuf, sizeof(checkbuf)) == FFFTP_SUCCESS)\r
338                 {\r
339                         if(ReadBinaryFromReg(hKey3, "CredentialSalt1", &salt1, sizeof(salt1)) == FFFTP_SUCCESS)\r
340                                 SetHashSalt1(&salt1, 16);\r
341                         else\r
342                                 SetHashSalt1(NULL, 0);\r
343                         ReadIntValueFromReg(hKey3, "CredentialStretch", &stretch);\r
344                         switch(CheckPasswordValidity(SecretKey, SecretKeyLength, checkbuf, stretch))\r
345                         {\r
346                         case 0:\r
347                                 IsMasterPasswordError = PASSWORD_UNMATCH;\r
348                                 break;\r
349                         case 1:\r
350                                 IsMasterPasswordError = PASSWORD_OK;\r
351                                 break;\r
352                         default:\r
353                                 IsMasterPasswordError = BAD_PASSWORD_HASH;\r
354                                 break;\r
355                         }\r
356                 }\r
357                 else if(ReadStringFromReg(hKey3, "CredentialCheck", checkbuf, sizeof(checkbuf)) == FFFTP_SUCCESS)\r
358                 {\r
359                         if(ReadIntValueFromReg(hKey3, "CredentialSalt", &salt) == FFFTP_SUCCESS)\r
360                                 SetHashSalt(salt);\r
361                         else\r
362                                 SetHashSalt1(NULL, 0);\r
363                         switch(CheckPasswordValidity(SecretKey, SecretKeyLength, checkbuf, 0))\r
364                         {\r
365                         case 0:\r
366                                 IsMasterPasswordError = PASSWORD_UNMATCH;\r
367                                 break;\r
368                         case 1:\r
369                                 IsMasterPasswordError = PASSWORD_OK;\r
370                                 break;\r
371                         default:\r
372                                 IsMasterPasswordError = BAD_PASSWORD_HASH;\r
373                                 break;\r
374                         }\r
375                 }\r
376                 CloseReg(hKey3);\r
377                 return YES;\r
378         }\r
379         return NO;\r
380 }\r
381 \r
382 /*----- レジストリ/INIファイルに設定値を保存 ---------------------------------\r
383 *\r
384 *       Parameter\r
385 *               なし\r
386 *\r
387 *       Return Value\r
388 *               なし\r
389 *----------------------------------------------------------------------------*/\r
390 \r
391 void SaveRegistry(void)\r
392 {\r
393         void *hKey3;\r
394         void *hKey4;\r
395         void *hKey5;\r
396         // 暗号化通信対応\r
397 //      char Str[FMAX_PATH+1];\r
398         char Str[PRIVATE_KEY_LEN*4+1];\r
399         char Buf[FMAX_PATH+1];\r
400         int i;\r
401         int n;\r
402         HOSTDATA DefaultHost;\r
403         HOSTDATA Host;\r
404         HISTORYDATA Hist;\r
405         HISTORYDATA DefaultHist;\r
406         \r
407         if( GetMasterPasswordStatus() == PASSWORD_UNMATCH ){\r
408                 /* 2010.01.30 genta: マスターパスワードが不一致の場合は不用意に上書きしない */\r
409                 return;\r
410         }\r
411 \r
412         // 全設定暗号化対応\r
413         if(EncryptSettingsError == YES)\r
414                 return;\r
415 \r
416         // バージョン確認\r
417         if(ReadOnlySettings == YES)\r
418                 return;\r
419 \r
420         SetRegType(RegType);\r
421         if(CreateReg("FFFTP", &hKey3) == FFFTP_SUCCESS)\r
422         {\r
423                 char buf[48];\r
424                 int salt = GetTickCount();\r
425                 // 全設定暗号化対応\r
426                 unsigned char salt1[16];\r
427                 FILETIME ft[4];\r
428         \r
429                 WriteIntValueToReg(hKey3, "Version", VER_NUM);\r
430                 // 全設定暗号化対応\r
431 //              WriteIntValueToReg(hKey3, "CredentialSalt", salt);\r
432 //              \r
433 //              SetHashSalt( salt );\r
434 //              /* save password hash */\r
435 //              CreatePasswordHash( SecretKey, SecretKeyLength, buf );\r
436 //              WriteStringToReg(hKey3, "CredentialCheck", buf);\r
437                 if(EncryptAllSettings == YES)\r
438                 {\r
439                         GetProcessTimes(GetCurrentProcess(), &ft[0], &ft[1], &ft[2], &ft[3]);\r
440                         memcpy(&salt1[0], &salt, 4);\r
441                         memcpy(&salt1[4], &ft[0].dwLowDateTime, 4);\r
442                         memcpy(&salt1[8], &ft[2].dwLowDateTime, 4);\r
443                         memcpy(&salt1[12], &ft[3].dwLowDateTime, 4);\r
444                         SetHashSalt1(&salt1, 16);\r
445                         WriteBinaryToReg(hKey3, "CredentialSalt1", &salt1, sizeof(salt1));\r
446                         WriteIntValueToReg(hKey3, "CredentialStretch", 65535);\r
447                         CreatePasswordHash(SecretKey, SecretKeyLength, buf, 65535);\r
448                         WriteStringToReg(hKey3, "CredentialCheck1", buf);\r
449                 }\r
450                 else\r
451                 {\r
452                         SetHashSalt( salt );\r
453                         WriteIntValueToReg(hKey3, "CredentialSalt", salt);\r
454                         CreatePasswordHash(SecretKey, SecretKeyLength, buf, 0);\r
455                         WriteStringToReg(hKey3, "CredentialCheck", buf);\r
456                 }\r
457 \r
458                 // 全設定暗号化対応\r
459                 WriteIntValueToReg(hKey3, "EncryptAll", EncryptAllSettings);\r
460                 sprintf(Buf, "%d", EncryptAllSettings);\r
461                 EncodePassword(Buf, Str);\r
462                 WriteStringToReg(hKey3, "EncryptAllDetector", Str);\r
463                 EncryptSettings = EncryptAllSettings;\r
464                 memset(&EncryptSettingsChecksum, 0, 20);\r
465 \r
466                 // 全設定暗号化対応\r
467 //              if(CreateSubKey(hKey3, "Options", &hKey4) == FFFTP_SUCCESS)\r
468                 if(EncryptAllSettings == YES)\r
469                         strcpy(Str, "EncryptedOptions");\r
470                 else\r
471                         strcpy(Str, "Options");\r
472                 if(CreateSubKey(hKey3, Str, &hKey4) == FFFTP_SUCCESS)\r
473                 {\r
474                         WriteIntValueToReg(hKey4, "NoSave", SuppressSave);\r
475 \r
476                         if(SuppressSave != YES)\r
477                         {\r
478                                 WriteIntValueToReg(hKey4, "WinPosX", WinPosX);\r
479                                 WriteIntValueToReg(hKey4, "WinPosY", WinPosY);\r
480                                 WriteIntValueToReg(hKey4, "WinWidth", WinWidth);\r
481                                 WriteIntValueToReg(hKey4, "WinHeight", WinHeight);\r
482                                 WriteIntValueToReg(hKey4, "LocalWidth", LocalWidth);\r
483                                 WriteIntValueToReg(hKey4, "TaskHeight", TaskHeight);\r
484                                 WriteBinaryToReg(hKey4, "LocalColm", LocalTabWidth, sizeof(LocalTabWidth));\r
485                                 WriteBinaryToReg(hKey4, "RemoteColm", RemoteTabWidth, sizeof(RemoteTabWidth));\r
486                                 WriteIntValueToReg(hKey4, "SwCmd", Sizing);\r
487 \r
488                                 WriteStringToReg(hKey4, "UserMail", UserMailAdrs);\r
489                                 WriteStringToReg(hKey4, "Viewer", ViewerName[0]);\r
490                                 WriteStringToReg(hKey4, "Viewer2", ViewerName[1]);\r
491                                 WriteStringToReg(hKey4, "Viewer3", ViewerName[2]);\r
492 \r
493                                 WriteIntValueToReg(hKey4, "TrType", TransMode);\r
494                                 WriteIntValueToReg(hKey4, "Recv", RecvMode);\r
495                                 WriteIntValueToReg(hKey4, "Send", SendMode);\r
496                                 WriteIntValueToReg(hKey4, "Move", MoveMode);\r
497                                 WriteStringToReg(hKey4, "Path", DefaultLocalPath);\r
498                                 WriteIntValueToReg(hKey4, "Time", SaveTimeStamp);\r
499                                 WriteIntValueToReg(hKey4, "EOF", RmEOF);\r
500                                 WriteIntValueToReg(hKey4, "Scolon", VaxSemicolon);\r
501 \r
502                                 WriteIntValueToReg(hKey4, "RecvEx", ExistMode);\r
503                                 WriteIntValueToReg(hKey4, "SendEx", UpExistMode);\r
504 \r
505                                 WriteIntValueToReg(hKey4, "LFsort", LocalFileSort);\r
506                                 WriteIntValueToReg(hKey4, "LDsort", LocalDirSort);\r
507                                 WriteIntValueToReg(hKey4, "RFsort", RemoteFileSort);\r
508                                 WriteIntValueToReg(hKey4, "RDsort", RemoteDirSort);\r
509                                 WriteIntValueToReg(hKey4, "SortSave", SortSave);\r
510 \r
511                                 WriteIntValueToReg(hKey4, "ListType", ListType);\r
512                                 WriteIntValueToReg(hKey4, "Cache", CacheEntry);\r
513                                 WriteIntValueToReg(hKey4, "CacheSave", CacheSave);\r
514                                 WriteIntValueToReg(hKey4, "DotFile", DotFile);\r
515                                 WriteIntValueToReg(hKey4, "Dclick", DclickOpen);\r
516 \r
517                                 WriteIntValueToReg(hKey4, "ConS", ConnectOnStart);\r
518                                 WriteIntValueToReg(hKey4, "OldDlg", ConnectAndSet);\r
519                                 WriteIntValueToReg(hKey4, "RasClose", RasClose);\r
520                                 WriteIntValueToReg(hKey4, "RasNotify", RasCloseNotify);\r
521                                 WriteIntValueToReg(hKey4, "Qanony", QuickAnonymous);\r
522                                 WriteIntValueToReg(hKey4, "PassHist", PassToHist);\r
523                                 WriteIntValueToReg(hKey4, "SendQuit", SendQuit);\r
524                                 WriteIntValueToReg(hKey4, "NoRas", NoRasControl);\r
525 \r
526                                 WriteIntValueToReg(hKey4, "Debug", DebugConsole);\r
527                                 WriteIntValueToReg(hKey4, "WinPos", SaveWinPos);\r
528                                 WriteIntValueToReg(hKey4, "RegExp", FindMode);\r
529                                 WriteIntValueToReg(hKey4, "Reg", RegType);\r
530 \r
531                                 WriteMultiStringToReg(hKey4, "AsciiFile", AsciiExt);\r
532                                 WriteIntValueToReg(hKey4, "LowUp", FnameCnv);\r
533                                 WriteIntValueToReg(hKey4, "Tout", TimeOut);\r
534 \r
535                                 WriteMultiStringToReg(hKey4, "NoTrn", MirrorNoTrn);\r
536                                 WriteMultiStringToReg(hKey4, "NoDel", MirrorNoDel);\r
537                                 WriteIntValueToReg(hKey4, "MirFile", MirrorFnameCnv);\r
538                                 WriteIntValueToReg(hKey4, "MirUNot", MirUpDelNotify);\r
539                                 WriteIntValueToReg(hKey4, "MirDNot", MirDownDelNotify);\r
540 \r
541                                 MakeFontData(ListLogFont, ListFont, Str);\r
542                                 WriteStringToReg(hKey4, "ListFont", Str);\r
543                                 WriteIntValueToReg(hKey4, "ListHide", DispIgnoreHide);\r
544                                 WriteIntValueToReg(hKey4, "ListDrv", DispDrives);\r
545 \r
546                                 WriteStringToReg(hKey4, "FwallHost", FwallHost);\r
547                                 WriteStringToReg(hKey4, "FwallUser", FwallUser);\r
548                                 EncodePassword(FwallPass, Str);\r
549                                 WriteStringToReg(hKey4, "FwallPass", Str);\r
550                                 WriteIntValueToReg(hKey4, "FwallPort", FwallPort);\r
551                                 WriteIntValueToReg(hKey4, "FwallType", FwallType);\r
552                                 WriteIntValueToReg(hKey4, "FwallDef", FwallDefault);\r
553                                 WriteIntValueToReg(hKey4, "FwallSec", FwallSecurity);\r
554                                 WriteIntValueToReg(hKey4, "PasvDef", PasvDefault);\r
555                                 WriteIntValueToReg(hKey4, "FwallRes", FwallResolve);\r
556                                 WriteIntValueToReg(hKey4, "FwallLow", FwallLower);\r
557                                 WriteIntValueToReg(hKey4, "FwallDel", FwallDelimiter);\r
558 \r
559                                 WriteIntValueToReg(hKey4, "SndConSw", Sound[SND_CONNECT].On);\r
560                                 WriteIntValueToReg(hKey4, "SndTrnSw", Sound[SND_TRANS].On);\r
561                                 WriteIntValueToReg(hKey4, "SndErrSw", Sound[SND_ERROR].On);\r
562                                 WriteStringToReg(hKey4, "SndCon", Sound[SND_CONNECT].Fname);\r
563                                 WriteStringToReg(hKey4, "SndTrn", Sound[SND_TRANS].Fname);\r
564                                 WriteStringToReg(hKey4, "SndErr", Sound[SND_ERROR].Fname);\r
565 \r
566                                 WriteMultiStringToReg(hKey4, "DefAttr", DefAttrList);\r
567 \r
568                                 // 環境依存の不具合対策\r
569 //                              GetTempPath(FMAX_PATH, Str);\r
570                                 GetAppTempPath(Str);\r
571                                 SetYenTail(Str);\r
572                                 SaveStr(hKey4, "Tmp", TmpPath, Str);\r
573 \r
574                                 WriteBinaryToReg(hKey4, "Hdlg", &HostDlgSize, sizeof(SIZE));\r
575                                 WriteBinaryToReg(hKey4, "Bdlg", &BmarkDlgSize, sizeof(SIZE));\r
576                                 WriteBinaryToReg(hKey4, "Mdlg", &MirrorDlgSize, sizeof(SIZE));\r
577 \r
578                                 WriteIntValueToReg(hKey4, "FAttrSw", FolderAttr);\r
579                                 WriteIntValueToReg(hKey4, "FAttr", FolderAttrNum);\r
580 \r
581                                 WriteIntValueToReg(hKey4, "HistNum", FileHist);\r
582 \r
583                                 /* Ver1.54a以前の形式のヒストリデータは削除 */\r
584                                 DeleteValue(hKey4, "Hist");\r
585 \r
586                                 /* ヒストリの設定を保存 */\r
587                                 CopyDefaultHistory(&DefaultHist);\r
588                                 n = 0;\r
589                                 for(i = AskHistoryNum(); i > 0; i--)\r
590                                 {\r
591                                         if(GetHistoryByNum(i-1, &Hist) == FFFTP_SUCCESS)\r
592                                         {\r
593                                                 sprintf(Str, "History%d", n);\r
594                                                 if(CreateSubKey(hKey4, Str, &hKey5) == FFFTP_SUCCESS)\r
595                                                 {\r
596                                                         SaveStr(hKey5, "HostAdrs", Hist.HostAdrs, DefaultHist.HostAdrs);\r
597                                                         SaveStr(hKey5, "UserName", Hist.UserName, DefaultHist.UserName);\r
598                                                         SaveStr(hKey5, "Account", Hist.Account, DefaultHist.Account);\r
599                                                         SaveStr(hKey5, "LocalDir", Hist.LocalInitDir, NULL);\r
600                                                         SaveStr(hKey5, "RemoteDir", Hist.RemoteInitDir, DefaultHist.RemoteInitDir);\r
601                                                         SaveStr(hKey5, "Chmod", Hist.ChmodCmd, DefaultHist.ChmodCmd);\r
602                                                         SaveStr(hKey5, "Nlst", Hist.LsName, DefaultHist.LsName);\r
603                                                         SaveStr(hKey5, "Init", Hist.InitCmd, DefaultHist.InitCmd);\r
604                                                         EncodePassword(Hist.PassWord, Str);\r
605                                                         SaveStr(hKey5, "Password", Str, DefaultHist.PassWord);\r
606                                                         SaveIntNum(hKey5, "Port", Hist.Port, DefaultHist.Port);\r
607                                                         SaveIntNum(hKey5, "Kanji", Hist.KanjiCode, DefaultHist.KanjiCode);\r
608                                                         SaveIntNum(hKey5, "KanaCnv", Hist.KanaCnv, DefaultHist.KanaCnv);\r
609                                                         SaveIntNum(hKey5, "NameKanji", Hist.NameKanjiCode, DefaultHist.NameKanjiCode);\r
610                                                         SaveIntNum(hKey5, "NameKana", Hist.NameKanaCnv, DefaultHist.NameKanaCnv);\r
611                                                         SaveIntNum(hKey5, "Pasv", Hist.Pasv, DefaultHist.Pasv);\r
612                                                         SaveIntNum(hKey5, "Fwall", Hist.FireWall, DefaultHist.FireWall);\r
613                                                         SaveIntNum(hKey5, "List", Hist.ListCmdOnly, DefaultHist.ListCmdOnly);\r
614                                                         SaveIntNum(hKey5, "NLST-R", Hist.UseNLST_R, DefaultHist.UseNLST_R);\r
615                                                         SaveIntNum(hKey5, "Tzone", Hist.TimeZone, DefaultHist.TimeZone);\r
616                                                         SaveIntNum(hKey5, "Type", Hist.HostType, DefaultHist.HostType);\r
617                                                         SaveIntNum(hKey5, "Sync", Hist.SyncMove, DefaultHist.SyncMove);\r
618                                                         SaveIntNum(hKey5, "Fpath", Hist.NoFullPath, DefaultHist.NoFullPath);\r
619                                                         WriteBinaryToReg(hKey5, "Sort", &Hist.Sort, sizeof(Hist.Sort));\r
620                                                         SaveIntNum(hKey5, "Secu", Hist.Security, DefaultHist.Security);\r
621                                                         WriteIntValueToReg(hKey5, "TrType", Hist.Type);\r
622                                                         SaveIntNum(hKey5, "Dial", Hist.Dialup, DefaultHist.Dialup);\r
623                                                         SaveIntNum(hKey5, "UseIt", Hist.DialupAlways, DefaultHist.DialupAlways);\r
624                                                         SaveIntNum(hKey5, "Notify", Hist.DialupNotify, DefaultHist.DialupNotify);\r
625                                                         SaveStr(hKey5, "DialTo", Hist.DialEntry, DefaultHist.DialEntry);\r
626                                                         // 暗号化通信対応\r
627                                                         SaveIntNum(hKey5, "NoEncryption", Hist.UseNoEncryption, DefaultHist.UseNoEncryption);\r
628                                                         SaveIntNum(hKey5, "FTPES", Hist.UseFTPES, DefaultHist.UseFTPES);\r
629                                                         SaveIntNum(hKey5, "FTPIS", Hist.UseFTPIS, DefaultHist.UseFTPIS);\r
630                                                         SaveIntNum(hKey5, "SFTP", Hist.UseSFTP, DefaultHist.UseSFTP);\r
631                                                         EncodePassword(Hist.PrivateKey, Str);\r
632                                                         SaveStr(hKey5, "PKey", Str, DefaultHist.PrivateKey);\r
633                                                         SaveIntNum(hKey5, "NoWeak", Hist.NoWeakEncryption, DefaultHist.NoWeakEncryption);\r
634                                                         // 同時接続対応\r
635                                                         SaveIntNum(hKey5, "ThreadCount", Hist.MaxThreadCount, DefaultHist.MaxThreadCount);\r
636                                                         SaveIntNum(hKey5, "ReuseCmdSkt", Hist.ReuseCmdSkt, DefaultHist.ReuseCmdSkt);\r
637                                                         // MLSD対応\r
638                                                         SaveIntNum(hKey5, "MLSD", Hist.UseMLSD, DefaultHist.UseMLSD);\r
639                                                         // IPv6対応\r
640                                                         SaveIntNum(hKey5, "NetType", Hist.NetType, DefaultHist.NetType);\r
641                                                         // 自動切断対策\r
642                                                         SaveIntNum(hKey5, "Noop", Hist.NoopInterval, DefaultHist.NoopInterval);\r
643                                                         // 再転送対応\r
644                                                         SaveIntNum(hKey5, "ErrMode", Hist.TransferErrorMode, DefaultHist.TransferErrorMode);\r
645                                                         SaveIntNum(hKey5, "ErrNotify", Hist.TransferErrorNotify, DefaultHist.TransferErrorNotify);\r
646                                                         // セッションあたりの転送量制限対策\r
647                                                         SaveIntNum(hKey5, "ErrReconnect", Hist.TransferErrorReconnect, DefaultHist.TransferErrorReconnect);\r
648 \r
649                                                         CloseSubKey(hKey5);\r
650                                                         n++;\r
651                                                 }\r
652                                         }\r
653                                 }\r
654                                 WriteIntValueToReg(hKey4, "SavedHist", n);\r
655 \r
656                                 /* 余分なヒストリがあったら削除 */\r
657                                 for(; n < 999; n++)\r
658                                 {\r
659                                         sprintf(Str, "History%d", n);\r
660                                         if(DeleteSubKey(hKey4, Str) != FFFTP_SUCCESS)\r
661                                                 break;\r
662                                 }\r
663 \r
664                                 // ホスト共通設定機能\r
665                                 if(CreateSubKey(hKey4, "DefaultHost", &hKey5) == FFFTP_SUCCESS)\r
666                                 {\r
667                                         CopyDefaultDefaultHost(&DefaultHost);\r
668                                         CopyDefaultHost(&Host);\r
669                                         WriteIntValueToReg(hKey5, "Set", Host.Level);\r
670                                         SaveStr(hKey5, "HostName", Host.HostName, DefaultHost.HostName);\r
671                                         SaveStr(hKey5, "HostAdrs", Host.HostAdrs, DefaultHost.HostAdrs);\r
672                                         SaveStr(hKey5, "UserName", Host.UserName, DefaultHost.UserName);\r
673                                         SaveStr(hKey5, "Account", Host.Account, DefaultHost.Account);\r
674                                         SaveStr(hKey5, "LocalDir", Host.LocalInitDir, NULL);\r
675                                         SaveStr(hKey5, "RemoteDir", Host.RemoteInitDir, DefaultHost.RemoteInitDir);\r
676                                         SaveStr(hKey5, "Chmod", Host.ChmodCmd, DefaultHost.ChmodCmd);\r
677                                         SaveStr(hKey5, "Nlst", Host.LsName, DefaultHost.LsName);\r
678                                         SaveStr(hKey5, "Init", Host.InitCmd, DefaultHost.InitCmd);\r
679                                         if(Host.Anonymous == NO)\r
680                                                 EncodePassword(Host.PassWord, Str);\r
681                                         else\r
682                                                 strcpy(Str, DefaultHost.PassWord);\r
683                                         SaveStr(hKey5, "Password", Str, DefaultHost.PassWord);\r
684                                         SaveIntNum(hKey5, "Port", Host.Port, DefaultHost.Port);\r
685                                         SaveIntNum(hKey5, "Anonymous", Host.Anonymous, DefaultHost.Anonymous);\r
686                                         SaveIntNum(hKey5, "Kanji", Host.KanjiCode, DefaultHost.KanjiCode);\r
687                                         SaveIntNum(hKey5, "KanaCnv", Host.KanaCnv, DefaultHost.KanaCnv);\r
688                                         SaveIntNum(hKey5, "NameKanji", Host.NameKanjiCode, DefaultHost.NameKanjiCode);\r
689                                         SaveIntNum(hKey5, "NameKana", Host.NameKanaCnv, DefaultHost.NameKanaCnv);\r
690                                         SaveIntNum(hKey5, "Pasv", Host.Pasv, DefaultHost.Pasv);\r
691                                         SaveIntNum(hKey5, "Fwall", Host.FireWall, DefaultHost.FireWall);\r
692                                         SaveIntNum(hKey5, "List", Host.ListCmdOnly, DefaultHost.ListCmdOnly);\r
693                                         SaveIntNum(hKey5, "NLST-R", Host.UseNLST_R, DefaultHost.UseNLST_R);\r
694                                         SaveIntNum(hKey5, "Last", Host.LastDir, DefaultHost.LastDir);\r
695                                         SaveIntNum(hKey5, "Tzone", Host.TimeZone, DefaultHost.TimeZone);\r
696                                         SaveIntNum(hKey5, "Type", Host.HostType, DefaultHost.HostType);\r
697                                         SaveIntNum(hKey5, "Sync", Host.SyncMove, DefaultHost.SyncMove);\r
698                                         SaveIntNum(hKey5, "Fpath", Host.NoFullPath, DefaultHost.NoFullPath);\r
699                                         WriteBinaryToReg(hKey5, "Sort", &Host.Sort, sizeof(Host.Sort));\r
700                                         SaveIntNum(hKey5, "Secu", Host.Security, DefaultHost.Security);\r
701                                         WriteMultiStringToReg(hKey5, "Bmarks", Host.BookMark);\r
702                                         SaveIntNum(hKey5, "Dial", Host.Dialup, DefaultHost.Dialup);\r
703                                         SaveIntNum(hKey5, "UseIt", Host.DialupAlways, DefaultHost.DialupAlways);\r
704                                         SaveIntNum(hKey5, "Notify", Host.DialupNotify, DefaultHost.DialupNotify);\r
705                                         SaveStr(hKey5, "DialTo", Host.DialEntry, DefaultHost.DialEntry);\r
706                                         SaveIntNum(hKey5, "NoEncryption", Host.UseNoEncryption, DefaultHost.UseNoEncryption);\r
707                                         SaveIntNum(hKey5, "FTPES", Host.UseFTPES, DefaultHost.UseFTPES);\r
708                                         SaveIntNum(hKey5, "FTPIS", Host.UseFTPIS, DefaultHost.UseFTPIS);\r
709                                         SaveIntNum(hKey5, "SFTP", Host.UseSFTP, DefaultHost.UseSFTP);\r
710                                         EncodePassword(Host.PrivateKey, Str);\r
711                                         SaveStr(hKey5, "PKey", Str, DefaultHost.PrivateKey);\r
712                                         SaveIntNum(hKey5, "NoWeak", Host.NoWeakEncryption, DefaultHost.NoWeakEncryption);\r
713                                         SaveIntNum(hKey5, "ThreadCount", Host.MaxThreadCount, DefaultHost.MaxThreadCount);\r
714                                         SaveIntNum(hKey5, "ReuseCmdSkt", Host.ReuseCmdSkt, DefaultHost.ReuseCmdSkt);\r
715                                         SaveIntNum(hKey5, "MLSD", Host.UseMLSD, DefaultHost.UseMLSD);\r
716                                         SaveIntNum(hKey5, "NetType", Host.NetType, DefaultHost.NetType);\r
717                                         SaveIntNum(hKey5, "Noop", Host.NoopInterval, DefaultHost.NoopInterval);\r
718                                         SaveIntNum(hKey5, "ErrMode", Host.TransferErrorMode, DefaultHost.TransferErrorMode);\r
719                                         SaveIntNum(hKey5, "ErrNotify", Host.TransferErrorNotify, DefaultHost.TransferErrorNotify);\r
720                                         SaveIntNum(hKey5, "ErrReconnect", Host.TransferErrorReconnect, DefaultHost.TransferErrorReconnect);\r
721                                         CloseSubKey(hKey5);\r
722                                 }\r
723 \r
724                                 /* ホストの設定を保存 */\r
725                                 CopyDefaultHost(&DefaultHost);\r
726                                 i = 0;\r
727                                 while(CopyHostFromList(i, &Host) == FFFTP_SUCCESS)\r
728                                 {\r
729                                         sprintf(Str, "Host%d", i);\r
730                                         if(CreateSubKey(hKey4, Str, &hKey5) == FFFTP_SUCCESS)\r
731                                         {\r
732 //                                              SaveIntNum(hKey5, "Set", Host.Level, DefaultHost.Level);\r
733                                                 WriteIntValueToReg(hKey5, "Set", Host.Level);\r
734                                                 SaveStr(hKey5, "HostName", Host.HostName, DefaultHost.HostName);\r
735                                                 if((Host.Level & SET_LEVEL_GROUP) == 0)\r
736                                                 {\r
737                                                         SaveStr(hKey5, "HostAdrs", Host.HostAdrs, DefaultHost.HostAdrs);\r
738                                                         SaveStr(hKey5, "UserName", Host.UserName, DefaultHost.UserName);\r
739                                                         SaveStr(hKey5, "Account", Host.Account, DefaultHost.Account);\r
740                                                         SaveStr(hKey5, "LocalDir", Host.LocalInitDir, NULL);\r
741                                                         SaveStr(hKey5, "RemoteDir", Host.RemoteInitDir, DefaultHost.RemoteInitDir);\r
742                                                         SaveStr(hKey5, "Chmod", Host.ChmodCmd, DefaultHost.ChmodCmd);\r
743                                                         SaveStr(hKey5, "Nlst", Host.LsName, DefaultHost.LsName);\r
744                                                         SaveStr(hKey5, "Init", Host.InitCmd, DefaultHost.InitCmd);\r
745 \r
746                                                         if(Host.Anonymous == NO)\r
747                                                                 EncodePassword(Host.PassWord, Str);\r
748                                                         else\r
749                                                                 strcpy(Str, DefaultHost.PassWord);\r
750                                                         SaveStr(hKey5, "Password", Str, DefaultHost.PassWord);\r
751 \r
752                                                         SaveIntNum(hKey5, "Port", Host.Port, DefaultHost.Port);\r
753                                                         SaveIntNum(hKey5, "Anonymous", Host.Anonymous, DefaultHost.Anonymous);\r
754                                                         SaveIntNum(hKey5, "Kanji", Host.KanjiCode, DefaultHost.KanjiCode);\r
755                                                         SaveIntNum(hKey5, "KanaCnv", Host.KanaCnv, DefaultHost.KanaCnv);\r
756                                                         SaveIntNum(hKey5, "NameKanji", Host.NameKanjiCode, DefaultHost.NameKanjiCode);\r
757                                                         SaveIntNum(hKey5, "NameKana", Host.NameKanaCnv, DefaultHost.NameKanaCnv);\r
758                                                         SaveIntNum(hKey5, "Pasv", Host.Pasv, DefaultHost.Pasv);\r
759                                                         SaveIntNum(hKey5, "Fwall", Host.FireWall, DefaultHost.FireWall);\r
760                                                         SaveIntNum(hKey5, "List", Host.ListCmdOnly, DefaultHost.ListCmdOnly);\r
761                                                         SaveIntNum(hKey5, "NLST-R", Host.UseNLST_R, DefaultHost.UseNLST_R);\r
762                                                         SaveIntNum(hKey5, "Last", Host.LastDir, DefaultHost.LastDir);\r
763                                                         SaveIntNum(hKey5, "Tzone", Host.TimeZone, DefaultHost.TimeZone);\r
764                                                         SaveIntNum(hKey5, "Type", Host.HostType, DefaultHost.HostType);\r
765                                                         SaveIntNum(hKey5, "Sync", Host.SyncMove, DefaultHost.SyncMove);\r
766                                                         SaveIntNum(hKey5, "Fpath", Host.NoFullPath, DefaultHost.NoFullPath);\r
767                                                         WriteBinaryToReg(hKey5, "Sort", &Host.Sort, sizeof(Host.Sort));\r
768                                                         SaveIntNum(hKey5, "Secu", Host.Security, DefaultHost.Security);\r
769 \r
770                                                         WriteMultiStringToReg(hKey5, "Bmarks", Host.BookMark);\r
771 \r
772                                                         SaveIntNum(hKey5, "Dial", Host.Dialup, DefaultHost.Dialup);\r
773                                                         SaveIntNum(hKey5, "UseIt", Host.DialupAlways, DefaultHost.DialupAlways);\r
774                                                         SaveIntNum(hKey5, "Notify", Host.DialupNotify, DefaultHost.DialupNotify);\r
775                                                         SaveStr(hKey5, "DialTo", Host.DialEntry, DefaultHost.DialEntry);\r
776                                                         // 暗号化通信対応\r
777                                                         SaveIntNum(hKey5, "NoEncryption", Host.UseNoEncryption, DefaultHost.UseNoEncryption);\r
778                                                         SaveIntNum(hKey5, "FTPES", Host.UseFTPES, DefaultHost.UseFTPES);\r
779                                                         SaveIntNum(hKey5, "FTPIS", Host.UseFTPIS, DefaultHost.UseFTPIS);\r
780                                                         SaveIntNum(hKey5, "SFTP", Host.UseSFTP, DefaultHost.UseSFTP);\r
781                                                         EncodePassword(Host.PrivateKey, Str);\r
782                                                         SaveStr(hKey5, "PKey", Str, DefaultHost.PrivateKey);\r
783                                                         SaveIntNum(hKey5, "NoWeak", Host.NoWeakEncryption, DefaultHost.NoWeakEncryption);\r
784                                                         // 同時接続対応\r
785                                                         SaveIntNum(hKey5, "ThreadCount", Host.MaxThreadCount, DefaultHost.MaxThreadCount);\r
786                                                         SaveIntNum(hKey5, "ReuseCmdSkt", Host.ReuseCmdSkt, DefaultHost.ReuseCmdSkt);\r
787                                                         // MLSD対応\r
788                                                         SaveIntNum(hKey5, "MLSD", Host.UseMLSD, DefaultHost.UseMLSD);\r
789                                                         // IPv6対応\r
790                                                         SaveIntNum(hKey5, "NetType", Host.NetType, DefaultHost.NetType);\r
791                                                         // 自動切断対策\r
792                                                         SaveIntNum(hKey5, "Noop", Host.NoopInterval, DefaultHost.NoopInterval);\r
793                                                         // 再転送対応\r
794                                                         SaveIntNum(hKey5, "ErrMode", Host.TransferErrorMode, DefaultHost.TransferErrorMode);\r
795                                                         SaveIntNum(hKey5, "ErrNotify", Host.TransferErrorNotify, DefaultHost.TransferErrorNotify);\r
796                                                         // セッションあたりの転送量制限対策\r
797                                                         SaveIntNum(hKey5, "ErrReconnect", Host.TransferErrorReconnect, DefaultHost.TransferErrorReconnect);\r
798                                                 }\r
799                                                 CloseSubKey(hKey5);\r
800                                         }\r
801                                         i++;\r
802                                 }\r
803                                 WriteIntValueToReg(hKey4, "SetNum", i);\r
804 \r
805                                 /* 余分なホストの設定があったら削除 */\r
806                                 for(; i < 998; i++)\r
807                                 {\r
808                                         sprintf(Str, "Host%d", i);\r
809                                         if(DeleteSubKey(hKey4, Str) != FFFTP_SUCCESS)\r
810                                                 break;\r
811                                 }\r
812 \r
813                                 if((i = AskCurrentHost()) == HOSTNUM_NOENTRY)\r
814                                         i = 0;\r
815                                 WriteIntValueToReg(hKey4, "CurSet", i);\r
816 \r
817                                 // 暗号化通信対応\r
818                                 WriteBinaryToReg(hKey4, "CertCacheHash", &CertificateCacheHash, sizeof(CertificateCacheHash));\r
819                                 strcpy(Buf, "");\r
820                                 StrCatOut((char*)&SSLRootCAFileHash, sizeof(SSLRootCAFileHash), Buf);\r
821                                 EncodePassword(Buf, Str);\r
822                                 WriteStringToReg(hKey4, "RootCertHash", Str);\r
823                                 // ファイルアイコン表示対応\r
824                                 WriteIntValueToReg(hKey4, "ListIcon", DispFileIcon);\r
825                                 // タイムスタンプのバグ修正\r
826                                 WriteIntValueToReg(hKey4, "ListSecond", DispTimeSeconds);\r
827                                 // ファイルの属性を数字で表示\r
828                                 WriteIntValueToReg(hKey4, "ListPermitNum", DispPermissionsNumber);\r
829                                 // ディレクトリ自動作成\r
830                                 WriteIntValueToReg(hKey4, "MakeDir", MakeAllDir);\r
831                                 // UTF-8対応\r
832                                 WriteIntValueToReg(hKey4, "Kanji", LocalKanjiCode);\r
833                                 // UPnP対応\r
834                                 WriteIntValueToReg(hKey4, "UPnP", UPnPEnabled);\r
835                                 // ローカル側自動更新\r
836                                 WriteIntValueToReg(hKey4, "ListRefresh", AutoRefreshFileList);\r
837                                 // 古い処理内容を消去\r
838                                 WriteIntValueToReg(hKey4, "OldLog", RemoveOldLog);\r
839                                 // ソフトウェア自動更新\r
840                                 WriteIntValueToReg(hKey4, "UpdCheck", AutoCheckForUpdates);\r
841                                 WriteIntValueToReg(hKey4, "UpdApply", AutoApplyUpdates);\r
842                                 WriteIntValueToReg(hKey4, "UpdInterval", AutoCheckForUptatesInterval);\r
843                                 WriteBinaryToReg(hKey4, "UpdLastCheck", &LastAutoCheckForUpdates, sizeof(LastAutoCheckForUpdates));\r
844                                 // ファイル一覧バグ修正\r
845                                 WriteIntValueToReg(hKey4, "AbortListErr", AbortOnListError);\r
846                                 // ミラーリング設定追加\r
847                                 WriteIntValueToReg(hKey4, "MirNoTransfer", MirrorNoTransferContents);\r
848                         }\r
849                         CloseSubKey(hKey4);\r
850                 }\r
851                 // 全設定暗号化対応\r
852                 EncryptSettings = NO;\r
853                 WriteBinaryToReg(hKey3, "EncryptAllChecksum", &EncryptSettingsChecksum, 20);\r
854                 if(EncryptAllSettings == YES)\r
855                 {\r
856                         if(OpenSubKey(hKey3, "Options", &hKey4) == FFFTP_SUCCESS)\r
857                         {\r
858                                 for(i = 0; ; i++)\r
859                                 {\r
860                                         sprintf(Str, "Host%d", i);\r
861                                         if(DeleteSubKey(hKey4, Str) != FFFTP_SUCCESS)\r
862                                                 break;\r
863                                 }\r
864                                 for(i = 0; ; i++)\r
865                                 {\r
866                                         sprintf(Str, "History%d", i);\r
867                                         if(DeleteSubKey(hKey4, Str) != FFFTP_SUCCESS)\r
868                                                 break;\r
869                                 }\r
870                                 CloseSubKey(hKey4);\r
871                         }\r
872                         DeleteSubKey(hKey3, "Options");\r
873                         DeleteValue(hKey3, "CredentialSalt");\r
874                         DeleteValue(hKey3, "CredentialCheck");\r
875                 }\r
876                 else\r
877                 {\r
878                         if(OpenSubKey(hKey3, "EncryptedOptions", &hKey4) == FFFTP_SUCCESS)\r
879                         {\r
880                                 for(i = 0; ; i++)\r
881                                 {\r
882                                         sprintf(Str, "Host%d", i);\r
883                                         if(DeleteSubKey(hKey4, Str) != FFFTP_SUCCESS)\r
884                                                 break;\r
885                                 }\r
886                                 for(i = 0; ; i++)\r
887                                 {\r
888                                         sprintf(Str, "History%d", i);\r
889                                         if(DeleteSubKey(hKey4, Str) != FFFTP_SUCCESS)\r
890                                                 break;\r
891                                 }\r
892                                 CloseSubKey(hKey4);\r
893                         }\r
894                         DeleteSubKey(hKey3, "EncryptedOptions");\r
895                         DeleteValue(hKey3, "CredentialSalt1");\r
896                         DeleteValue(hKey3, "CredentialStretch");\r
897                         DeleteValue(hKey3, "CredentialCheck1");\r
898                 }\r
899                 CloseReg(hKey3);\r
900         }\r
901         return;\r
902 }\r
903 \r
904 /*----- レジストリ/INIファイルから設定値を呼び出す ---------------------------\r
905 *\r
906 *       この関数を複数回呼び出すと,ホスト設定が追加される.\r
907 *\r
908 *       Parameter\r
909 *               なし\r
910 *\r
911 *       Return Value\r
912 *               YES: 読み出し成功\r
913 *               NO:  読み出し失敗(設定無し)\r
914 *----------------------------------------------------------------------------*/\r
915 \r
916 int LoadRegistry(void)\r
917 {\r
918         void *hKey3;\r
919         void *hKey4;\r
920         void *hKey5;\r
921         int i;\r
922         int Sets;\r
923         // 暗号化通信対応\r
924 //      char Str[256];  /* ASCII_EXT_LENより大きい事 */\r
925         char Str[PRIVATE_KEY_LEN*4+1];\r
926         char Buf[FMAX_PATH+1];\r
927         // 全設定暗号化対応\r
928         char Buf2[FMAX_PATH+1];\r
929         char *Pos;\r
930         char *Pos2;\r
931         HOSTDATA Host;\r
932         HISTORYDATA Hist;\r
933         int Sts;\r
934         int Version;\r
935         // 全設定暗号化対応\r
936         BYTE Checksum[20];\r
937 \r
938         Sts = NO;\r
939 \r
940         SetRegType(REGTYPE_INI);\r
941         if((i = OpenReg("FFFTP", &hKey3)) != FFFTP_SUCCESS)\r
942         {\r
943                 if(AskForceIni() == NO)\r
944                 {\r
945                         SetRegType(REGTYPE_REG);\r
946                         i = OpenReg("FFFTP", &hKey3);\r
947                 }\r
948         }\r
949 \r
950         if(i == FFFTP_SUCCESS)\r
951         {\r
952 //              char checkbuf[48];\r
953                 int salt = 0;\r
954                 Sts = YES;\r
955 \r
956                 ReadIntValueFromReg(hKey3, "Version", &Version);\r
957                 // UTF-8対応\r
958                 if(Version < 1980)\r
959                         IniKanjiCode = KANJI_SJIS;\r
960 \r
961                 // 全設定暗号化対応\r
962                 if(Version >= 1990)\r
963                 {\r
964                         if(GetMasterPasswordStatus() == PASSWORD_OK)\r
965                         {\r
966                                 ReadIntValueFromReg(hKey3, "EncryptAll", &EncryptAllSettings);\r
967                                 sprintf(Buf, "%d", EncryptAllSettings);\r
968                                 ReadStringFromReg(hKey3, "EncryptAllDetector", Str, 255);\r
969                                 DecodePassword(Str, Buf2);\r
970                                 EncryptSettings = EncryptAllSettings;\r
971                                 memset(&EncryptSettingsChecksum, 0, 20);\r
972                                 if(strcmp(Buf, Buf2) != 0)\r
973                                 {\r
974                                         switch(DialogBox(GetFtpInst(), MAKEINTRESOURCE(corruptsettings_dlg), GetMainHwnd(), AnyButtonDialogProc))\r
975                                         {\r
976                                         case IDCANCEL:\r
977                                                 Terminate();\r
978                                                 break;\r
979                                         case IDABORT:\r
980                                                 CloseReg(hKey3);\r
981                                                 ClearRegistry();\r
982                                                 ClearIni();\r
983                                                 Restart();\r
984                                                 Terminate();\r
985                                                 break;\r
986                                         case IDRETRY:\r
987                                                 EncryptSettingsError = YES;\r
988                                                 break;\r
989                                         case IDIGNORE:\r
990                                                 break;\r
991                                         }\r
992                                 }\r
993                         }\r
994                 }\r
995 \r
996                 // 全設定暗号化対応\r
997 //              if(OpenSubKey(hKey3, "Options", &hKey4) == FFFTP_SUCCESS)\r
998                 if(EncryptAllSettings == YES)\r
999                         strcpy(Str, "EncryptedOptions");\r
1000                 else\r
1001                         strcpy(Str, "Options");\r
1002                 if(OpenSubKey(hKey3, Str, &hKey4) == FFFTP_SUCCESS)\r
1003                 {\r
1004                         ReadIntValueFromReg(hKey4, "WinPosX", &WinPosX);\r
1005                         ReadIntValueFromReg(hKey4, "WinPosY", &WinPosY);\r
1006                         ReadIntValueFromReg(hKey4, "WinWidth", &WinWidth);\r
1007                         ReadIntValueFromReg(hKey4, "WinHeight", &WinHeight);\r
1008                         ReadIntValueFromReg(hKey4, "LocalWidth", &LocalWidth);\r
1009                         /* ↓旧バージョンのバグ対策 */\r
1010                         LocalWidth = max1(0, LocalWidth);\r
1011                         ReadIntValueFromReg(hKey4, "TaskHeight", &TaskHeight);\r
1012                         /* ↓旧バージョンのバグ対策 */\r
1013                         TaskHeight = max1(0, TaskHeight);\r
1014                         ReadBinaryFromReg(hKey4, "LocalColm", &LocalTabWidth, sizeof(LocalTabWidth));\r
1015                         ReadBinaryFromReg(hKey4, "RemoteColm", &RemoteTabWidth, sizeof(RemoteTabWidth));\r
1016                         ReadIntValueFromReg(hKey4, "SwCmd", &Sizing);\r
1017 \r
1018                         ReadStringFromReg(hKey4, "UserMail", UserMailAdrs, USER_MAIL_LEN+1);\r
1019                         ReadStringFromReg(hKey4, "Viewer", ViewerName[0], FMAX_PATH+1);\r
1020                         ReadStringFromReg(hKey4, "Viewer2", ViewerName[1], FMAX_PATH+1);\r
1021                         ReadStringFromReg(hKey4, "Viewer3", ViewerName[2], FMAX_PATH+1);\r
1022 \r
1023                         ReadIntValueFromReg(hKey4, "TrType", &TransMode);\r
1024                         ReadIntValueFromReg(hKey4, "Recv", &RecvMode);\r
1025                         ReadIntValueFromReg(hKey4, "Send", &SendMode);\r
1026                         ReadIntValueFromReg(hKey4, "Move", &MoveMode);\r
1027                         ReadStringFromReg(hKey4, "Path", DefaultLocalPath, FMAX_PATH+1);\r
1028                         ReadIntValueFromReg(hKey4, "Time", &SaveTimeStamp);\r
1029                         ReadIntValueFromReg(hKey4, "EOF", &RmEOF);\r
1030                         ReadIntValueFromReg(hKey4, "Scolon", &VaxSemicolon);\r
1031 \r
1032                         ReadIntValueFromReg(hKey4, "RecvEx", &ExistMode);\r
1033                         ReadIntValueFromReg(hKey4, "SendEx", &UpExistMode);\r
1034 \r
1035                         ReadIntValueFromReg(hKey4, "LFsort", &LocalFileSort);\r
1036                         ReadIntValueFromReg(hKey4, "LDsort", &LocalDirSort);\r
1037                         ReadIntValueFromReg(hKey4, "RFsort", &RemoteFileSort);\r
1038                         ReadIntValueFromReg(hKey4, "RDsort", &RemoteDirSort);\r
1039                         ReadIntValueFromReg(hKey4, "SortSave", &SortSave);\r
1040 \r
1041                         ReadIntValueFromReg(hKey4, "ListType", &ListType);\r
1042                         ReadIntValueFromReg(hKey4, "Cache", &CacheEntry);\r
1043                         ReadIntValueFromReg(hKey4, "CacheSave", &CacheSave);\r
1044                         ReadIntValueFromReg(hKey4, "DotFile", &DotFile);\r
1045                         ReadIntValueFromReg(hKey4, "Dclick", &DclickOpen);\r
1046 \r
1047                         ReadIntValueFromReg(hKey4, "ConS", &ConnectOnStart);\r
1048                         ReadIntValueFromReg(hKey4, "OldDlg", &ConnectAndSet);\r
1049                         ReadIntValueFromReg(hKey4, "RasClose", &RasClose);\r
1050                         ReadIntValueFromReg(hKey4, "RasNotify", &RasCloseNotify);\r
1051                         ReadIntValueFromReg(hKey4, "Qanony", &QuickAnonymous);\r
1052                         ReadIntValueFromReg(hKey4, "PassHist", &PassToHist);\r
1053                         ReadIntValueFromReg(hKey4, "SendQuit", &SendQuit);\r
1054                         ReadIntValueFromReg(hKey4, "NoRas", &NoRasControl);\r
1055 \r
1056                         ReadIntValueFromReg(hKey4, "Debug", &DebugConsole);\r
1057                         ReadIntValueFromReg(hKey4, "WinPos", &SaveWinPos);\r
1058                         ReadIntValueFromReg(hKey4, "RegExp", &FindMode);\r
1059                         ReadIntValueFromReg(hKey4, "Reg", &RegType);\r
1060 \r
1061                         if(ReadMultiStringFromReg(hKey4, "AsciiFile", AsciiExt, ASCII_EXT_LEN+1) == FFFTP_FAIL)\r
1062                         {\r
1063                                 /* 旧ASCIIモードの拡張子の設定を新しいものに変換 */\r
1064                                 // アスキーモード判別の改良\r
1065 //                              ReadStringFromReg(hKey4, "Ascii", Str, ASCII_EXT_LEN+1);\r
1066 //                              memset(AsciiExt, NUL, ASCII_EXT_LEN+1);\r
1067                                 Str[0] = NUL;\r
1068                                 if(ReadStringFromReg(hKey4, "Ascii", Str, ASCII_EXT_LEN+1) == FFFTP_SUCCESS)\r
1069                                         memset(AsciiExt, NUL, ASCII_EXT_LEN+1);\r
1070                                 Pos = Str;\r
1071                                 while(*Pos != NUL)\r
1072                                 {\r
1073                                         if((Pos2 = strchr(Pos, ';')) == NULL)\r
1074                                                 Pos2 = strchr(Pos, NUL);\r
1075                                         if((Pos2 - Pos) > 0)\r
1076                                         {\r
1077                                                 if((StrMultiLen(AsciiExt) + (Pos2 - Pos) + 2) >= ASCII_EXT_LEN)\r
1078                                                         break;\r
1079                                                 strcpy(AsciiExt + StrMultiLen(AsciiExt), "*.");\r
1080                                                 strncpy(AsciiExt + StrMultiLen(AsciiExt) - 1, Pos, (Pos2 - Pos));\r
1081                                         }\r
1082                                         Pos = Pos2;\r
1083                                         if(*Pos == ';')\r
1084                                                 Pos++;\r
1085                                 }\r
1086                         }\r
1087                         // アスキーモード判別の改良\r
1088                         if(Version < 1986)\r
1089                         {\r
1090                                 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
1091                                 while(*Pos != NUL)\r
1092                                 {\r
1093                                         Pos2 = AsciiExt;\r
1094                                         while(*Pos2 != NUL)\r
1095                                         {\r
1096                                                 if(_stricmp(Pos2, Pos) == 0)\r
1097                                                         break;\r
1098                                                 Pos2 = strchr(Pos2, NUL) + 1;\r
1099                                         }\r
1100                                         if(*Pos2 == NUL)\r
1101                                         {\r
1102                                                 if((StrMultiLen(AsciiExt) + strlen(Pos) + 2) < ASCII_EXT_LEN)\r
1103                                                         strncpy(AsciiExt + StrMultiLen(AsciiExt), Pos, strlen(Pos) + 2);\r
1104                                         }\r
1105                                         Pos = strchr(Pos, NUL) + 1;\r
1106                                 }\r
1107                         }\r
1108 \r
1109                         ReadIntValueFromReg(hKey4, "LowUp", &FnameCnv);\r
1110                         ReadIntValueFromReg(hKey4, "Tout", &TimeOut);\r
1111 \r
1112                         ReadMultiStringFromReg(hKey4, "NoTrn", MirrorNoTrn, MIRROR_LEN+1);\r
1113                         ReadMultiStringFromReg(hKey4, "NoDel", MirrorNoDel, MIRROR_LEN+1);\r
1114                         ReadIntValueFromReg(hKey4, "MirFile", &MirrorFnameCnv);\r
1115                         ReadIntValueFromReg(hKey4, "MirUNot", &MirUpDelNotify);\r
1116                         ReadIntValueFromReg(hKey4, "MirDNot", &MirDownDelNotify);\r
1117 \r
1118                         if(ReadStringFromReg(hKey4, "ListFont", Str, 256) == FFFTP_SUCCESS)\r
1119                         {\r
1120                                 if(RestoreFontData(Str, &ListLogFont) == FFFTP_SUCCESS)\r
1121                                         ListFont = CreateFontIndirect(&ListLogFont);\r
1122                         }\r
1123                         ReadIntValueFromReg(hKey4, "ListHide", &DispIgnoreHide);\r
1124                         ReadIntValueFromReg(hKey4, "ListDrv", &DispDrives);\r
1125 \r
1126                         ReadStringFromReg(hKey4, "FwallHost", FwallHost, HOST_ADRS_LEN+1);\r
1127                         ReadStringFromReg(hKey4, "FwallUser", FwallUser, USER_NAME_LEN+1);\r
1128                         ReadStringFromReg(hKey4, "FwallPass", Str, 255);\r
1129                         DecodePassword(Str, FwallPass);\r
1130                         ReadIntValueFromReg(hKey4, "FwallPort", &FwallPort);\r
1131                         ReadIntValueFromReg(hKey4, "FwallType", &FwallType);\r
1132                         ReadIntValueFromReg(hKey4, "FwallDef", &FwallDefault);\r
1133                         ReadIntValueFromReg(hKey4, "FwallSec", &FwallSecurity);\r
1134                         ReadIntValueFromReg(hKey4, "PasvDef", &PasvDefault);\r
1135                         ReadIntValueFromReg(hKey4, "FwallRes", &FwallResolve);\r
1136                         ReadIntValueFromReg(hKey4, "FwallLow", &FwallLower);\r
1137                         ReadIntValueFromReg(hKey4, "FwallDel", &FwallDelimiter);\r
1138 \r
1139                         ReadIntValueFromReg(hKey4, "SndConSw", &Sound[SND_CONNECT].On);\r
1140                         ReadIntValueFromReg(hKey4, "SndTrnSw", &Sound[SND_TRANS].On);\r
1141                         ReadIntValueFromReg(hKey4, "SndErrSw", &Sound[SND_ERROR].On);\r
1142                         ReadStringFromReg(hKey4, "SndCon", Sound[SND_CONNECT].Fname, FMAX_PATH+1);\r
1143                         ReadStringFromReg(hKey4, "SndTrn", Sound[SND_TRANS].Fname, FMAX_PATH+1);\r
1144                         ReadStringFromReg(hKey4, "SndErr", Sound[SND_ERROR].Fname, FMAX_PATH+1);\r
1145 \r
1146                         ReadMultiStringFromReg(hKey4, "DefAttr", DefAttrList, DEFATTRLIST_LEN+1);\r
1147 \r
1148                         ReadStringFromReg(hKey4, "Tmp", TmpPath, FMAX_PATH+1);\r
1149 \r
1150                         ReadBinaryFromReg(hKey4, "Hdlg", &HostDlgSize, sizeof(SIZE));\r
1151                         ReadBinaryFromReg(hKey4, "Bdlg", &BmarkDlgSize, sizeof(SIZE));\r
1152                         ReadBinaryFromReg(hKey4, "Mdlg", &MirrorDlgSize, sizeof(SIZE));\r
1153 \r
1154                         ReadIntValueFromReg(hKey4, "FAttrSw", &FolderAttr);\r
1155                         ReadIntValueFromReg(hKey4, "FAttr", &FolderAttrNum);\r
1156 \r
1157                         ReadIntValueFromReg(hKey4, "NoSave", &SuppressSave);\r
1158 \r
1159                         ReadIntValueFromReg(hKey4, "HistNum", &FileHist);\r
1160 //                      ReadMultiStringFromReg(hKey4, "Hist", Hist, (FMAX_PATH+1)*HISTORY_MAX+1);\r
1161 \r
1162                         /* ヒストリの設定を読み込む */\r
1163                         Sets = 0;\r
1164                         ReadIntValueFromReg(hKey4, "SavedHist", &Sets);\r
1165 \r
1166                         for(i = 0; i < Sets; i++)\r
1167                         {\r
1168                                 sprintf(Str, "History%d", i);\r
1169                                 if(OpenSubKey(hKey4, Str, &hKey5) == FFFTP_SUCCESS)\r
1170                                 {\r
1171                                         CopyDefaultHistory(&Hist);\r
1172 \r
1173                                         ReadStringFromReg(hKey5, "HostAdrs", Hist.HostAdrs, HOST_ADRS_LEN+1);\r
1174                                         ReadStringFromReg(hKey5, "UserName", Hist.UserName, USER_NAME_LEN+1);\r
1175                                         ReadStringFromReg(hKey5, "Account", Hist.Account, ACCOUNT_LEN+1);\r
1176                                         ReadStringFromReg(hKey5, "LocalDir", Hist.LocalInitDir, INIT_DIR_LEN+1);\r
1177                                         ReadStringFromReg(hKey5, "RemoteDir", Hist.RemoteInitDir, INIT_DIR_LEN+1);\r
1178                                         ReadStringFromReg(hKey5, "Chmod", Hist.ChmodCmd, CHMOD_CMD_LEN+1);\r
1179                                         ReadStringFromReg(hKey5, "Nlst", Hist.LsName, NLST_NAME_LEN+1);\r
1180                                         ReadStringFromReg(hKey5, "Init", Hist.InitCmd, INITCMD_LEN+1);\r
1181                                         ReadIntValueFromReg(hKey5, "Port", &Hist.Port);\r
1182                                         ReadIntValueFromReg(hKey5, "Kanji", &Hist.KanjiCode);\r
1183                                         ReadIntValueFromReg(hKey5, "KanaCnv", &Hist.KanaCnv);\r
1184                                         ReadIntValueFromReg(hKey5, "NameKanji", &Hist.NameKanjiCode);\r
1185                                         ReadIntValueFromReg(hKey5, "NameKana", &Hist.NameKanaCnv);\r
1186                                         ReadIntValueFromReg(hKey5, "Pasv", &Hist.Pasv);\r
1187                                         ReadIntValueFromReg(hKey5, "Fwall", &Hist.FireWall);\r
1188                                         ReadIntValueFromReg(hKey5, "List", &Hist.ListCmdOnly);\r
1189                                         ReadIntValueFromReg(hKey5, "NLST-R", &Hist.UseNLST_R);\r
1190                                         ReadIntValueFromReg(hKey5, "Tzone", &Hist.TimeZone);\r
1191                                         ReadIntValueFromReg(hKey5, "Type", &Hist.HostType);\r
1192                                         ReadIntValueFromReg(hKey5, "Sync", &Hist.SyncMove);\r
1193                                         ReadIntValueFromReg(hKey5, "Fpath", &Hist.NoFullPath);\r
1194                                         ReadBinaryFromReg(hKey5, "Sort", &Hist.Sort, sizeof(Hist.Sort));\r
1195                                         ReadIntValueFromReg(hKey5, "Secu", &Hist.Security);\r
1196                                         ReadIntValueFromReg(hKey5, "TrType", &Hist.Type);\r
1197                                         strcpy(Str, "");\r
1198                                         ReadStringFromReg(hKey5, "Password", Str, 255);\r
1199                                         DecodePassword(Str, Hist.PassWord);\r
1200                                         ReadIntValueFromReg(hKey5, "Dial", &Hist.Dialup);\r
1201                                         ReadIntValueFromReg(hKey5, "UseIt", &Hist.DialupAlways);\r
1202                                         ReadIntValueFromReg(hKey5, "Notify", &Hist.DialupNotify);\r
1203                                         ReadStringFromReg(hKey5, "DialTo", Hist.DialEntry, RAS_NAME_LEN+1);\r
1204                                         // 暗号化通信対応\r
1205                                         ReadIntValueFromReg(hKey5, "NoEncryption", &Hist.UseNoEncryption);\r
1206                                         ReadIntValueFromReg(hKey5, "FTPES", &Hist.UseFTPES);\r
1207                                         ReadIntValueFromReg(hKey5, "FTPIS", &Hist.UseFTPIS);\r
1208                                         ReadIntValueFromReg(hKey5, "SFTP", &Hist.UseSFTP);\r
1209                                         strcpy(Str, "");\r
1210                                         ReadStringFromReg(hKey5, "PKey", Str, PRIVATE_KEY_LEN*4+1);\r
1211                                         DecodePassword(Str, Hist.PrivateKey);\r
1212                                         ReadIntValueFromReg(hKey5, "NoWeak", &Hist.NoWeakEncryption);\r
1213                                         // 同時接続対応\r
1214                                         ReadIntValueFromReg(hKey5, "ThreadCount", &Hist.MaxThreadCount);\r
1215                                         ReadIntValueFromReg(hKey5, "ReuseCmdSkt", &Hist.ReuseCmdSkt);\r
1216                                         // MLSD対応\r
1217                                         ReadIntValueFromReg(hKey5, "MLSD", &Hist.UseMLSD);\r
1218                                         // IPv6対応\r
1219                                         ReadIntValueFromReg(hKey5, "NetType", &Hist.NetType);\r
1220                                         // 自動切断対策\r
1221                                         ReadIntValueFromReg(hKey5, "Noop", &Hist.NoopInterval);\r
1222                                         // 再転送対応\r
1223                                         ReadIntValueFromReg(hKey5, "ErrMode", &Hist.TransferErrorMode);\r
1224                                         ReadIntValueFromReg(hKey5, "ErrNotify", &Hist.TransferErrorNotify);\r
1225                                         // セッションあたりの転送量制限対策\r
1226                                         ReadIntValueFromReg(hKey5, "ErrReconnect", &Hist.TransferErrorReconnect);\r
1227 \r
1228                                         CloseSubKey(hKey5);\r
1229                                         AddHistoryToHistory(&Hist);\r
1230                                 }\r
1231                         }\r
1232 \r
1233                         // ホスト共通設定機能\r
1234                         if(OpenSubKey(hKey4, "DefaultHost", &hKey5) == FFFTP_SUCCESS)\r
1235                         {\r
1236                                 CopyDefaultDefaultHost(&Host);\r
1237                                 ReadIntValueFromReg(hKey5, "Set", &Host.Level);\r
1238                                 ReadStringFromReg(hKey5, "HostName", Host.HostName, HOST_NAME_LEN+1);\r
1239                                 ReadStringFromReg(hKey5, "HostAdrs", Host.HostAdrs, HOST_ADRS_LEN+1);\r
1240                                 ReadStringFromReg(hKey5, "UserName", Host.UserName, USER_NAME_LEN+1);\r
1241                                 ReadStringFromReg(hKey5, "Account", Host.Account, ACCOUNT_LEN+1);\r
1242                                 ReadStringFromReg(hKey5, "LocalDir", Host.LocalInitDir, INIT_DIR_LEN+1);\r
1243                                 ReadStringFromReg(hKey5, "RemoteDir", Host.RemoteInitDir, INIT_DIR_LEN+1);\r
1244                                 ReadStringFromReg(hKey5, "Chmod", Host.ChmodCmd, CHMOD_CMD_LEN+1);\r
1245                                 ReadStringFromReg(hKey5, "Nlst", Host.LsName, NLST_NAME_LEN+1);\r
1246                                 ReadStringFromReg(hKey5, "Init", Host.InitCmd, INITCMD_LEN+1);\r
1247                                 ReadIntValueFromReg(hKey5, "Port", &Host.Port);\r
1248                                 ReadIntValueFromReg(hKey5, "Anonymous", &Host.Anonymous);\r
1249                                 ReadIntValueFromReg(hKey5, "Kanji", &Host.KanjiCode);\r
1250                                 ReadIntValueFromReg(hKey5, "KanaCnv", &Host.KanaCnv);\r
1251                                 ReadIntValueFromReg(hKey5, "NameKanji", &Host.NameKanjiCode);\r
1252                                 ReadIntValueFromReg(hKey5, "NameKana", &Host.NameKanaCnv);\r
1253                                 ReadIntValueFromReg(hKey5, "Pasv", &Host.Pasv);\r
1254                                 ReadIntValueFromReg(hKey5, "Fwall", &Host.FireWall);\r
1255                                 ReadIntValueFromReg(hKey5, "List", &Host.ListCmdOnly);\r
1256                                 ReadIntValueFromReg(hKey5, "NLST-R", &Host.UseNLST_R);\r
1257                                 ReadIntValueFromReg(hKey5, "Last", &Host.LastDir);\r
1258                                 ReadIntValueFromReg(hKey5, "Tzone", &Host.TimeZone);\r
1259                                 ReadIntValueFromReg(hKey5, "Type", &Host.HostType);\r
1260                                 ReadIntValueFromReg(hKey5, "Sync", &Host.SyncMove);\r
1261                                 ReadIntValueFromReg(hKey5, "Fpath", &Host.NoFullPath);\r
1262                                 ReadBinaryFromReg(hKey5, "Sort", &Host.Sort, sizeof(Host.Sort));\r
1263                                 ReadIntValueFromReg(hKey5, "Secu", &Host.Security);\r
1264                                 if(Host.Anonymous != YES)\r
1265                                 {\r
1266                                         strcpy(Str, "");\r
1267                                         ReadStringFromReg(hKey5, "Password", Str, 255);\r
1268                                         DecodePassword(Str, Host.PassWord);\r
1269                                 }\r
1270                                 else\r
1271                                         strcpy(Host.PassWord, UserMailAdrs);\r
1272                                 ReadMultiStringFromReg(hKey5, "Bmarks", Host.BookMark, BOOKMARK_SIZE);\r
1273                                 ReadIntValueFromReg(hKey5, "Dial", &Host.Dialup);\r
1274                                 ReadIntValueFromReg(hKey5, "UseIt", &Host.DialupAlways);\r
1275                                 ReadIntValueFromReg(hKey5, "Notify", &Host.DialupNotify);\r
1276                                 ReadStringFromReg(hKey5, "DialTo", Host.DialEntry, RAS_NAME_LEN+1);\r
1277                                 ReadIntValueFromReg(hKey5, "NoEncryption", &Host.UseNoEncryption);\r
1278                                 ReadIntValueFromReg(hKey5, "FTPES", &Host.UseFTPES);\r
1279                                 ReadIntValueFromReg(hKey5, "FTPIS", &Host.UseFTPIS);\r
1280                                 ReadIntValueFromReg(hKey5, "SFTP", &Host.UseSFTP);\r
1281                                 strcpy(Str, "");\r
1282                                 ReadStringFromReg(hKey5, "PKey", Str, PRIVATE_KEY_LEN*4+1);\r
1283                                 DecodePassword(Str, Host.PrivateKey);\r
1284                                 ReadIntValueFromReg(hKey5, "NoWeak", &Host.NoWeakEncryption);\r
1285                                 ReadIntValueFromReg(hKey5, "ThreadCount", &Host.MaxThreadCount);\r
1286                                 ReadIntValueFromReg(hKey5, "ReuseCmdSkt", &Host.ReuseCmdSkt);\r
1287                                 ReadIntValueFromReg(hKey5, "MLSD", &Host.UseMLSD);\r
1288                                 ReadIntValueFromReg(hKey5, "NetType", &Host.NetType);\r
1289                                 ReadIntValueFromReg(hKey5, "Noop", &Host.NoopInterval);\r
1290                                 ReadIntValueFromReg(hKey5, "ErrMode", &Host.TransferErrorMode);\r
1291                                 ReadIntValueFromReg(hKey5, "ErrNotify", &Host.TransferErrorNotify);\r
1292                                 ReadIntValueFromReg(hKey5, "ErrReconnect", &Host.TransferErrorReconnect);\r
1293 \r
1294                                 CloseSubKey(hKey5);\r
1295 \r
1296                                 SetDefaultHost(&Host);\r
1297                         }\r
1298 \r
1299                         /* ホストの設定を読み込む */\r
1300                         Sets = 0;\r
1301                         ReadIntValueFromReg(hKey4, "SetNum", &Sets);\r
1302 \r
1303                         for(i = 0; i < Sets; i++)\r
1304                         {\r
1305                                 sprintf(Str, "Host%d", i);\r
1306                                 if(OpenSubKey(hKey4, Str, &hKey5) == FFFTP_SUCCESS)\r
1307                                 {\r
1308                                         CopyDefaultHost(&Host);\r
1309                                         /* 下位互換性のため */\r
1310                                         // SourceForge.JPによるフォーク\r
1311 //                                      if(Version < VER_NUM)\r
1312                                         if(Version < 1921)\r
1313                                         {\r
1314                                                 Host.Pasv = NO;\r
1315                                                 Host.ListCmdOnly = NO;\r
1316                                         }\r
1317                                         // 1.97b以前はデフォルトでShift_JIS\r
1318                                         if(Version < 1980)\r
1319                                                 Host.NameKanjiCode = KANJI_SJIS;\r
1320                                         ReadIntValueFromReg(hKey5, "Set", &Host.Level);\r
1321 \r
1322                                         ReadStringFromReg(hKey5, "HostName", Host.HostName, HOST_NAME_LEN+1);\r
1323                                         ReadStringFromReg(hKey5, "HostAdrs", Host.HostAdrs, HOST_ADRS_LEN+1);\r
1324                                         ReadStringFromReg(hKey5, "UserName", Host.UserName, USER_NAME_LEN+1);\r
1325                                         ReadStringFromReg(hKey5, "Account", Host.Account, ACCOUNT_LEN+1);\r
1326                                         ReadStringFromReg(hKey5, "LocalDir", Host.LocalInitDir, INIT_DIR_LEN+1);\r
1327                                         ReadStringFromReg(hKey5, "RemoteDir", Host.RemoteInitDir, INIT_DIR_LEN+1);\r
1328                                         ReadStringFromReg(hKey5, "Chmod", Host.ChmodCmd, CHMOD_CMD_LEN+1);\r
1329                                         ReadStringFromReg(hKey5, "Nlst", Host.LsName, NLST_NAME_LEN+1);\r
1330                                         ReadStringFromReg(hKey5, "Init", Host.InitCmd, INITCMD_LEN+1);\r
1331                                         ReadIntValueFromReg(hKey5, "Port", &Host.Port);\r
1332                                         ReadIntValueFromReg(hKey5, "Anonymous", &Host.Anonymous);\r
1333                                         ReadIntValueFromReg(hKey5, "Kanji", &Host.KanjiCode);\r
1334                                         // 1.98b以前のUTF-8はBOMあり\r
1335                                         if(Version < 1983)\r
1336                                         {\r
1337                                                 if(Host.KanjiCode == KANJI_UTF8N)\r
1338                                                         Host.KanjiCode = KANJI_UTF8BOM;\r
1339                                         }\r
1340                                         ReadIntValueFromReg(hKey5, "KanaCnv", &Host.KanaCnv);\r
1341                                         ReadIntValueFromReg(hKey5, "NameKanji", &Host.NameKanjiCode);\r
1342                                         ReadIntValueFromReg(hKey5, "NameKana", &Host.NameKanaCnv);\r
1343                                         ReadIntValueFromReg(hKey5, "Pasv", &Host.Pasv);\r
1344                                         ReadIntValueFromReg(hKey5, "Fwall", &Host.FireWall);\r
1345                                         ReadIntValueFromReg(hKey5, "List", &Host.ListCmdOnly);\r
1346                                         ReadIntValueFromReg(hKey5, "NLST-R", &Host.UseNLST_R);\r
1347                                         ReadIntValueFromReg(hKey5, "Last", &Host.LastDir);\r
1348                                         ReadIntValueFromReg(hKey5, "Tzone", &Host.TimeZone);\r
1349                                         ReadIntValueFromReg(hKey5, "Type", &Host.HostType);\r
1350                                         ReadIntValueFromReg(hKey5, "Sync", &Host.SyncMove);\r
1351                                         ReadIntValueFromReg(hKey5, "Fpath", &Host.NoFullPath);\r
1352                                         ReadBinaryFromReg(hKey5, "Sort", &Host.Sort, sizeof(Host.Sort));\r
1353                                         ReadIntValueFromReg(hKey5, "Secu", &Host.Security);\r
1354                                         if(Host.Anonymous != YES)\r
1355                                         {\r
1356                                                 strcpy(Str, "");\r
1357                                                 ReadStringFromReg(hKey5, "Password", Str, 255);\r
1358                                                 DecodePassword(Str, Host.PassWord);\r
1359                                         }\r
1360                                         else\r
1361                                                 strcpy(Host.PassWord, UserMailAdrs);\r
1362 \r
1363                                         ReadMultiStringFromReg(hKey5, "Bmarks", Host.BookMark, BOOKMARK_SIZE);\r
1364 \r
1365                                         ReadIntValueFromReg(hKey5, "Dial", &Host.Dialup);\r
1366                                         ReadIntValueFromReg(hKey5, "UseIt", &Host.DialupAlways);\r
1367                                         ReadIntValueFromReg(hKey5, "Notify", &Host.DialupNotify);\r
1368                                         ReadStringFromReg(hKey5, "DialTo", Host.DialEntry, RAS_NAME_LEN+1);\r
1369                                         // 暗号化通信対応\r
1370                                         ReadIntValueFromReg(hKey5, "NoEncryption", &Host.UseNoEncryption);\r
1371                                         ReadIntValueFromReg(hKey5, "FTPES", &Host.UseFTPES);\r
1372                                         ReadIntValueFromReg(hKey5, "FTPIS", &Host.UseFTPIS);\r
1373                                         ReadIntValueFromReg(hKey5, "SFTP", &Host.UseSFTP);\r
1374                                         strcpy(Str, "");\r
1375                                         ReadStringFromReg(hKey5, "PKey", Str, PRIVATE_KEY_LEN*4+1);\r
1376                                         DecodePassword(Str, Host.PrivateKey);\r
1377                                         ReadIntValueFromReg(hKey5, "NoWeak", &Host.NoWeakEncryption);\r
1378                                         // 同時接続対応\r
1379                                         ReadIntValueFromReg(hKey5, "ThreadCount", &Host.MaxThreadCount);\r
1380                                         ReadIntValueFromReg(hKey5, "ReuseCmdSkt", &Host.ReuseCmdSkt);\r
1381                                         // 1.98d以前で同時接続数が1より大きい場合はソケットの再利用なし\r
1382                                         if(Version < 1985)\r
1383                                         {\r
1384                                                 if(Host.MaxThreadCount > 1)\r
1385                                                         Host.ReuseCmdSkt = NO;\r
1386                                         }\r
1387                                         // MLSD対応\r
1388                                         ReadIntValueFromReg(hKey5, "MLSD", &Host.UseMLSD);\r
1389                                         // IPv6対応\r
1390                                         ReadIntValueFromReg(hKey5, "NetType", &Host.NetType);\r
1391                                         // 自動切断対策\r
1392                                         ReadIntValueFromReg(hKey5, "Noop", &Host.NoopInterval);\r
1393                                         // 再転送対応\r
1394                                         ReadIntValueFromReg(hKey5, "ErrMode", &Host.TransferErrorMode);\r
1395                                         ReadIntValueFromReg(hKey5, "ErrNotify", &Host.TransferErrorNotify);\r
1396                                         // セッションあたりの転送量制限対策\r
1397                                         ReadIntValueFromReg(hKey5, "ErrReconnect", &Host.TransferErrorReconnect);\r
1398 \r
1399                                         CloseSubKey(hKey5);\r
1400 \r
1401                                         AddHostToList(&Host, -1, Host.Level);\r
1402                                 }\r
1403                         }\r
1404 \r
1405                         ReadIntValueFromReg(hKey4, "CurSet", &Sets);\r
1406                         SetCurrentHost(Sets);\r
1407 \r
1408                         // 暗号化通信対応\r
1409                         ReadBinaryFromReg(hKey4, "CertCacheHash", &CertificateCacheHash, sizeof(CertificateCacheHash));\r
1410                         ReadStringFromReg(hKey4, "RootCertHash", Str, PRIVATE_KEY_LEN*4+1);\r
1411                         DecodePassword(Str, Buf);\r
1412                         StrReadIn(Buf, sizeof(SSLRootCAFileHash), (char*)&SSLRootCAFileHash);\r
1413                         // ファイルアイコン表示対応\r
1414                         ReadIntValueFromReg(hKey4, "ListIcon", &DispFileIcon);\r
1415                         // タイムスタンプのバグ修正\r
1416                         ReadIntValueFromReg(hKey4, "ListSecond", &DispTimeSeconds);\r
1417                         // ファイルの属性を数字で表示\r
1418                         ReadIntValueFromReg(hKey4, "ListPermitNum", &DispPermissionsNumber);\r
1419                         // ディレクトリ自動作成\r
1420                         ReadIntValueFromReg(hKey4, "MakeDir", &MakeAllDir);\r
1421                         // UTF-8対応\r
1422                         ReadIntValueFromReg(hKey4, "Kanji", &LocalKanjiCode);\r
1423                         // UPnP対応\r
1424                         ReadIntValueFromReg(hKey4, "UPnP", &UPnPEnabled);\r
1425                         // ローカル側自動更新\r
1426                         ReadIntValueFromReg(hKey4, "ListRefresh", &AutoRefreshFileList);\r
1427                         // 古い処理内容を消去\r
1428                         ReadIntValueFromReg(hKey4, "OldLog", &RemoveOldLog);\r
1429                         // ソフトウェア自動更新\r
1430                         ReadIntValueFromReg(hKey4, "UpdCheck", &AutoCheckForUpdates);\r
1431                         ReadIntValueFromReg(hKey4, "UpdApply", &AutoApplyUpdates);\r
1432                         ReadIntValueFromReg(hKey4, "UpdInterval", &AutoCheckForUptatesInterval);\r
1433                         ReadBinaryFromReg(hKey4, "UpdLastCheck", &LastAutoCheckForUpdates, sizeof(LastAutoCheckForUpdates));\r
1434                         // ファイル一覧バグ修正\r
1435                         ReadIntValueFromReg(hKey4, "AbortListErr", &AbortOnListError);\r
1436                         // ミラーリング設定追加\r
1437                         ReadIntValueFromReg(hKey4, "MirNoTransfer", &MirrorNoTransferContents);\r
1438 \r
1439                         CloseSubKey(hKey4);\r
1440                 }\r
1441                 // 全設定暗号化対応\r
1442                 EncryptSettings = NO;\r
1443                 if(Version >= 1990)\r
1444                 {\r
1445                         if(GetMasterPasswordStatus() == PASSWORD_OK)\r
1446                         {\r
1447                                 memset(&Checksum, 0, 20);\r
1448                                 ReadBinaryFromReg(hKey3, "EncryptAllChecksum", &Checksum, 20);\r
1449                                 if(memcmp(&Checksum, &EncryptSettingsChecksum, 20) != 0)\r
1450                                 {\r
1451                                         switch(DialogBox(GetFtpInst(), MAKEINTRESOURCE(corruptsettings_dlg), GetMainHwnd(), AnyButtonDialogProc))\r
1452                                         {\r
1453                                         case IDCANCEL:\r
1454                                                 Terminate();\r
1455                                                 break;\r
1456                                         case IDABORT:\r
1457                                                 CloseReg(hKey3);\r
1458                                                 ClearRegistry();\r
1459                                                 ClearIni();\r
1460                                                 Restart();\r
1461                                                 Terminate();\r
1462                                                 break;\r
1463                                         case IDRETRY:\r
1464                                                 EncryptSettingsError = YES;\r
1465                                                 break;\r
1466                                         case IDIGNORE:\r
1467                                                 break;\r
1468                                         }\r
1469                                 }\r
1470                         }\r
1471                 }\r
1472                 CloseReg(hKey3);\r
1473         }\r
1474         else\r
1475         {\r
1476                 /*===== 最初の起動時(設定が無い) =====*/\r
1477 \r
1478 #if 0\r
1479                 strcpy(UserMailAdrs, "");\r
1480                 strcpy(Str, "");\r
1481                 if(InputDialogBox(mailadrs_dlg, HWND_DESKTOP, NULL, Str, USER_MAIL_LEN+1, &i, IDH_HELP_TOPIC_0000001) == YES)\r
1482                         strcpy(UserMailAdrs, Str);\r
1483 \r
1484                 for(i = 0; i < SAMPLE_HOSTS; i++)\r
1485                 {\r
1486                         CopyDefaultHost(&Host);\r
1487                         Host.Level = Sample[i].Level;\r
1488                         strcpy(Host.PassWord, UserMailAdrs);\r
1489                         strcpy(Host.HostName, Sample[i].HostName);\r
1490                         strcpy(Host.HostAdrs, Sample[i].HostAdrs);\r
1491                         strcpy(Host.UserName, "anonymous");\r
1492                         AddHostToList(&Host, -1, Host.Level);\r
1493                 }\r
1494 #endif\r
1495         }\r
1496         return(Sts);\r
1497 }\r
1498 \r
1499 \r
1500 /*----- 隠しドライブ情報を取得 ------------------------------------------------\r
1501 *\r
1502 *       Parameter\r
1503 *               なし\r
1504 *\r
1505 *       Return Value\r
1506 *               DWORD \r
1507 *                       YES/NO=設定無し\r
1508 *----------------------------------------------------------------------------*/\r
1509 \r
1510 DWORD LoadHideDriveListRegistry(void)\r
1511 {\r
1512         HKEY hKey1;\r
1513         HKEY hKey2;\r
1514         HKEY hKey3;\r
1515         HKEY hKey4;\r
1516         HKEY hKey5;\r
1517         HKEY hKey6;\r
1518         DWORD Size;\r
1519         DWORD Type;\r
1520         DWORD Ret;\r
1521 \r
1522         Ret = 0;\r
1523         if(RegOpenKeyEx(HKEY_CURRENT_USER, "Software", 0, KEY_READ, &hKey1) == ERROR_SUCCESS)\r
1524         {\r
1525                 if(RegOpenKeyEx(hKey1, "Microsoft", 0, KEY_READ, &hKey2) == ERROR_SUCCESS)\r
1526                 {\r
1527                         if(RegOpenKeyEx(hKey2, "Windows", 0, KEY_READ, &hKey3) == ERROR_SUCCESS)\r
1528                         {\r
1529                                 if(RegOpenKeyEx(hKey3, "CurrentVersion", 0, KEY_READ, &hKey4) == ERROR_SUCCESS)\r
1530                                 {\r
1531                                         if(RegOpenKeyEx(hKey4, "Policies", 0, KEY_READ, &hKey5) == ERROR_SUCCESS)\r
1532                                         {\r
1533                                                 if(RegOpenKeyEx(hKey5, "Explorer", 0, KEY_READ, &hKey6) == ERROR_SUCCESS)\r
1534                                                 {\r
1535                                                         Size = sizeof(DWORD);\r
1536                                                         RegQueryValueEx(hKey6, "NoDrives", NULL, &Type, (BYTE *)&Ret, &Size);\r
1537                                                         RegCloseKey(hKey6);\r
1538                                                 }\r
1539                                                 RegCloseKey(hKey5);\r
1540                                         }\r
1541                                         RegCloseKey(hKey4);\r
1542                                 }\r
1543                                 RegCloseKey(hKey3);\r
1544                         }\r
1545                         RegCloseKey(hKey2);\r
1546                 }\r
1547                 RegCloseKey(hKey1);\r
1548         }\r
1549         return(Ret);\r
1550 }\r
1551 \r
1552 \r
1553 /*----- レジストリの設定値をクリア --------------------------------------------\r
1554 *\r
1555 *       Parameter\r
1556 *               なし\r
1557 *\r
1558 *       Return Value\r
1559 *               なし\r
1560 *----------------------------------------------------------------------------*/\r
1561 \r
1562 void ClearRegistry(void)\r
1563 {\r
1564         HKEY hKey2;\r
1565         HKEY hKey3;\r
1566         HKEY hKey4;\r
1567         DWORD Dispos;\r
1568         char Str[20];\r
1569         int i;\r
1570 \r
1571         if(RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\Sota", 0, "", REG_OPTION_NON_VOLATILE, KEY_CREATE_SUB_KEY, NULL, &hKey2, &Dispos) == ERROR_SUCCESS)\r
1572         {\r
1573                 if(RegCreateKeyEx(hKey2, "FFFTP", 0, "", REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey3, &Dispos) == ERROR_SUCCESS)\r
1574                 {\r
1575                         if(RegCreateKeyEx(hKey3, "Options", 0, "", REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey4, &Dispos) == ERROR_SUCCESS)\r
1576                         {\r
1577                                 for(i = 0; ; i++)\r
1578                                 {\r
1579                                         sprintf(Str, "Host%d", i);\r
1580                                         if(RegDeleteKey(hKey4, Str) != ERROR_SUCCESS)\r
1581                                                 break;\r
1582                                 }\r
1583                                 for(i = 0; ; i++)\r
1584                                 {\r
1585                                         sprintf(Str, "History%d", i);\r
1586                                         if(RegDeleteKey(hKey4, Str) != ERROR_SUCCESS)\r
1587                                                 break;\r
1588                                 }\r
1589                                 RegCloseKey(hKey4);\r
1590                         }\r
1591                         RegDeleteKey(hKey3, "Options");\r
1592                         // 全設定暗号化対応\r
1593                         if(RegCreateKeyEx(hKey3, "EncryptedOptions", 0, "", REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey4, &Dispos) == ERROR_SUCCESS)\r
1594                         {\r
1595                                 for(i = 0; ; i++)\r
1596                                 {\r
1597                                         sprintf(Str, "Host%d", i);\r
1598                                         if(RegDeleteKey(hKey4, Str) != ERROR_SUCCESS)\r
1599                                                 break;\r
1600                                 }\r
1601                                 for(i = 0; ; i++)\r
1602                                 {\r
1603                                         sprintf(Str, "History%d", i);\r
1604                                         if(RegDeleteKey(hKey4, Str) != ERROR_SUCCESS)\r
1605                                                 break;\r
1606                                 }\r
1607                                 RegCloseKey(hKey4);\r
1608                         }\r
1609                         RegDeleteKey(hKey3, "EncryptedOptions");\r
1610                         RegCloseKey(hKey3);\r
1611                 }\r
1612                 RegDeleteKey(hKey2, "FFFTP");\r
1613                 RegCloseKey(hKey2);\r
1614         }\r
1615         return;\r
1616 }\r
1617 \r
1618 \r
1619 // ポータブル版判定\r
1620 void ClearIni(void)\r
1621 {\r
1622 //      FILE *Strm;\r
1623 //      if((Strm = fopen(AskIniFilePath(), "rt")) != NULL)\r
1624 //      {\r
1625 //              fclose(Strm);\r
1626 //              MoveFileToTrashCan(AskIniFilePath());\r
1627 //      }\r
1628         DeleteFile(AskIniFilePath());\r
1629         return;\r
1630 }\r
1631 \r
1632 \r
1633 /*----- 設定をファイルに保存 --------------------------------------------------\r
1634 *\r
1635 *       Parameter\r
1636 *               なし\r
1637 *\r
1638 *       Return Value\r
1639 *               なし\r
1640 *----------------------------------------------------------------------------*/\r
1641 \r
1642 void SaveSettingsToFile(void)\r
1643 {\r
1644         char Tmp[FMAX_PATH*2];\r
1645         char Fname[FMAX_PATH+1];\r
1646         // 任意のコードが実行されるバグ修正\r
1647         char CurDir[FMAX_PATH+1];\r
1648         char SysDir[FMAX_PATH+1];\r
1649 \r
1650         if(RegType == REGTYPE_REG)\r
1651         {\r
1652                 strcpy(Fname, "FFFTP.reg");\r
1653                 if(SelectFile(GetMainHwnd(), Fname, MSGJPN286, MSGJPN287, "reg", OFN_EXTENSIONDIFFERENT | OFN_OVERWRITEPROMPT, 1) == TRUE)\r
1654                 {\r
1655                         sprintf(Tmp, "/e \x22%s\x22 HKEY_CURRENT_USER\\Software\\sota\\FFFTP", Fname);\r
1656                         // 任意のコードが実行されるバグ修正\r
1657 //                      if(ShellExecute(NULL, "open", "regedit", Tmp, ".", SW_SHOW) <= (HINSTANCE)32)\r
1658 //                      {\r
1659 //                              MessageBox(NULL, MSGJPN285, "FFFTP", MB_OK);\r
1660 //                      }\r
1661                         if(GetCurrentDirectory(FMAX_PATH, CurDir) > 0)\r
1662                         {\r
1663                                 if(GetSystemDirectory(SysDir, FMAX_PATH) > 0)\r
1664                                 {\r
1665                                         if(SetCurrentDirectory(SysDir))\r
1666                                         {\r
1667                                                 if(ShellExecute(NULL, "open", "regedit", Tmp, NULL, SW_SHOW) <= (HINSTANCE)32)\r
1668                                                 {\r
1669                                                         MessageBox(GetMainHwnd(), MSGJPN285, "FFFTP", MB_OK | MB_ICONERROR);\r
1670                                                 }\r
1671                                                 SetCurrentDirectory(CurDir);\r
1672                                         }\r
1673                                 }\r
1674                         }\r
1675                 }\r
1676         }\r
1677         else\r
1678         {\r
1679                 strcpy(Fname, "FFFTP-Backup.ini");\r
1680                 if(SelectFile(GetMainHwnd(), Fname, MSGJPN286, MSGJPN288, "ini", OFN_EXTENSIONDIFFERENT | OFN_OVERWRITEPROMPT, 1) == TRUE)\r
1681                 {\r
1682                         CopyFile(AskIniFilePath(), Fname, FALSE);\r
1683                 }\r
1684         }\r
1685         return;\r
1686 }\r
1687 \r
1688 \r
1689 /*----- 設定をファイルから復元 ------------------------------------------------\r
1690 *\r
1691 *       Parameter\r
1692 *               なし\r
1693 *\r
1694 *       Return Value\r
1695 *               int     ロードしたかどうか (YES/NO)\r
1696 *----------------------------------------------------------------------------*/\r
1697 \r
1698 int LoadSettingsFromFile(void)\r
1699 {\r
1700         int Ret;\r
1701         char Tmp[FMAX_PATH*2];\r
1702         char Fname[FMAX_PATH+1];\r
1703         // 任意のコードが実行されるバグ修正\r
1704         char CurDir[FMAX_PATH+1];\r
1705         char SysDir[FMAX_PATH+1];\r
1706 \r
1707         Ret = NO;\r
1708         strcpy(Fname, "");\r
1709         if(SelectFile(GetMainHwnd(), Fname, MSGJPN291, MSGJPN290, "", OFN_FILEMUSTEXIST, 0) == TRUE)\r
1710         {\r
1711                 if((strlen(Fname) >= 5) && (_stricmp(&Fname[strlen(Fname)-4], ".reg") == 0))\r
1712                 {\r
1713                         sprintf(Tmp, "\x22%s\x22", Fname);\r
1714                         // 任意のコードが実行されるバグ修正\r
1715 //                      if(ShellExecute(NULL, "open", "regedit", Tmp, ".", SW_SHOW) <= (HINSTANCE)32)\r
1716 //                      {\r
1717 //                              MessageBox(NULL, MSGJPN285, "FFFTP", MB_OK);\r
1718 //                      }\r
1719 //                      else\r
1720 //                      {\r
1721 //                              Ret = YES;\r
1722 //                              /* レジストリエディタが終了するのを待つ */\r
1723 //                              WaitForSingleObject(Info.hProcess, INFINITE);\r
1724 //                      }\r
1725                         if(GetCurrentDirectory(FMAX_PATH, CurDir) > 0)\r
1726                         {\r
1727                                 if(GetSystemDirectory(SysDir, FMAX_PATH) > 0)\r
1728                                 {\r
1729                                         if(SetCurrentDirectory(SysDir))\r
1730                                         {\r
1731                                                 if(ShellExecute(NULL, "open", "regedit", Tmp, NULL, SW_SHOW) <= (HINSTANCE)32)\r
1732                                                 {\r
1733                                                         MessageBox(GetMainHwnd(), MSGJPN285, "FFFTP", MB_OK | MB_ICONERROR);\r
1734                                                 }\r
1735                                                 else\r
1736                                                 {\r
1737                                                         Ret = YES;\r
1738                                                         /* レジストリエディタが終了するのを待つ */\r
1739 //                                                      WaitForSingleObject(Info.hProcess, INFINITE);\r
1740                                                 }\r
1741                                                 SetCurrentDirectory(CurDir);\r
1742                                         }\r
1743                                 }\r
1744                         }\r
1745                 }\r
1746                 else if((strlen(Fname) >= 5) && (_stricmp(&Fname[strlen(Fname)-4], ".ini") == 0))\r
1747                 {\r
1748                         CopyFile(Fname, AskIniFilePath(), FALSE);\r
1749                         Ret = YES;\r
1750                 }\r
1751                 else\r
1752                         // バグ修正\r
1753 //                      MessageBox(NULL, MSGJPN293, "FFFTP", MB_OK);\r
1754                         MessageBox(GetMainHwnd(), MSGJPN293, "FFFTP", MB_OK | MB_ICONERROR);\r
1755         }\r
1756         return(Ret);\r
1757 }\r
1758 \r
1759 \r
1760 \r
1761 \r
1762 /*----- レジストリ/INIファイルに文字列をセーブ --------------------------------\r
1763 *\r
1764 *       Parameter\r
1765 *               HKEY hKey : レジストリキー\r
1766 *               char *Key : キー名\r
1767 *               char *Str : セーブする文字列\r
1768 *               char *DefaultStr : デフォルトの文字列\r
1769 *\r
1770 *       Return Value\r
1771 *               なし\r
1772 *\r
1773 *       Note\r
1774 *               文字列がデフォルトの文字列と同じならセーブしない\r
1775 *----------------------------------------------------------------------------*/\r
1776 \r
1777 // バグ修正\r
1778 //static void SaveStr(HKEY hKey, char *Key, char *Str, char *DefaultStr)\r
1779 static void SaveStr(void *Handle, char *Key, char *Str, char *DefaultStr)\r
1780 {\r
1781         if((DefaultStr != NULL) && (strcmp(Str, DefaultStr) == 0))\r
1782 //              DeleteValue(hKey, Key);\r
1783                 DeleteValue(Handle, Key);\r
1784         else\r
1785 //              WriteStringToReg(hKey, Key, Str);\r
1786                 WriteStringToReg(Handle, Key, Str);\r
1787 \r
1788         return;\r
1789 }\r
1790 \r
1791 \r
1792 /*----- レジストリ/INIファイルに数値(INT)をセーブ -----------------------------\r
1793 *\r
1794 *       Parameter\r
1795 *               HKEY hKey : レジストリキー\r
1796 *               char *Key : キー名\r
1797 *               int Num : セーブする値\r
1798 *               int DefaultNum : デフォルトの値\r
1799 *\r
1800 *       Return Value\r
1801 *               なし\r
1802 *\r
1803 *       Note\r
1804 *               数値がデフォルトの値と同じならセーブしない\r
1805 *----------------------------------------------------------------------------*/\r
1806 \r
1807 // バグ修正\r
1808 //static void SaveIntNum(HKEY hKey, char *Key, int Num, int DefaultNum)\r
1809 static void SaveIntNum(void *Handle, char *Key, int Num, int DefaultNum)\r
1810 {\r
1811         if(Num == DefaultNum)\r
1812 //              DeleteValue(hKey, Key);\r
1813                 DeleteValue(Handle, Key);\r
1814         else\r
1815 //              WriteIntValueToReg(hKey, Key, Num);\r
1816                 WriteIntValueToReg(Handle, Key, Num);\r
1817 \r
1818         return;\r
1819 }\r
1820 \r
1821 \r
1822 /*----- LOGFONTデータを文字列に変換する ---------------------------------------\r
1823 *\r
1824 *       Parameter\r
1825 *               LOGFONT Font : フォントデータ\r
1826 *               HFONT hFont : フォントのハンドル\r
1827 *                       NULL = デフォルトのフォント\r
1828 *               char *Buf : バッファ\r
1829 *\r
1830 *       Return Value\r
1831 *               なし\r
1832 *----------------------------------------------------------------------------*/\r
1833 \r
1834 static void MakeFontData(LOGFONT Font, HFONT hFont, char *Buf)\r
1835 {\r
1836         *Buf = NUL;\r
1837         if(hFont != NULL)\r
1838                 sprintf(Buf, "%d %d %d %d %d %d %d %d %d %d %d %d %d %s",\r
1839                         Font.lfHeight, Font.lfWidth, Font.lfEscapement, Font.lfOrientation,\r
1840                         Font.lfWeight, Font.lfItalic, Font.lfUnderline, Font.lfStrikeOut,\r
1841                         Font.lfCharSet, Font.lfOutPrecision, Font.lfClipPrecision,\r
1842                         Font.lfQuality, Font.lfPitchAndFamily, Font.lfFaceName);\r
1843         return;\r
1844 }\r
1845 \r
1846 \r
1847 /*----- 文字列をLOGFONTデータに変換する ---------------------------------------\r
1848 *\r
1849 *       Parameter\r
1850 *               char *Str : 文字列\r
1851 *               LOGFONT *Font : フォントデータ\r
1852 *\r
1853 *       Return Value\r
1854 *               int ステータス\r
1855 *                       FFFTP_SUCCESS/FFFTP_FAIL=変換できない\r
1856 *----------------------------------------------------------------------------*/\r
1857 \r
1858 static int RestoreFontData(char *Str, LOGFONT *Font)\r
1859 {\r
1860         int i;\r
1861         int Sts;\r
1862 \r
1863         Sts = FFFTP_FAIL;\r
1864         if(sscanf(Str, "%d %d %d %d %d %d %d %d %d %d %d %d %d",\r
1865                         &(Font->lfHeight), &(Font->lfWidth), &(Font->lfEscapement), &(Font->lfOrientation),\r
1866                         &(Font->lfWeight), &(Font->lfItalic), &(Font->lfUnderline), &(Font->lfStrikeOut),\r
1867                         &(Font->lfCharSet), &(Font->lfOutPrecision), &(Font->lfClipPrecision),\r
1868                         &(Font->lfQuality), &(Font->lfPitchAndFamily)) == 13)\r
1869         {\r
1870                 for(i = 13; i > 0; i--)\r
1871                 {\r
1872                         if((Str = strchr(Str, ' ')) == NULL)\r
1873                                 break;\r
1874                         Str++;\r
1875                 }\r
1876                 if(i == 0)\r
1877                 {\r
1878                         strcpy(Font->lfFaceName, Str);\r
1879                         Sts = FFFTP_SUCCESS;\r
1880                 }\r
1881         }\r
1882 \r
1883         if(Sts == FFFTP_FAIL)\r
1884                 memset(Font, NUL, sizeof(LOGFONT));\r
1885 \r
1886         return(Sts);\r
1887 }\r
1888 \r
1889 /*----- パスワードを暗号化する ------------------------------------------------\r
1890 *\r
1891 *       Parameter\r
1892 *               char *Str : パスワード\r
1893 *               char *Buf : 暗号化したパスワードを格納するバッファ\r
1894 *\r
1895 *       Return Value\r
1896 *               なし\r
1897 *----------------------------------------------------------------------------*/\r
1898 static void EncodePassword(char *Str, char *Buf)\r
1899 {\r
1900         EncodePassword3( Str, Buf, SecretKey );\r
1901 }\r
1902 \r
1903 /*----- パスワードを暗号化する(オリジナルアルゴリズム)  ------------------\r
1904 *\r
1905 *       Parameter\r
1906 *               char *Str : パスワード\r
1907 *               char *Buf : 暗号化したパスワードを格納するバッファ\r
1908 *\r
1909 *       Return Value\r
1910 *               なし\r
1911 *----------------------------------------------------------------------------*/\r
1912 \r
1913 static void EncodePasswordOriginal(char *Str, char *Buf)\r
1914 {\r
1915         unsigned char *Get;\r
1916         unsigned char *Put;\r
1917         int Rnd;\r
1918         int Ch;\r
1919 \r
1920         srand((unsigned)time(NULL));\r
1921 \r
1922         Get = (unsigned char *)Str;\r
1923         Put = (unsigned char *)Buf;\r
1924         \r
1925         if( *Get == NUL ){\r
1926                 *Put = NUL;\r
1927                 return;\r
1928         }\r
1929 \r
1930         /* 識別子を先頭に置く */\r
1931         Put[0] = '0';\r
1932         Put[1] = 'A';\r
1933         Put += 2;\r
1934 \r
1935         while(*Get != NUL)\r
1936         {\r
1937                 Rnd = rand() % 3;\r
1938                 Ch = ((int)*Get++) << Rnd;\r
1939                 Ch = (unsigned char)Ch | (unsigned char)(Ch >> 8);\r
1940                 *Put++ = 0x40 | ((Rnd & 0x3) << 4) | (Ch & 0xF);\r
1941                 *Put++ = 0x40 | ((Ch >> 4) & 0xF);\r
1942                 if((*(Put-2) & 0x1) != 0)\r
1943                         *Put++ = (rand() % 62) + 0x40;\r
1944         }\r
1945         *Put = NUL;\r
1946         return;\r
1947 }\r
1948 \r
1949 /*----- パスワードを暗号化する(オリジナルアルゴリズム^Key)  ----------------\r
1950 *\r
1951 *       Parameter\r
1952 *               char *Str : パスワード\r
1953 *               char *Buf : 暗号化したパスワードを格納するバッファ\r
1954 *               const char *Key : 暗号化キー\r
1955 *\r
1956 *       Return Value\r
1957 *               なし\r
1958 *----------------------------------------------------------------------------*/\r
1959 \r
1960 static void EncodePassword2(char *Str, char *Buf, const char* Key)\r
1961 {\r
1962         unsigned char *Get;\r
1963         unsigned char *Put;\r
1964         int Rnd;\r
1965         int Ch;\r
1966 \r
1967         /* 2010.01.31 genta Key */\r
1968         unsigned char *KeyHead = (unsigned char *)Key;\r
1969         unsigned char *KeyEnd = KeyHead + strlen(KeyHead);\r
1970         unsigned char *KeyCurrent = KeyHead;\r
1971 \r
1972         srand((unsigned)time(NULL));\r
1973 \r
1974         Get = (unsigned char *)Str;\r
1975         Put = (unsigned char *)Buf;\r
1976         \r
1977         if( *Get == NUL ){\r
1978                 *Put = NUL;\r
1979                 return;\r
1980         }\r
1981 \r
1982         /* 識別子を先頭に置く */\r
1983         Put[0] = '0';\r
1984         Put[1] = 'B';\r
1985         Put += 2;\r
1986 \r
1987         while(*Get != NUL)\r
1988         {\r
1989                 Rnd = rand() % 3;\r
1990                 Ch = ((int)(*Get++ ^ *KeyCurrent)) << Rnd;\r
1991                 Ch = (unsigned char)Ch | (unsigned char)(Ch >> 8);\r
1992                 *Put++ = 0x40 | ((Rnd & 0x3) << 4) | (Ch & 0xF);\r
1993                 *Put++ = 0x40 | ((Ch >> 4) & 0xF);\r
1994                 if((*(Put-2) & 0x1) != 0)\r
1995                         *Put++ = (rand() % 62) + 0x40;\r
1996 \r
1997                 /* 2010.01.31 genta Key */\r
1998                 if( ++KeyCurrent == KeyEnd ){\r
1999                         KeyCurrent = KeyHead;\r
2000                 }\r
2001         }\r
2002         *Put = NUL;\r
2003         return;\r
2004 }\r
2005 \r
2006 /*----- パスワードを暗号化する(AES) ------------------------------------------\r
2007 *\r
2008 *       Parameter\r
2009 *               char *Str : パスワード\r
2010 *               char *Buf : 暗号化したパスワードを格納するバッファ\r
2011 *               const char *Key : 暗号化キー\r
2012 *\r
2013 *       Return Value\r
2014 *               なし\r
2015 *----------------------------------------------------------------------------*/\r
2016 \r
2017 static void EncodePassword3(char *Str, char *Buf, const char *Key)\r
2018 {\r
2019         unsigned char *Put;\r
2020         unsigned char *AesEncBuf;\r
2021         unsigned char *StrPadBuf;\r
2022         size_t StrLen;\r
2023         size_t StrPadLen;\r
2024         size_t StrPadIndex;\r
2025         size_t IvIndex;\r
2026         size_t EncBufIndex;\r
2027         DWORD RandValue;\r
2028         int RandByteCount;\r
2029         unsigned char AesKey[32];\r
2030         unsigned char AesCbcIv[AES_BLOCK_SIZE];\r
2031         aes_encrypt_ctx Ctx;\r
2032 \r
2033         Buf[0] = NUL;\r
2034 \r
2035         Put = (unsigned char *)Buf;\r
2036         StrLen = strlen(Str);\r
2037         StrPadLen = ((StrLen + AES_BLOCK_SIZE - 1) / AES_BLOCK_SIZE) * AES_BLOCK_SIZE;\r
2038 \r
2039         /* 最低長を32文字とする */\r
2040 //      StrPadLen = min1(StrPadLen, AES_BLOCK_SIZE * 2);\r
2041         StrPadLen = max1(StrPadLen, AES_BLOCK_SIZE * 2);\r
2042 \r
2043         if((StrPadBuf = malloc(StrPadLen)) != NULL)\r
2044         {\r
2045                 if((AesEncBuf = malloc(StrPadLen)) != NULL)\r
2046                 {\r
2047                         BOOL PutState;\r
2048 \r
2049                         PutState = FALSE;\r
2050                         strncpy(StrPadBuf, Str, StrPadLen);\r
2051                         \r
2052                         /* PAD部分を乱数で埋める StrPad[StrLen](が有効な場合) は NUL */\r
2053                         for(StrPadIndex = StrLen + 1; StrPadIndex < StrPadLen;)\r
2054                         {\r
2055                                 RandValue = GetRandamDWORDValue();\r
2056                                 for(RandByteCount = 0; RandByteCount < 4; RandByteCount++)\r
2057                                 {\r
2058                                         if(StrPadIndex < StrPadLen)\r
2059                                         {\r
2060                                                 StrPadBuf[StrPadIndex++] = (unsigned char)(RandValue & 0xff);\r
2061                                                 RandValue >>= 8;\r
2062                                         }\r
2063                                 }\r
2064                         }\r
2065                         \r
2066                         // IVの初期化\r
2067                         for(IvIndex = 0; IvIndex < AES_BLOCK_SIZE;)\r
2068                         {\r
2069                                 RandValue = GetRandamDWORDValue();\r
2070                                 for(RandByteCount = 0; RandByteCount < 4; RandByteCount++)\r
2071                                 {\r
2072                                         if(IvIndex < AES_BLOCK_SIZE)\r
2073                                         {\r
2074                                                 AesCbcIv[IvIndex++] = (unsigned char)(RandValue & 0xff);\r
2075                                                 RandValue >>= 8;\r
2076                                         }\r
2077                                 }\r
2078                         }\r
2079                         Put[0] = '0';\r
2080                         Put[1] = 'C';\r
2081                         Put += 2;\r
2082                         for(IvIndex = 0; IvIndex < AES_BLOCK_SIZE; IvIndex++)\r
2083                         {\r
2084                                 sprintf(Put, "%02x", AesCbcIv[IvIndex]);\r
2085                                 Put += 2;\r
2086                         }\r
2087                         *Put++ = ':';\r
2088 \r
2089                         if(CreateAesKey(AesKey, Key) == FFFTP_SUCCESS)\r
2090                         {\r
2091                                 aes_encrypt_key(AesKey, 32, &Ctx);\r
2092 \r
2093                                 if(aes_cbc_encrypt(StrPadBuf, AesEncBuf, StrPadLen, AesCbcIv, &Ctx) == EXIT_SUCCESS)\r
2094                                 {\r
2095                                         for(EncBufIndex = 0; EncBufIndex < StrPadLen; EncBufIndex++)\r
2096                                         {\r
2097                                                 sprintf(Put, "%02x", AesEncBuf[EncBufIndex]);\r
2098                                                 Put += 2;\r
2099                                         }\r
2100                                         *Put = NUL;\r
2101                                         PutState = TRUE;\r
2102                                 }\r
2103                         }\r
2104                         if(FALSE == PutState)\r
2105                         {\r
2106                                 Buf[0] = NUL;\r
2107                         }\r
2108                         free(StrPadBuf);\r
2109                 }\r
2110                 free(AesEncBuf);\r
2111         }\r
2112         return;\r
2113 }\r
2114 \r
2115 \r
2116 /*----- パスワードの暗号化を解く ----------------------------------------------\r
2117 *\r
2118 *       Parameter\r
2119 *               char *Str : 暗号化したパスワード\r
2120 *               char *Buf : パスワードを格納するバッファ\r
2121 *\r
2122 *       Return Value\r
2123 *               なし\r
2124 *----------------------------------------------------------------------------*/\r
2125 \r
2126 static void DecodePassword(char *Str, char *Buf)\r
2127 {\r
2128         unsigned char *Get;\r
2129         unsigned char *Put;\r
2130 \r
2131         Get = (unsigned char *)Str;\r
2132         Put = (unsigned char *)Buf;\r
2133         \r
2134         if( *Get == NUL ){\r
2135                 *Put = NUL;\r
2136         }\r
2137         else if( 0x40 <= *Get && *Get < 0x80 ){\r
2138                 /* Original algorithm */\r
2139                 DecodePasswordOriginal( Str, Buf );\r
2140         }\r
2141         else if( strncmp( Get, "0A", 2 ) == 0 ){\r
2142                 DecodePasswordOriginal( Str + 2, Buf );\r
2143         }\r
2144         else if( strncmp( Get, "0B", 2 ) == 0 ){\r
2145                 DecodePassword2( Str + 2, Buf, SecretKey );\r
2146         }\r
2147         else if( strncmp( Get, "0C", 2 ) == 0 ){\r
2148                 DecodePassword3( Str + 2, Buf, SecretKey );\r
2149         }\r
2150         else {\r
2151                 //      unknown encoding\r
2152                 *Put = NUL;\r
2153                 return;\r
2154         }\r
2155 }\r
2156 \r
2157 /*----- パスワードの暗号化を解く(オリジナルアルゴリズム) -------------------\r
2158 *\r
2159 *       Parameter\r
2160 *               char *Str : 暗号化したパスワード\r
2161 *               char *Buf : パスワードを格納するバッファ\r
2162 *\r
2163 *       Return Value\r
2164 *               なし\r
2165 *----------------------------------------------------------------------------*/\r
2166 static void DecodePasswordOriginal(char *Str, char *Buf)\r
2167 {\r
2168         unsigned char *Get;\r
2169         unsigned char *Put;\r
2170         int Rnd;\r
2171         int Ch;\r
2172 \r
2173         Get = (unsigned char *)Str;\r
2174         Put = (unsigned char *)Buf;\r
2175 \r
2176         while(*Get != NUL)\r
2177         {\r
2178                 Rnd = ((unsigned int)*Get >> 4) & 0x3;\r
2179                 Ch = (*Get & 0xF) | ((*(Get+1) & 0xF) << 4);\r
2180                 Ch <<= 8;\r
2181                 if((*Get & 0x1) != 0)\r
2182                         Get++;\r
2183                 Get += 2;\r
2184                 Ch >>= Rnd;\r
2185                 Ch = (Ch & 0xFF) | ((Ch >> 8) & 0xFF);\r
2186                 *Put++ = Ch;\r
2187         }\r
2188         *Put = NUL;\r
2189         return;\r
2190 }\r
2191 \r
2192 /*----- パスワードの暗号化を解く(オリジナルアルゴリズム^Key) -------------------\r
2193 *\r
2194 *       Parameter\r
2195 *               char *Str : 暗号化したパスワード\r
2196 *               char *Buf : パスワードを格納するバッファ\r
2197 *               const char *Key : 暗号化キー\r
2198 *\r
2199 *       Return Value\r
2200 *               なし\r
2201 *----------------------------------------------------------------------------*/\r
2202 static void DecodePassword2(char *Str, char *Buf, const char* Key)\r
2203 {\r
2204         int Rnd;\r
2205         int Ch;\r
2206         unsigned char *Get = (unsigned char *)Str;\r
2207         unsigned char *Put = (unsigned char *)Buf;\r
2208 \r
2209         /* 2010.01.31 genta Key */\r
2210         unsigned char *KeyHead = (unsigned char *)Key;\r
2211         unsigned char *KeyEnd = KeyHead + strlen(KeyHead);\r
2212         unsigned char *KeyCurrent = KeyHead;\r
2213 \r
2214         while(*Get != NUL)\r
2215         {\r
2216                 Rnd = ((unsigned int)*Get >> 4) & 0x3;\r
2217                 Ch = (*Get & 0xF) | ((*(Get+1) & 0xF) << 4);\r
2218                 Ch <<= 8;\r
2219                 if((*Get & 0x1) != 0)\r
2220                         Get++;\r
2221                 Get += 2;\r
2222                 Ch >>= Rnd;\r
2223                 Ch = (Ch & 0xFF) | ((Ch >> 8) & 0xFF);\r
2224                 *Put++ = Ch ^ *KeyCurrent;\r
2225                 \r
2226                 /* 2010.01.31 genta Key */\r
2227                 if( ++KeyCurrent == KeyEnd ){\r
2228                         KeyCurrent = KeyHead;\r
2229                 }\r
2230         }\r
2231         *Put = NUL;\r
2232         return;\r
2233 }\r
2234 \r
2235 /*----- パスワードの暗号化を解く(AES) ---------------------------------------\r
2236 *\r
2237 *       Parameter\r
2238 *               char *Str : 暗号化したパスワード\r
2239 *               char *Buf : パスワードを格納するバッファ\r
2240 *               const char *Key : 暗号化キー\r
2241 *\r
2242 *       Return Value\r
2243 *               なし\r
2244 *----------------------------------------------------------------------------*/\r
2245 \r
2246 static void DecodePassword3(char *Str, char *Buf, const char *Key)\r
2247 {\r
2248         char *Get;\r
2249         unsigned char *EncBuf;\r
2250         size_t StrLen;\r
2251         size_t IvIndex;\r
2252         size_t EncBufIndex;\r
2253         size_t EncBufLen;\r
2254         unsigned char AesKey[32];\r
2255         unsigned char AesCbcIv[AES_BLOCK_SIZE];\r
2256         aes_decrypt_ctx Ctx;\r
2257 \r
2258         Buf[0] = NUL;\r
2259 \r
2260         Get = Str;\r
2261         StrLen = strlen(Str);\r
2262 \r
2263         if(AES_BLOCK_SIZE * 2 + 1 < StrLen)\r
2264         {\r
2265 \r
2266                 EncBufLen = (StrLen - 1 ) / 2 - AES_BLOCK_SIZE;\r
2267                 if((EncBuf = malloc(EncBufLen)) != NULL)\r
2268                 {\r
2269                         for(IvIndex = 0; IvIndex < AES_BLOCK_SIZE; IvIndex++)\r
2270                         {\r
2271                                 AesCbcIv[IvIndex]  = hex2bin(*Get++) << 4;\r
2272                                 AesCbcIv[IvIndex] |= hex2bin(*Get++);\r
2273                         }\r
2274 \r
2275                         if(*Get++ == ':')\r
2276                         {\r
2277                                 if(CreateAesKey(AesKey, Key) == FFFTP_SUCCESS)\r
2278                                 {\r
2279                                         aes_decrypt_key(AesKey, 32, &Ctx);\r
2280 \r
2281                                         for(EncBufIndex = 0; EncBufIndex < EncBufLen; EncBufIndex++)\r
2282                                         {\r
2283                                                 EncBuf[EncBufIndex]  = hex2bin(*Get++) << 4;\r
2284                                                 EncBuf[EncBufIndex] |= hex2bin(*Get++);\r
2285                                         }\r
2286                                         if(aes_cbc_decrypt(EncBuf, Buf, EncBufLen, AesCbcIv, &Ctx) == EXIT_SUCCESS)\r
2287                                         {\r
2288                                                 Buf[EncBufLen] = NUL;\r
2289                                         }\r
2290                                 }\r
2291                         }\r
2292                         free(EncBuf);\r
2293                 }\r
2294         }\r
2295         return;\r
2296 }\r
2297 \r
2298 /*----- AES用固定長キーを作成 ----------------------------------------------\r
2299 *\r
2300 *       Parameter\r
2301 *               unsigned char *AesKey : AES暗号鍵\r
2302 *               const char *Key : 暗号化キー\r
2303 *\r
2304 *       Return Value\r
2305 *               int ステータス (FFFTP_SUCCESS/FFFTP_FAIL)\r
2306 *       Note\r
2307 *               SHA-1をもちいて32Byte鍵を生成する\r
2308 *----------------------------------------------------------------------------*/\r
2309 \r
2310 static int CreateAesKey(unsigned char *AesKey, const char* Key)\r
2311 {\r
2312         char* HashKey;\r
2313         uint32 HashKeyLen;\r
2314         uint32 results[10];\r
2315         int ByteOffset;\r
2316         int KeyIndex;\r
2317         int ResIndex;\r
2318 \r
2319         HashKeyLen = strlen(Key) + 16;\r
2320         if((HashKey = malloc(HashKeyLen + 1)) == NULL){\r
2321                 return (FFFTP_FAIL);\r
2322         }\r
2323 \r
2324         strcpy(HashKey, Key);\r
2325         strcat(HashKey, ">g^r=@N7=//z<[`:");\r
2326     sha_memory((uchar *)HashKey, HashKeyLen, results);\r
2327 \r
2328         strcpy(HashKey, Key);\r
2329         strcat(HashKey, "VG77dO1#EyC]$|C@");\r
2330     sha_memory((uchar *)HashKey, HashKeyLen, results + 5);\r
2331 \r
2332         KeyIndex = 0;\r
2333         ResIndex = 0;\r
2334         while(ResIndex < 8){\r
2335                 for(ByteOffset = 0; ByteOffset < 4; ByteOffset++){\r
2336                         AesKey[KeyIndex++] = (results[ResIndex] >> ByteOffset * 8) & 0xff;\r
2337                 }\r
2338                 ResIndex++;\r
2339         }\r
2340         free(HashKey);\r
2341 \r
2342         return (FFFTP_SUCCESS);\r
2343 }\r
2344 \r
2345 \r
2346 /*===== レジストリとINIファイルのアクセス処理 ============*/\r
2347 \r
2348 \r
2349 /*===== INIファイル用のレジストリデータ =====*/\r
2350 \r
2351 typedef struct regdatatbl {\r
2352         char KeyName[80+1];                     /* キー名 */\r
2353         char ValTbl[REG_SECT_MAX];      /* 値のテーブル */\r
2354         int ValLen;                                     /* 値データのバイト数 */\r
2355         int Mode;                                       /* キーのモード */\r
2356         struct regdatatbl *Next;\r
2357 } REGDATATBL;\r
2358 \r
2359 // 全設定暗号化対応\r
2360 typedef struct regdatatbl_reg {\r
2361         char KeyName[80+1];                     /* キー名 */\r
2362         HKEY hKey;\r
2363 } REGDATATBL_REG;\r
2364 \r
2365 /*===== プロトタイプ =====*/\r
2366 \r
2367 static BOOL WriteOutRegToFile(REGDATATBL *Pos);\r
2368 static int ReadInReg(char *Name, REGDATATBL **Handle);\r
2369 // 暗号化通信対応\r
2370 //static int StrCatOut(char *Src, int Len, char *Dst);\r
2371 //static int StrReadIn(char *Src, int Max, char *Dst);\r
2372 static char *ScanValue(void *Handle, char *Name);\r
2373 \r
2374 \r
2375 /*===== ローカルなワーク =====*/\r
2376 \r
2377 static int TmpRegType;\r
2378 \r
2379 \r
2380 \r
2381 /*----- レジストリのタイプを設定する ------------------------------------------\r
2382 *\r
2383 *       Parameter\r
2384 *               int Type : タイプ (REGTYPE_xxx)\r
2385 *\r
2386 *       Return Value\r
2387 *               int ステータス\r
2388 *                       FFFTP_SUCCESS/FFFTP_FAIL\r
2389 *----------------------------------------------------------------------------*/\r
2390 \r
2391 static void SetRegType(int Type)\r
2392 {\r
2393         TmpRegType = Type;\r
2394         return;\r
2395 }\r
2396 \r
2397 \r
2398 /*----- レジストリ/INIファイルをオープンする(読み込み)-----------------------\r
2399 *\r
2400 *       Parameter\r
2401 *               char *Name : レジストリ名\r
2402 *               void **Handle : ハンドルを返すワーク\r
2403 *\r
2404 *       Return Value\r
2405 *               int ステータス\r
2406 *                       FFFTP_SUCCESS/FFFTP_FAIL\r
2407 *----------------------------------------------------------------------------*/\r
2408 \r
2409 static int OpenReg(char *Name, void **Handle)\r
2410 {\r
2411         int Sts;\r
2412         char Tmp[FMAX_PATH+1];\r
2413 \r
2414         Sts = FFFTP_FAIL;\r
2415         if(TmpRegType == REGTYPE_REG)\r
2416         {\r
2417                 // 全設定暗号化対応\r
2418 //              strcpy(Tmp, "Software\\Sota\\");\r
2419 //              strcat(Tmp, Name);\r
2420 //              if(RegOpenKeyEx(HKEY_CURRENT_USER, Tmp, 0, KEY_READ, (HKEY *)Handle) == ERROR_SUCCESS)\r
2421 //                      Sts = FFFTP_SUCCESS;\r
2422                 if((*Handle = malloc(sizeof(REGDATATBL_REG))) != NULL)\r
2423                 {\r
2424                         strcpy(((REGDATATBL_REG *)(*Handle))->KeyName, Name);\r
2425                         strcpy(Tmp, "Software\\Sota\\");\r
2426                         strcat(Tmp, Name);\r
2427                         if(RegOpenKeyEx(HKEY_CURRENT_USER, Tmp, 0, KEY_READ, &(((REGDATATBL_REG *)(*Handle))->hKey)) == ERROR_SUCCESS)\r
2428                                 Sts = FFFTP_SUCCESS;\r
2429                         if(Sts != FFFTP_SUCCESS)\r
2430                                 free(*Handle);\r
2431                 }\r
2432         }\r
2433         else\r
2434         {\r
2435                 if((Sts = ReadInReg(Name, (REGDATATBL **)Handle)) == FFFTP_SUCCESS)\r
2436                         ((REGDATATBL *)(*Handle))->Mode = 0;\r
2437         }\r
2438         return(Sts);\r
2439 }\r
2440 \r
2441 \r
2442 /*----- レジストリ/INIファイルを作成する(書き込み)---------------------------\r
2443 *\r
2444 *       Parameter\r
2445 *               char *Name : レジストリ名\r
2446 *               void **Handle : ハンドルを返すワーク\r
2447 *\r
2448 *       Return Value\r
2449 *               int ステータス\r
2450 *                       FFFTP_SUCCESS/FFFTP_FAIL\r
2451 *----------------------------------------------------------------------------*/\r
2452 \r
2453 static int CreateReg(char *Name, void **Handle)\r
2454 {\r
2455         int Sts;\r
2456         char Tmp[FMAX_PATH+1];\r
2457         DWORD Dispos;\r
2458 \r
2459         Sts = FFFTP_FAIL;\r
2460         if(TmpRegType == REGTYPE_REG)\r
2461         {\r
2462                 // 全設定暗号化対応\r
2463 //              strcpy(Tmp, "Software\\Sota\\");\r
2464 //              strcat(Tmp, Name);\r
2465 //              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
2466 //                      Sts = FFFTP_SUCCESS;\r
2467                 if((*Handle = malloc(sizeof(REGDATATBL_REG))) != NULL)\r
2468                 {\r
2469                         strcpy(((REGDATATBL_REG *)(*Handle))->KeyName, Name);\r
2470                         strcpy(Tmp, "Software\\Sota\\");\r
2471                         strcat(Tmp, Name);\r
2472                         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
2473                                 Sts = FFFTP_SUCCESS;\r
2474                         if(Sts != FFFTP_SUCCESS)\r
2475                                 free(*Handle);\r
2476                 }\r
2477         }\r
2478         else\r
2479         {\r
2480                 if((*Handle = malloc(sizeof(REGDATATBL))) != NULL)\r
2481                 {\r
2482                         strcpy(((REGDATATBL *)(*Handle))->KeyName, Name);\r
2483                         ((REGDATATBL *)(*Handle))->ValLen = 0;\r
2484                         ((REGDATATBL *)(*Handle))->Next = NULL;\r
2485                         ((REGDATATBL *)(*Handle))->Mode = 1;\r
2486                         Sts = FFFTP_SUCCESS;\r
2487                 }\r
2488         }\r
2489         return(Sts);\r
2490 }\r
2491 \r
2492 \r
2493 /*----- レジストリ/INIファイルをクローズする ----------------------------------\r
2494 *\r
2495 *       Parameter\r
2496 *               void *Handle : ハンドル\r
2497 *\r
2498 *       Return Value\r
2499 *               int ステータス\r
2500 *                       FFFTP_SUCCESS/FFFTP_FAIL\r
2501 *----------------------------------------------------------------------------*/\r
2502 \r
2503 static int CloseReg(void *Handle)\r
2504 {\r
2505         REGDATATBL *Pos;\r
2506         REGDATATBL *Next;\r
2507         // ポータブル版判定\r
2508 //      FILE *Strm;\r
2509 \r
2510         if(TmpRegType == REGTYPE_REG)\r
2511         {\r
2512                 // 全設定暗号化対応\r
2513 //              RegCloseKey(Handle);\r
2514                 RegCloseKey(((REGDATATBL_REG *)Handle)->hKey);\r
2515                 free(Handle);\r
2516 \r
2517                 /* INIファイルを削除 */\r
2518                 // ポータブル版判定\r
2519 //              if((Strm = fopen(AskIniFilePath(), "rt")) != NULL)\r
2520 //              {\r
2521 //                      fclose(Strm);\r
2522 //                      MoveFileToTrashCan(AskIniFilePath());\r
2523 //              }\r
2524         }\r
2525         else\r
2526         {\r
2527                 if(((REGDATATBL *)Handle)->Mode == 1)\r
2528                 {\r
2529                         if(WriteOutRegToFile(Handle) == TRUE)\r
2530                         {\r
2531 //                              /* レジストリをクリア */\r
2532 //                              ClearRegistry();\r
2533                         }\r
2534                 }\r
2535                 /* テーブルを削除 */\r
2536                 Pos = Handle;\r
2537                 while(Pos != NULL)\r
2538                 {\r
2539                         Next = Pos->Next;\r
2540                         free(Pos);\r
2541                         Pos = Next;\r
2542                 }\r
2543         }\r
2544         return(FFFTP_SUCCESS);\r
2545 }\r
2546 \r
2547 \r
2548 /*----- レジストリ情報をINIファイルに書き込む ---------------------------------\r
2549 *\r
2550 *       Parameter\r
2551 *               REGDATATBL *Pos : レジストリデータ\r
2552 *\r
2553 *       Return Value\r
2554 *               なし\r
2555 *----------------------------------------------------------------------------*/\r
2556 \r
2557 static BOOL WriteOutRegToFile(REGDATATBL *Pos)\r
2558 {\r
2559         FILE *Strm;\r
2560         char *Disp;\r
2561         BOOL Ret;\r
2562 \r
2563         Ret = FALSE;\r
2564         if((Strm = fopen(AskIniFilePath(), "wt")) != NULL)\r
2565         {\r
2566                 fprintf(Strm, MSGJPN239);\r
2567                 while(Pos != NULL)\r
2568                 {\r
2569                         fprintf(Strm, "\n[%s]\n", Pos->KeyName);\r
2570 \r
2571                         Disp = Pos->ValTbl;\r
2572                         while(Disp < (Pos->ValTbl + Pos->ValLen))\r
2573                         {\r
2574                                 fprintf(Strm, "%s\n", Disp);\r
2575                                 Disp = Disp + strlen(Disp) + 1;\r
2576                         }\r
2577                         Pos = Pos->Next;\r
2578                 }\r
2579                 fclose(Strm);\r
2580                 Ret = TRUE;\r
2581         }\r
2582         else\r
2583                 // バグ修正\r
2584 //              MessageBox(NULL, MSGJPN240, "FFFTP", MB_OK);\r
2585                 MessageBox(GetMainHwnd(), MSGJPN240, "FFFTP", MB_OK | MB_ICONERROR);\r
2586 \r
2587         return(Ret);\r
2588 }\r
2589 \r
2590 \r
2591 /*----- INIファイルからレジストリ情報を読み込む -------------------------------\r
2592 *\r
2593 *       Parameter\r
2594 *               char *Name : 名前\r
2595 *               void *Handle : ハンドル\r
2596 *\r
2597 *       Return Value\r
2598 *               int ステータス\r
2599 *                       FFFTP_SUCCESS/FFFTP_FAIL\r
2600 *----------------------------------------------------------------------------*/\r
2601 \r
2602 static int ReadInReg(char *Name, REGDATATBL **Handle)\r
2603 {\r
2604         FILE *Strm;\r
2605         char *Buf;\r
2606         char *Tmp;\r
2607         char *Data;\r
2608         REGDATATBL *New;\r
2609         REGDATATBL *Pos;\r
2610         int Sts;\r
2611 \r
2612         Sts = FFFTP_FAIL;\r
2613         *Handle = NULL;\r
2614         // バグ修正\r
2615         New = NULL;\r
2616 \r
2617         if((Strm = fopen(AskIniFilePath(), "rt")) != NULL)\r
2618         {\r
2619                 if((Buf = malloc(REG_SECT_MAX)) != NULL)\r
2620                 {\r
2621                         while(fgets(Buf, REG_SECT_MAX, Strm) != NULL)\r
2622                         {\r
2623                                 if(*Buf != '#')\r
2624                                 {\r
2625                                         if((Tmp = strchr(Buf, '\n')) != NULL)\r
2626                                                 *Tmp = NUL;\r
2627 \r
2628                                         if(*Buf == '[')\r
2629                                         {\r
2630                                                 if((New = malloc(sizeof(REGDATATBL))) != NULL)\r
2631                                                 {\r
2632                                                         if((Tmp = strchr(Buf, ']')) != NULL)\r
2633                                                                 *Tmp = NUL;\r
2634                                                         // バグ修正\r
2635 //                                                      strcpy(New->KeyName, Buf+1);\r
2636                                                         strncpy(New->KeyName, Buf+1, 80);\r
2637                                                         New->KeyName[80] = NUL;\r
2638                                                         New->ValLen = 0;\r
2639                                                         New->Next = NULL;\r
2640                                                         Data = New->ValTbl;\r
2641                                                 }\r
2642                                                 if(*Handle == NULL)\r
2643                                                         *Handle = New;\r
2644                                                 else\r
2645                                                 {\r
2646                                                         Pos = *Handle;\r
2647                                                         while(Pos->Next != NULL)\r
2648                                                                 Pos = Pos->Next;\r
2649                                                         Pos->Next = New;\r
2650                                                 }\r
2651                                         }\r
2652                                         else if(strlen(Buf) > 0)\r
2653                                         {\r
2654                                                 // バグ修正\r
2655 //                                              strcpy(Data, Buf);\r
2656 //                                              Data += strlen(Buf) + 1;\r
2657 //                                              New->ValLen += strlen(Buf) + 1;\r
2658                                                 if(Data != NULL && New != NULL)\r
2659                                                 {\r
2660                                                         if(New->ValLen + strlen(Buf) + 1 <= REG_SECT_MAX)\r
2661                                                         {\r
2662                                                                 strcpy(Data, Buf);\r
2663                                                                 Data += strlen(Buf) + 1;\r
2664                                                                 New->ValLen += strlen(Buf) + 1;\r
2665                                                         }\r
2666                                                 }\r
2667                                         }\r
2668                                 }\r
2669                         }\r
2670                         Sts = FFFTP_SUCCESS;\r
2671                         free(Buf);\r
2672                 }\r
2673                 fclose(Strm);\r
2674         }\r
2675         return(Sts);\r
2676 }\r
2677 \r
2678 \r
2679 /*----- サブキーをオープンする ------------------------------------------------\r
2680 *\r
2681 *       Parameter\r
2682 *               void *Parent : 親のハンドル\r
2683 *               char *Name : 名前\r
2684 *               void **Handle : ハンドルを返すワーク\r
2685 *\r
2686 *       Return Value\r
2687 *               int ステータス\r
2688 *                       FFFTP_SUCCESS/FFFTP_FAIL\r
2689 *----------------------------------------------------------------------------*/\r
2690 \r
2691 static int OpenSubKey(void *Parent, char *Name, void **Handle)\r
2692 {\r
2693         int Sts;\r
2694         char Key[80];\r
2695         REGDATATBL *Pos;\r
2696 \r
2697         Sts = FFFTP_FAIL;\r
2698         if(TmpRegType == REGTYPE_REG)\r
2699         {\r
2700                 // 全設定暗号化対応\r
2701 //              if(RegOpenKeyEx(Parent, Name, 0, KEY_READ, (HKEY *)Handle) == ERROR_SUCCESS)\r
2702 //                      Sts = FFFTP_SUCCESS;\r
2703                 if((*Handle = malloc(sizeof(REGDATATBL_REG))) != NULL)\r
2704                 {\r
2705                         strcpy(((REGDATATBL_REG *)(*Handle))->KeyName, ((REGDATATBL_REG *)Parent)->KeyName);\r
2706                         strcat(((REGDATATBL_REG *)(*Handle))->KeyName, "\\");\r
2707                         strcat(((REGDATATBL_REG *)(*Handle))->KeyName, Name);\r
2708                         if(RegOpenKeyEx(((REGDATATBL_REG *)Parent)->hKey, Name, 0, KEY_READ, &(((REGDATATBL_REG *)(*Handle))->hKey)) == ERROR_SUCCESS)\r
2709                                 Sts = FFFTP_SUCCESS;\r
2710                         if(Sts != FFFTP_SUCCESS)\r
2711                                 free(*Handle);\r
2712                 }\r
2713         }\r
2714         else\r
2715         {\r
2716                 strcpy(Key, ((REGDATATBL *)Parent)->KeyName);\r
2717                 strcat(Key, "\\");\r
2718                 strcat(Key, Name);\r
2719                 Pos = Parent;\r
2720                 while(Pos != NULL)\r
2721                 {\r
2722                         if(strcmp(Pos->KeyName, Key) == 0)\r
2723                         {\r
2724                                 *Handle = Pos;\r
2725                                 Sts = FFFTP_SUCCESS;\r
2726                                 break;\r
2727                         }\r
2728                         Pos = Pos->Next;\r
2729                 }\r
2730         }\r
2731         return(Sts);\r
2732 }\r
2733 \r
2734 \r
2735 /*----- サブキーを作成する ----------------------------------------------------\r
2736 *\r
2737 *       Parameter\r
2738 *               void *Parent : 親のハンドル\r
2739 *               char *Name : 名前\r
2740 *               void **Handle : ハンドルを返すワーク\r
2741 *\r
2742 *       Return Value\r
2743 *               int ステータス\r
2744 *                       FFFTP_SUCCESS/FFFTP_FAIL\r
2745 *----------------------------------------------------------------------------*/\r
2746 \r
2747 static int CreateSubKey(void *Parent, char *Name, void **Handle)\r
2748 {\r
2749         int Sts;\r
2750         DWORD Dispos;\r
2751         REGDATATBL *Pos;\r
2752 \r
2753         Sts = FFFTP_FAIL;\r
2754         if(TmpRegType == REGTYPE_REG)\r
2755         {\r
2756                 // 全設定暗号化対応\r
2757 //              if(RegCreateKeyEx(Parent, Name, 0, "", REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, (HKEY *)Handle, &Dispos) == ERROR_SUCCESS)\r
2758 //                      Sts = FFFTP_SUCCESS;\r
2759                 if((*Handle = malloc(sizeof(REGDATATBL_REG))) != NULL)\r
2760                 {\r
2761                         strcpy(((REGDATATBL_REG *)(*Handle))->KeyName, ((REGDATATBL_REG *)Parent)->KeyName);\r
2762                         strcat(((REGDATATBL_REG *)(*Handle))->KeyName, "\\");\r
2763                         strcat(((REGDATATBL_REG *)(*Handle))->KeyName, Name);\r
2764                         if(RegCreateKeyEx(((REGDATATBL_REG *)Parent)->hKey, Name, 0, "", REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &(((REGDATATBL_REG *)(*Handle))->hKey), &Dispos) == ERROR_SUCCESS)\r
2765                                 Sts = FFFTP_SUCCESS;\r
2766                         if(Sts != FFFTP_SUCCESS)\r
2767                                 free(*Handle);\r
2768                 }\r
2769         }\r
2770         else\r
2771         {\r
2772                 if((*Handle = malloc(sizeof(REGDATATBL))) != NULL)\r
2773                 {\r
2774                         strcpy(((REGDATATBL *)(*Handle))->KeyName, ((REGDATATBL *)Parent)->KeyName);\r
2775                         strcat(((REGDATATBL *)(*Handle))->KeyName, "\\");\r
2776                         strcat(((REGDATATBL *)(*Handle))->KeyName, Name);\r
2777 \r
2778                         ((REGDATATBL *)(*Handle))->ValLen = 0;\r
2779                         ((REGDATATBL *)(*Handle))->Next = NULL;\r
2780 \r
2781                         Pos = (REGDATATBL *)Parent;\r
2782                         while(Pos->Next != NULL)\r
2783                                 Pos = Pos->Next;\r
2784                         Pos->Next = *Handle;\r
2785                         Sts = FFFTP_SUCCESS;\r
2786                 }\r
2787         }\r
2788         return(Sts);\r
2789 }\r
2790 \r
2791 \r
2792 /*----- サブキーをクローズする ------------------------------------------------\r
2793 *\r
2794 *       Parameter\r
2795 *               void *Handle : ハンドル\r
2796 *\r
2797 *       Return Value\r
2798 *               int ステータス\r
2799 *                       FFFTP_SUCCESS/FFFTP_FAIL\r
2800 *----------------------------------------------------------------------------*/\r
2801 \r
2802 static int CloseSubKey(void *Handle)\r
2803 {\r
2804         if(TmpRegType == REGTYPE_REG)\r
2805         // 全設定暗号化対応\r
2806 //              RegCloseKey(Handle);\r
2807         {\r
2808                 RegCloseKey(((REGDATATBL_REG *)Handle)->hKey);\r
2809                 free(Handle);\r
2810         }\r
2811         else\r
2812         {\r
2813                 /* Nothing */\r
2814         }\r
2815         return(FFFTP_SUCCESS);\r
2816 }\r
2817 \r
2818 \r
2819 /*----- サブキーを削除する ----------------------------------------------------\r
2820 *\r
2821 *       Parameter\r
2822 *               void *Handle : ハンドル\r
2823 *               char *Name : 名前\r
2824 *\r
2825 *       Return Value\r
2826 *               int ステータス\r
2827 *                       FFFTP_SUCCESS/FFFTP_FAIL\r
2828 *----------------------------------------------------------------------------*/\r
2829 \r
2830 static int DeleteSubKey(void *Handle, char *Name)\r
2831 {\r
2832         int Sts;\r
2833 \r
2834         Sts = FFFTP_FAIL;\r
2835         if(TmpRegType == REGTYPE_REG)\r
2836         {\r
2837                 // 全設定暗号化対応\r
2838 //              if(RegDeleteKey(Handle, Name) == ERROR_SUCCESS)\r
2839                 if(RegDeleteKey(((REGDATATBL_REG *)Handle)->hKey, Name) == ERROR_SUCCESS)\r
2840                         Sts = FFFTP_SUCCESS;\r
2841         }\r
2842         else\r
2843         {\r
2844                 Sts = FFFTP_FAIL;\r
2845         }\r
2846         return(Sts);\r
2847 }\r
2848 \r
2849 \r
2850 /*----- 値を削除する ----------------------------------------------------------\r
2851 *\r
2852 *       Parameter\r
2853 *               void *Handle : ハンドル\r
2854 *               char *Name : 名前\r
2855 *\r
2856 *       Return Value\r
2857 *               int ステータス\r
2858 *                       FFFTP_SUCCESS/FFFTP_FAIL\r
2859 *----------------------------------------------------------------------------*/\r
2860 \r
2861 static int DeleteValue(void *Handle, char *Name)\r
2862 {\r
2863         int Sts;\r
2864 \r
2865         Sts = FFFTP_FAIL;\r
2866         if(TmpRegType == REGTYPE_REG)\r
2867         {\r
2868                 // 全設定暗号化対応\r
2869 //              if(RegDeleteValue(Handle, Name) == ERROR_SUCCESS)\r
2870                 if(RegDeleteValue(((REGDATATBL_REG *)Handle)->hKey, Name) == ERROR_SUCCESS)\r
2871                         Sts = FFFTP_SUCCESS;\r
2872         }\r
2873         else\r
2874         {\r
2875                 Sts = FFFTP_FAIL;\r
2876         }\r
2877         return(Sts);\r
2878 }\r
2879 \r
2880 \r
2881 /*----- INT値を読み込む -------------------------------------------------------\r
2882 *\r
2883 *       Parameter\r
2884 *               void *Handle : ハンドル\r
2885 *               char *Name : 名前\r
2886 *               int *Value : INT値を返すワーク\r
2887 *\r
2888 *       Return Value\r
2889 *               int ステータス\r
2890 *                       FFFTP_SUCCESS/FFFTP_FAIL\r
2891 *----------------------------------------------------------------------------*/\r
2892 \r
2893 static int ReadIntValueFromReg(void *Handle, char *Name, int *Value)\r
2894 {\r
2895         int Sts;\r
2896         DWORD Size;\r
2897         char *Pos;\r
2898         // 全設定暗号化対応\r
2899         char Path[80];\r
2900 \r
2901         Sts = FFFTP_FAIL;\r
2902         if(TmpRegType == REGTYPE_REG)\r
2903         {\r
2904                 Size = sizeof(int);\r
2905                 // 全設定暗号化対応\r
2906 //              if(RegQueryValueEx(Handle, Name, NULL, NULL, (BYTE *)Value, &Size) == ERROR_SUCCESS)\r
2907                 if(RegQueryValueEx(((REGDATATBL_REG *)Handle)->hKey, Name, NULL, NULL, (BYTE *)Value, &Size) == ERROR_SUCCESS)\r
2908                         Sts = FFFTP_SUCCESS;\r
2909         }\r
2910         else\r
2911         {\r
2912                 if((Pos = ScanValue(Handle, Name)) != NULL)\r
2913                 {\r
2914                         *Value = atoi(Pos);\r
2915                         Sts = FFFTP_SUCCESS;\r
2916                 }\r
2917         }\r
2918         // 全設定暗号化対応\r
2919         if(Sts == FFFTP_SUCCESS)\r
2920         {\r
2921                 if(EncryptSettings == YES)\r
2922                 {\r
2923                         if(TmpRegType == REGTYPE_REG)\r
2924                                 strcpy(Path, ((REGDATATBL_REG *)Handle)->KeyName);\r
2925                         else\r
2926                                 strcpy(Path, ((REGDATATBL *)Handle)->KeyName);\r
2927                         strcat(Path, "\\");\r
2928                         strcat(Path, Name);\r
2929                         UnmaskSettingsData(Path, strlen(Path), Value, sizeof(int), NO);\r
2930                         CalculateSettingsDataChecksum(Value, sizeof(int));\r
2931                 }\r
2932         }\r
2933         return(Sts);\r
2934 }\r
2935 \r
2936 \r
2937 /*----- INT値を書き込む -------------------------------------------------------\r
2938 *\r
2939 *       Parameter\r
2940 *               void *Handle : ハンドル\r
2941 *               char *Name : 名前\r
2942 *               int Value : INT値\r
2943 *\r
2944 *       Return Value\r
2945 *               int ステータス\r
2946 *                       FFFTP_SUCCESS/FFFTP_FAIL\r
2947 *----------------------------------------------------------------------------*/\r
2948 \r
2949 static int WriteIntValueToReg(void *Handle, char *Name, int Value)\r
2950 {\r
2951         REGDATATBL *Pos;\r
2952         char *Data;\r
2953         char Tmp[20];\r
2954         // 全設定暗号化対応\r
2955         char Path[80];\r
2956 \r
2957         // 全設定暗号化対応\r
2958         if(EncryptSettings == YES)\r
2959         {\r
2960                 if(TmpRegType == REGTYPE_REG)\r
2961                         strcpy(Path, ((REGDATATBL_REG *)Handle)->KeyName);\r
2962                 else\r
2963                         strcpy(Path, ((REGDATATBL *)Handle)->KeyName);\r
2964                 strcat(Path, "\\");\r
2965                 strcat(Path, Name);\r
2966                 MaskSettingsData(Path, strlen(Path), &Value, sizeof(int), NO);\r
2967         }\r
2968         if(TmpRegType == REGTYPE_REG)\r
2969                 // 全設定暗号化対応\r
2970 //              RegSetValueEx(Handle, Name, 0, REG_DWORD, (CONST BYTE *)&Value, sizeof(int));\r
2971                 RegSetValueEx(((REGDATATBL_REG *)Handle)->hKey, Name, 0, REG_DWORD, (CONST BYTE *)&Value, sizeof(int));\r
2972         else\r
2973         {\r
2974                 Pos = (REGDATATBL *)Handle;\r
2975                 Data = Pos->ValTbl + Pos->ValLen;\r
2976                 strcpy(Data, Name);\r
2977                 strcat(Data, "=");\r
2978                 sprintf(Tmp, "%d", Value);\r
2979                 strcat(Data, Tmp);\r
2980                 Pos->ValLen += strlen(Data) + 1;\r
2981         }\r
2982         // 全設定暗号化対応\r
2983         if(EncryptSettings == YES)\r
2984         {\r
2985                 UnmaskSettingsData(Path, strlen(Path), &Value, sizeof(int), NO);\r
2986                 CalculateSettingsDataChecksum(&Value, sizeof(int));\r
2987         }\r
2988         return(FFFTP_SUCCESS);\r
2989 }\r
2990 \r
2991 \r
2992 /*----- 文字列を読み込む ------------------------------------------------------\r
2993 *\r
2994 *       Parameter\r
2995 *               void *Handle : ハンドル\r
2996 *               char *Name : 名前\r
2997 *               char *Str : 文字列を返すワーク\r
2998 *               DWORD Size : 最大サイズ\r
2999 *\r
3000 *       Return Value\r
3001 *               int ステータス\r
3002 *                       FFFTP_SUCCESS/FFFTP_FAIL\r
3003 *----------------------------------------------------------------------------*/\r
3004 \r
3005 static int ReadStringFromReg(void *Handle, char *Name, char *Str, DWORD Size)\r
3006 {\r
3007         int Sts;\r
3008         char *Pos;\r
3009         // UTF-8対応\r
3010         DWORD TempSize;\r
3011         char* pa0;\r
3012         wchar_t* pw0;\r
3013         // 全設定暗号化対応\r
3014         char Path[80];\r
3015 \r
3016         Sts = FFFTP_FAIL;\r
3017         if(TmpRegType == REGTYPE_REG)\r
3018         {\r
3019                 // 全設定暗号化対応\r
3020 //              if(RegQueryValueEx(Handle, Name, NULL, NULL, (BYTE *)Str, &Size) == ERROR_SUCCESS)\r
3021                 if(RegQueryValueEx(((REGDATATBL_REG *)Handle)->hKey, Name, NULL, NULL, (BYTE *)Str, &Size) == ERROR_SUCCESS)\r
3022                 {\r
3023                         if(*(Str + Size - 1) != NUL)\r
3024                                 *(Str + Size) = NUL;\r
3025                         Sts = FFFTP_SUCCESS;\r
3026                 }\r
3027         }\r
3028         else\r
3029         {\r
3030                 if((Pos = ScanValue(Handle, Name)) != NULL)\r
3031                 {\r
3032                         // UTF-8対応\r
3033 //                      Size = min1(Size-1, strlen(Pos));\r
3034 //                      Size = StrReadIn(Pos, Size, Str);\r
3035 //                      *(Str + Size) = NUL;\r
3036 //                      Sts = FFFTP_SUCCESS;\r
3037                         switch(IniKanjiCode)\r
3038                         {\r
3039                         case KANJI_NOCNV:\r
3040                                 TempSize = min1(Size-1, strlen(Pos));\r
3041                                 TempSize = StrReadIn(Pos, TempSize, Str);\r
3042                                 *(Str + TempSize) = NUL;\r
3043                                 Sts = FFFTP_SUCCESS;\r
3044                                 break;\r
3045                         case KANJI_SJIS:\r
3046                                 if(pa0 = AllocateStringA(Size * 4))\r
3047                                 {\r
3048                                         if(pw0 = AllocateStringW(Size * 4 * 4))\r
3049                                         {\r
3050                                                 TempSize = min1((Size * 4) - 1, strlen(Pos));\r
3051                                                 TempSize = StrReadIn(Pos, TempSize, pa0);\r
3052                                                 *(pa0 + TempSize) = NUL;\r
3053                                                 AtoW(pw0, Size * 4 * 4, pa0, -1);\r
3054                                                 WtoM(Str, Size, pw0, -1);\r
3055                                                 TerminateStringM(Str, Size);\r
3056                                                 Sts = FFFTP_SUCCESS;\r
3057                                                 FreeDuplicatedString(pw0);\r
3058                                         }\r
3059                                         FreeDuplicatedString(pa0);\r
3060                                 }\r
3061                                 break;\r
3062                         }\r
3063                 }\r
3064         }\r
3065         // 全設定暗号化対応\r
3066         if(Sts == FFFTP_SUCCESS)\r
3067         {\r
3068                 if(EncryptSettings == YES)\r
3069                 {\r
3070                         if(TmpRegType == REGTYPE_REG)\r
3071                                 strcpy(Path, ((REGDATATBL_REG *)Handle)->KeyName);\r
3072                         else\r
3073                                 strcpy(Path, ((REGDATATBL *)Handle)->KeyName);\r
3074                         strcat(Path, "\\");\r
3075                         strcat(Path, Name);\r
3076                         UnmaskSettingsData(Path, strlen(Path), Str, strlen(Str) + 1, YES);\r
3077                         CalculateSettingsDataChecksum(Str, strlen(Str) + 1);\r
3078                 }\r
3079         }\r
3080         return(Sts);\r
3081 }\r
3082 \r
3083 \r
3084 /*----- 文字列を書き込む ------------------------------------------------------\r
3085 *\r
3086 *       Parameter\r
3087 *               void *Handle : ハンドル\r
3088 *               char *Name : 名前\r
3089 *               char *Str :文字列\r
3090 *\r
3091 *       Return Value\r
3092 *               int ステータス\r
3093 *                       FFFTP_SUCCESS/FFFTP_FAIL\r
3094 *----------------------------------------------------------------------------*/\r
3095 \r
3096 static int WriteStringToReg(void *Handle, char *Name, char *Str)\r
3097 {\r
3098         REGDATATBL *Pos;\r
3099         char *Data;\r
3100         // 全設定暗号化対応\r
3101         char Path[80];\r
3102 \r
3103         // 全設定暗号化対応\r
3104         if(EncryptSettings == YES)\r
3105         {\r
3106                 if(TmpRegType == REGTYPE_REG)\r
3107                         strcpy(Path, ((REGDATATBL_REG *)Handle)->KeyName);\r
3108                 else\r
3109                         strcpy(Path, ((REGDATATBL *)Handle)->KeyName);\r
3110                 strcat(Path, "\\");\r
3111                 strcat(Path, Name);\r
3112                 MaskSettingsData(Path, strlen(Path), Str, strlen(Str) + 1, YES);\r
3113         }\r
3114         if(TmpRegType == REGTYPE_REG)\r
3115         // 全設定暗号化対応\r
3116 //              RegSetValueEx(Handle, Name, 0, REG_SZ, (CONST BYTE *)Str, strlen(Str)+1);\r
3117                 RegSetValueEx(((REGDATATBL_REG *)Handle)->hKey, Name, 0, EncryptSettings == YES ? REG_BINARY : REG_SZ, (CONST BYTE *)Str, strlen(Str)+1);\r
3118         else\r
3119         {\r
3120                 Pos = (REGDATATBL *)Handle;\r
3121                 Data = Pos->ValTbl + Pos->ValLen;\r
3122                 strcpy(Data, Name);\r
3123                 strcat(Data, "=");\r
3124                 Pos->ValLen += strlen(Data);\r
3125                 Data = Pos->ValTbl + Pos->ValLen;\r
3126                 Pos->ValLen += StrCatOut(Str, strlen(Str), Data) + 1;\r
3127         }\r
3128         // 全設定暗号化対応\r
3129         if(EncryptSettings == YES)\r
3130         {\r
3131                 UnmaskSettingsData(Path, strlen(Path), Str, strlen(Str) + 1, YES);\r
3132                 CalculateSettingsDataChecksum(Str, strlen(Str) + 1);\r
3133         }\r
3134         return(FFFTP_SUCCESS);\r
3135 }\r
3136 \r
3137 \r
3138 /*----- マルチ文字列を読み込む ------------------------------------------------\r
3139 *\r
3140 *       Parameter\r
3141 *               void *Handle : ハンドル\r
3142 *               char *Name : 名前\r
3143 *               char *Str : 文字列を返すワーク\r
3144 *               DWORD Size : 最大サイズ\r
3145 *\r
3146 *       Return Value\r
3147 *               int ステータス\r
3148 *                       FFFTP_SUCCESS/FFFTP_FAIL\r
3149 *----------------------------------------------------------------------------*/\r
3150 \r
3151 static int ReadMultiStringFromReg(void *Handle, char *Name, char *Str, DWORD Size)\r
3152 {\r
3153         int Sts;\r
3154         char *Pos;\r
3155         // UTF-8対応\r
3156         DWORD TempSize;\r
3157         char* pa0;\r
3158         wchar_t* pw0;\r
3159         // 全設定暗号化対応\r
3160         char Path[80];\r
3161 \r
3162         Sts = FFFTP_FAIL;\r
3163         if(TmpRegType == REGTYPE_REG)\r
3164         {\r
3165                 // 全設定暗号化対応\r
3166 //              if(RegQueryValueEx(Handle, Name, NULL, NULL, (BYTE *)Str, &Size) == ERROR_SUCCESS)\r
3167                 if(RegQueryValueEx(((REGDATATBL_REG *)Handle)->hKey, Name, NULL, NULL, (BYTE *)Str, &Size) == ERROR_SUCCESS)\r
3168                 {\r
3169                         if(*(Str + Size - 1) != NUL)\r
3170                                 *(Str + Size) = NUL;\r
3171                         Sts = FFFTP_SUCCESS;\r
3172                 }\r
3173         }\r
3174         else\r
3175         {\r
3176                 if((Pos = ScanValue(Handle, Name)) != NULL)\r
3177                 {\r
3178                         // UTF-8対応\r
3179 //                      Size = min1(Size-1, strlen(Pos));\r
3180 //                      Size = StrReadIn(Pos, Size, Str);\r
3181 //                      *(Str + Size) = NUL;\r
3182 //                      Sts = FFFTP_SUCCESS;\r
3183                         switch(IniKanjiCode)\r
3184                         {\r
3185                         case KANJI_NOCNV:\r
3186                                 TempSize = min1(Size - 2, strlen(Pos));\r
3187                                 TempSize = StrReadIn(Pos, TempSize, Str);\r
3188                                 *(Str + TempSize) = NUL;\r
3189                                 *(Str + TempSize + 1) = NUL;\r
3190                                 Sts = FFFTP_SUCCESS;\r
3191                                 break;\r
3192                         case KANJI_SJIS:\r
3193                                 if(pa0 = AllocateStringA(Size * 4))\r
3194                                 {\r
3195                                         if(pw0 = AllocateStringW(Size * 4 * 4))\r
3196                                         {\r
3197                                                 TempSize = min1((Size * 4) - 2, strlen(Pos));\r
3198                                                 TempSize = StrReadIn(Pos, TempSize, pa0);\r
3199                                                 *(pa0 + TempSize) = NUL;\r
3200                                                 *(pa0 + TempSize + 1) = NUL;\r
3201                                                 AtoWMultiString(pw0, Size * 4 * 4, pa0);\r
3202                                                 WtoMMultiString(Str, Size, pw0);\r
3203                                                 TerminateStringM(Str, Size);\r
3204                                                 TerminateStringM(Str, Size - 1);\r
3205                                                 Sts = FFFTP_SUCCESS;\r
3206                                                 FreeDuplicatedString(pw0);\r
3207                                         }\r
3208                                         FreeDuplicatedString(pa0);\r
3209                                 }\r
3210                                 break;\r
3211                         }\r
3212                 }\r
3213         }\r
3214         // 全設定暗号化対応\r
3215         if(Sts == FFFTP_SUCCESS)\r
3216         {\r
3217                 if(EncryptSettings == YES)\r
3218                 {\r
3219                         if(TmpRegType == REGTYPE_REG)\r
3220                                 strcpy(Path, ((REGDATATBL_REG *)Handle)->KeyName);\r
3221                         else\r
3222                                 strcpy(Path, ((REGDATATBL *)Handle)->KeyName);\r
3223                         strcat(Path, "\\");\r
3224                         strcat(Path, Name);\r
3225                         UnmaskSettingsData(Path, strlen(Path), Str, StrMultiLen(Str) + 1, YES);\r
3226                         CalculateSettingsDataChecksum(Str, StrMultiLen(Str) + 1);\r
3227                 }\r
3228         }\r
3229         return(Sts);\r
3230 }\r
3231 \r
3232 \r
3233 /*----- マルチ文字列を書き込む ------------------------------------------------\r
3234 *\r
3235 *       Parameter\r
3236 *               void *Handle : ハンドル\r
3237 *               char *Name : 名前\r
3238 *               char *Str : 文字列\r
3239 *\r
3240 *       Return Value\r
3241 *               int ステータス\r
3242 *                       FFFTP_SUCCESS/FFFTP_FAIL\r
3243 *----------------------------------------------------------------------------*/\r
3244 \r
3245 static int WriteMultiStringToReg(void *Handle, char *Name, char *Str)\r
3246 {\r
3247         REGDATATBL *Pos;\r
3248         char *Data;\r
3249         // 全設定暗号化対応\r
3250         char Path[80];\r
3251 \r
3252         // 全設定暗号化対応\r
3253         if(EncryptSettings == YES)\r
3254         {\r
3255                 if(TmpRegType == REGTYPE_REG)\r
3256                         strcpy(Path, ((REGDATATBL_REG *)Handle)->KeyName);\r
3257                 else\r
3258                         strcpy(Path, ((REGDATATBL *)Handle)->KeyName);\r
3259                 strcat(Path, "\\");\r
3260                 strcat(Path, Name);\r
3261                 MaskSettingsData(Path, strlen(Path), Str, StrMultiLen(Str) + 1, YES);\r
3262         }\r
3263         if(TmpRegType == REGTYPE_REG)\r
3264         // 全設定暗号化対応\r
3265 //              RegSetValueEx(Handle, Name, 0, REG_MULTI_SZ, (CONST BYTE *)Str, StrMultiLen(Str)+1);\r
3266                 RegSetValueEx(((REGDATATBL_REG *)Handle)->hKey, Name, 0, EncryptSettings == YES ? REG_BINARY : REG_MULTI_SZ, (CONST BYTE *)Str, StrMultiLen(Str)+1);\r
3267         else\r
3268         {\r
3269                 Pos = (REGDATATBL *)Handle;\r
3270                 Data = Pos->ValTbl + Pos->ValLen;\r
3271                 strcpy(Data, Name);\r
3272                 strcat(Data, "=");\r
3273                 Pos->ValLen += strlen(Data);\r
3274                 Data = Pos->ValTbl + Pos->ValLen;\r
3275                 Pos->ValLen += StrCatOut(Str, StrMultiLen(Str), Data) + 1;\r
3276         }\r
3277         // 全設定暗号化対応\r
3278         if(EncryptSettings == YES)\r
3279         {\r
3280                 UnmaskSettingsData(Path, strlen(Path), Str, StrMultiLen(Str) + 1, YES);\r
3281                 CalculateSettingsDataChecksum(Str, StrMultiLen(Str) + 1);\r
3282         }\r
3283         return(FFFTP_SUCCESS);\r
3284 }\r
3285 \r
3286 \r
3287 /*----- バイナリを読み込む-----------------------------------------------------\r
3288 *\r
3289 *       Parameter\r
3290 *               void *Handle : ハンドル\r
3291 *               char *Name : 名前\r
3292 *               void *Bin : バイナリを返すワーク\r
3293 *               DWORD Size : 最大サイズ\r
3294 *\r
3295 *       Return Value\r
3296 *               int ステータス\r
3297 *                       FFFTP_SUCCESS/FFFTP_FAIL\r
3298 *----------------------------------------------------------------------------*/\r
3299 \r
3300 static int ReadBinaryFromReg(void *Handle, char *Name, void *Bin, DWORD Size)\r
3301 {\r
3302         int Sts;\r
3303         char *Pos;\r
3304         // 全設定暗号化対応\r
3305         char Path[80];\r
3306 \r
3307         Sts = FFFTP_FAIL;\r
3308         if(TmpRegType == REGTYPE_REG)\r
3309         {\r
3310                 // 全設定暗号化対応\r
3311 //              if(RegQueryValueEx(Handle, Name, NULL, NULL, (BYTE *)Bin, &Size) == ERROR_SUCCESS)\r
3312                 if(RegQueryValueEx(((REGDATATBL_REG *)Handle)->hKey, Name, NULL, NULL, (BYTE *)Bin, &Size) == ERROR_SUCCESS)\r
3313                         Sts = FFFTP_SUCCESS;\r
3314         }\r
3315         else\r
3316         {\r
3317                 if((Pos = ScanValue(Handle, Name)) != NULL)\r
3318                 {\r
3319                         Size = min1(Size, strlen(Pos));\r
3320                         Size = StrReadIn(Pos, Size, Bin);\r
3321                         Sts = FFFTP_SUCCESS;\r
3322                 }\r
3323         }\r
3324         // 全設定暗号化対応\r
3325         if(Sts == FFFTP_SUCCESS)\r
3326         {\r
3327                 if(EncryptSettings == YES)\r
3328                 {\r
3329                         if(TmpRegType == REGTYPE_REG)\r
3330                                 strcpy(Path, ((REGDATATBL_REG *)Handle)->KeyName);\r
3331                         else\r
3332                                 strcpy(Path, ((REGDATATBL *)Handle)->KeyName);\r
3333                         strcat(Path, "\\");\r
3334                         strcat(Path, Name);\r
3335                         UnmaskSettingsData(Path, strlen(Path), Bin, Size, NO);\r
3336                         CalculateSettingsDataChecksum(Bin, Size);\r
3337                 }\r
3338         }\r
3339         return(Sts);\r
3340 }\r
3341 \r
3342 \r
3343 /*----- バイナリを書き込む ----------------------------------------------------\r
3344 *\r
3345 *       Parameter\r
3346 *               void *Handle : ハンドル\r
3347 *               char *Name : 名前\r
3348 *               void *Bin : バイナリ\r
3349 *               int Len : 長さ\r
3350 *\r
3351 *       Return Value\r
3352 *               int ステータス\r
3353 *                       FFFTP_SUCCESS/FFFTP_FAIL\r
3354 *----------------------------------------------------------------------------*/\r
3355 \r
3356 static int WriteBinaryToReg(void *Handle, char *Name, void *Bin, int Len)\r
3357 {\r
3358         REGDATATBL *Pos;\r
3359         char *Data;\r
3360         // 全設定暗号化対応\r
3361         char Path[80];\r
3362 \r
3363         // 全設定暗号化対応\r
3364         if(EncryptSettings == YES)\r
3365         {\r
3366                 if(TmpRegType == REGTYPE_REG)\r
3367                         strcpy(Path, ((REGDATATBL_REG *)Handle)->KeyName);\r
3368                 else\r
3369                         strcpy(Path, ((REGDATATBL *)Handle)->KeyName);\r
3370                 strcat(Path, "\\");\r
3371                 strcat(Path, Name);\r
3372                 MaskSettingsData(Path, strlen(Path), Bin, Len, NO);\r
3373         }\r
3374         if(TmpRegType == REGTYPE_REG)\r
3375         // 全設定暗号化対応\r
3376 //              RegSetValueEx(Handle, Name, 0, REG_BINARY, (CONST BYTE *)Bin, Len);\r
3377                 RegSetValueEx(((REGDATATBL_REG *)Handle)->hKey, Name, 0, REG_BINARY, (CONST BYTE *)Bin, Len);\r
3378         else\r
3379         {\r
3380                 Pos = (REGDATATBL *)Handle;\r
3381                 Data = Pos->ValTbl + Pos->ValLen;\r
3382                 strcpy(Data, Name);\r
3383                 strcat(Data, "=");\r
3384                 Pos->ValLen += strlen(Data);\r
3385                 Data = Pos->ValTbl + Pos->ValLen;\r
3386                 Pos->ValLen += StrCatOut(Bin, Len, Data) + 1;\r
3387         }\r
3388         // 全設定暗号化対応\r
3389         if(EncryptSettings == YES)\r
3390         {\r
3391                 UnmaskSettingsData(Path, strlen(Path), Bin, Len, NO);\r
3392                 CalculateSettingsDataChecksum(Bin, Len);\r
3393         }\r
3394         return(FFFTP_SUCCESS);\r
3395 }\r
3396 \r
3397 \r
3398 /*----- 文字列をバッファに追加書き込みする ------------------------------------\r
3399 *\r
3400 *       Parameter\r
3401 *               char *Src : 文字列\r
3402 *               int len : 文字列の長さ\r
3403 *               char *Dst : 書き込みするバッファ\r
3404 *\r
3405 *       Return Value\r
3406 *               int 追加したバイト数\r
3407 *----------------------------------------------------------------------------*/\r
3408 \r
3409 static int StrCatOut(char *Src, int Len, char *Dst)\r
3410 {\r
3411         int Count;\r
3412 \r
3413         Dst += strlen(Dst);\r
3414         Count = 0;\r
3415         for(; Len > 0; Len--)\r
3416         {\r
3417                 if(*Src == '\\')\r
3418                 {\r
3419                         *Dst++ = '\\';\r
3420                         *Dst++ = '\\';\r
3421                         Count += 2;\r
3422                 }\r
3423                 else if((*Src >= 0x20) && (*Src <= 0x7E))\r
3424                 {\r
3425                         *Dst++ = *Src;\r
3426                         Count++;\r
3427                 }\r
3428                 else\r
3429                 {\r
3430                         sprintf(Dst, "\\%02X", *(unsigned char *)Src);\r
3431                         Dst += 3;\r
3432                         Count += 3;\r
3433                 }\r
3434                 Src++;\r
3435         }\r
3436         *Dst = NUL;\r
3437         return(Count);\r
3438 }\r
3439 \r
3440 \r
3441 /*----- 文字列をバッファに読み込む --------------------------------------------\r
3442 *\r
3443 *       Parameter\r
3444 *               char *Src : 文字列\r
3445 *               int Max : 最大サイズ\r
3446 *               char *Dst : 書き込みするバッファ\r
3447 *\r
3448 *       Return Value\r
3449 *               int 読み込んだバイト数\r
3450 *----------------------------------------------------------------------------*/\r
3451 \r
3452 static int StrReadIn(char *Src, int Max, char *Dst)\r
3453 {\r
3454         int Count;\r
3455         int Tmp;\r
3456 \r
3457         Count = 0;\r
3458         while(*Src != NUL)\r
3459         {\r
3460                 if(Count >= Max)\r
3461                         break;\r
3462 \r
3463                 if(*Src == '\\')\r
3464                 {\r
3465                         Src++;\r
3466                         if(*Src == '\\')\r
3467                                 *Dst = '\\';\r
3468                         else\r
3469                         {\r
3470                                 sscanf(Src, "%02x", &Tmp);\r
3471                                 *Dst = Tmp;\r
3472                                 Src++;\r
3473                         }\r
3474                 }\r
3475                 else\r
3476                         *Dst = *Src;\r
3477 \r
3478                 Count++;\r
3479                 Dst++;\r
3480                 Src++;\r
3481         }\r
3482         return(Count);\r
3483 }\r
3484 \r
3485 \r
3486 /*----- 値を検索する ----------------------------------------------------------\r
3487 *\r
3488 *       Parameter\r
3489 *               char *Handle : ハンドル\r
3490 *               char *Name : 名前\r
3491 *\r
3492 *       Return Value\r
3493 *               char *値データの先頭\r
3494 *                       NULL=指定の名前の値が見つからない\r
3495 *----------------------------------------------------------------------------*/\r
3496 \r
3497 static char *ScanValue(void *Handle, char *Name)\r
3498 {\r
3499         REGDATATBL *Cur;\r
3500         char *Pos;\r
3501         char *Ret;\r
3502 \r
3503         Ret = NULL;\r
3504         Cur = Handle;\r
3505         Pos = Cur->ValTbl;\r
3506         while(Pos < (Cur->ValTbl + Cur->ValLen))\r
3507         {\r
3508                 if((strncmp(Name, Pos, strlen(Name)) == 0) &&\r
3509                    (*(Pos + strlen(Name)) == '='))\r
3510                 {\r
3511                         Ret = Pos + strlen(Name) + 1;\r
3512                         break;\r
3513                 }\r
3514                 Pos += strlen(Pos) + 1;\r
3515         }\r
3516         return(Ret);\r
3517 }\r
3518 \r
3519 \r
3520 /*----------- パスワードの妥当性を確認する ------------------------------------\r
3521 *\r
3522 *       Parameter\r
3523 *               char *Password: パスワード文字列\r
3524 *               char *HashStr: SHA-1ハッシュ文字列\r
3525 *\r
3526 *       Return Value\r
3527 *               int 0 不一致\r
3528 *                       1: 一致\r
3529 *                       2: 異常\r
3530 *----------------------------------------------------------------------------*/\r
3531 // 全設定暗号化対応\r
3532 //int CheckPasswordValidity( char* Password, int length, const char* HashStr )\r
3533 int CheckPasswordValidity( char* Password, int length, const char* HashStr, int StretchCount )\r
3534 {\r
3535         char Buf[MAX_PASSWORD_LEN + 32];\r
3536         ulong hash1[5];\r
3537         ulong hash2[5];\r
3538         \r
3539         int i, j;\r
3540         \r
3541         const char* p = HashStr;\r
3542         \r
3543         /* 空文字列は一致したことにする */\r
3544         if( HashStr[0] == NUL ) return 1;\r
3545 \r
3546         /* Hashをチェックするする*/\r
3547         if( strlen(HashStr) != 40 )     return 2;\r
3548 \r
3549         /* Hashをデコードする*/\r
3550         for( i = 0; i < 5; i++ ){\r
3551                 ulong decode = 0;\r
3552                 for( j = 0; j < 8; j++ ){\r
3553                         if( *p < 0x40 || 0x40 + 15 < *p ){\r
3554                                 return 2;\r
3555                         }\r
3556                         decode = (decode << 4 ) + (*p - 0x40);\r
3557                         ++p;\r
3558                 }\r
3559                 hash1[i] = decode;\r
3560         }\r
3561         \r
3562         /* Password をハッシュする */\r
3563         sha_memory( Password, length, hash2 );\r
3564         for(i = 0; i < StretchCount; i++)\r
3565         {\r
3566                 memcpy(&Buf[0], &hash2, 20);\r
3567                 memcpy(&Buf[20], Password, length);\r
3568                 sha_memory(Buf, 20 + length, hash2);\r
3569         }\r
3570         \r
3571         if( memcmp( (char*)hash1, (char*)hash2, sizeof( hash1 )) == 0 ){\r
3572                 return 1;\r
3573         }\r
3574         return 0;\r
3575 }\r
3576 \r
3577 /*----------- パスワードの妥当性チェックのための文字列を作成する ------------\r
3578 *\r
3579 *       Parameter\r
3580 *               char *Password: パスワード文字列\r
3581 *               char *Str: SHA-1ハッシュ文字列格納場所 (41bytes以上)\r
3582 *\r
3583 *       Return Value\r
3584 *               None\r
3585 *----------------------------------------------------------------------------*/\r
3586 // 全設定暗号化対応\r
3587 //void CreatePasswordHash( char* Password, int length, char* HashStr )\r
3588 void CreatePasswordHash( char* Password, int length, char* HashStr, int StretchCount )\r
3589 {\r
3590         char Buf[MAX_PASSWORD_LEN + 32];\r
3591         ulong hash[5];\r
3592         int i, j;\r
3593         unsigned char *p = (unsigned char *)HashStr;\r
3594 \r
3595         sha_memory( Password, length, hash );\r
3596         for(i = 0; i < StretchCount; i++)\r
3597         {\r
3598                 memcpy(&Buf[0], &hash, 20);\r
3599                 memcpy(&Buf[20], Password, length);\r
3600                 sha_memory(Buf, 20 + length, hash);\r
3601         }\r
3602 \r
3603         for( i = 0; i < 5; i++ ){\r
3604                 ulong rest = hash[i];\r
3605                 for( j = 0; j < 8; j++ ){\r
3606                         *p++ = (unsigned char)((rest & 0xf0000000) >> 28) + '@';\r
3607                         rest <<= 4;\r
3608                 }\r
3609         }\r
3610         *p = NUL;\r
3611 }\r
3612 \r
3613 void SetHashSalt( DWORD salt )\r
3614 {\r
3615         // 全設定暗号化対応\r
3616 //      unsigned char* pos = &SecretKey[strlen(SecretKey) + 1];\r
3617         unsigned char c[4];\r
3618         unsigned char* pos = &c[0];\r
3619         *pos++ = ( salt >> 24 ) & 0xff;\r
3620         *pos++ = ( salt >> 16 ) & 0xff;\r
3621         *pos++ = ( salt >>  8 ) & 0xff;\r
3622         *pos++ = ( salt       ) & 0xff;\r
3623         \r
3624 //      SecretKeyLength = strlen( SecretKey ) + 5;\r
3625         SetHashSalt1(&c, 4);\r
3626 }\r
3627 \r
3628 // 全設定暗号化対応\r
3629 void SetHashSalt1(void* Salt, int Length)\r
3630 {\r
3631         void* p;\r
3632         if(Salt != NULL)\r
3633         {\r
3634                 p = &SecretKey[strlen(SecretKey) + 1];\r
3635                 memcpy(p, Salt, Length);\r
3636                 SecretKeyLength = (int)strlen(SecretKey) + 1 + Length;\r
3637         }\r
3638         else\r
3639                 SecretKeyLength = (int)strlen(SecretKey) + 1;\r
3640 }\r
3641 \r
3642 \r
3643 /*----------- 乱数生成をする -------------------------------------------------\r
3644 *\r
3645 *       Parameter\r
3646 *\r
3647 *       Return Value\r
3648 *               ランダムな値:コンパイラVS2005/動作環境WinXP以上では rand_s から取得する\r
3649 *----------------------------------------------------------------------------*/\r
3650 DWORD GetRandamDWORDValue(void)\r
3651 {\r
3652         DWORD rndValue;\r
3653         int errorCode;\r
3654 #ifdef _CRT_RAND_S\r
3655         errno_t errnoRand_s;\r
3656         errnoRand_s = rand_s(&rndValue);\r
3657         errorCode = (0 != errnoRand_s ? 1 : 0);\r
3658 #else\r
3659         errorCode = 1;\r
3660 #endif\r
3661         if(0 != errorCode){\r
3662 #ifdef USE_RANDAM_C_RAND\r
3663                 rndValue = rand() | (rand() << 16);\r
3664 #else\r
3665                 /* rand() のかわりに、SHA-1とパフォーマンスカウンタを用いる */\r
3666                 ulong shaValue[5];\r
3667                 LARGE_INTEGER Counter;\r
3668                 \r
3669                 if(0 == IsRndSourceInit){\r
3670                         /* 初回取得時 */\r
3671                         HANDLE CurProcHandle;\r
3672                         HANDLE CurThreadHandle;\r
3673                         \r
3674                         if(DuplicateHandle(GetCurrentProcess(), GetCurrentProcess(), GetCurrentProcess(),\r
3675                                 &CurProcHandle, 0, FALSE, DUPLICATE_SAME_ACCESS))\r
3676                         {\r
3677                                 CloseHandle(CurProcHandle);\r
3678                         }\r
3679                         if(DuplicateHandle(GetCurrentProcess(), GetCurrentThread(), GetCurrentProcess(),\r
3680                                 &CurThreadHandle, 0, FALSE, DUPLICATE_SAME_ACCESS))\r
3681                         {\r
3682                                 CloseHandle(CurThreadHandle);\r
3683                         }\r
3684                         \r
3685                         /* _WIN64 では64bitだが、その場合はrand_sが大抵利用可能なのでここでは32bitのみ用いる */\r
3686                         RndSource[0] = (ulong)CurProcHandle;\r
3687                         RndSource[1] = (ulong)CurThreadHandle;\r
3688                         RndSource[2] = (ulong)GetTickCount();\r
3689                         RndSource[3] = (ulong)timeGetTime();\r
3690                         RndSource[4] = 0; /* カウントアップ */\r
3691                         RndSource[5] = RndSource[3] + 1;\r
3692                         IsRndSourceInit = 1;\r
3693                 }\r
3694                 RndSource[4]++;\r
3695                 RndSource[5] += 0x00010010;\r
3696                 if(QueryPerformanceCounter(&Counter)){\r
3697                         RndSource[6] = Counter.LowPart;\r
3698                         RndSource[7] = Counter.HighPart;\r
3699                         RndSource[8] = (ulong)rand();\r
3700                 }else{\r
3701                         RndSource[6] = (ulong)timeGetTime();\r
3702                         RndSource[7] = (ulong)rand();\r
3703                         RndSource[8] = (ulong)rand();\r
3704                 }\r
3705                 \r
3706                 sha_memory((char *)RndSource, sizeof(RndSource), shaValue);\r
3707                 rndValue = shaValue[0] ^ shaValue[1] ^ shaValue[2] ^ shaValue[3] ^ shaValue[4];\r
3708 #endif\r
3709         }\r
3710         return rndValue;\r
3711 }\r
3712 \r
3713 // 全設定暗号化対応\r
3714 void GetMaskWithHMACSHA1(DWORD Nonce, const char* Salt, int SaltLength, void* pHash)\r
3715 {\r
3716         BYTE Key[FMAX_PATH*2+1];\r
3717         ulong Hash[5];\r
3718         DWORD i;\r
3719         for(i = 0; i < 16; i++)\r
3720         {\r
3721                 Nonce = ~Nonce;\r
3722                 Nonce *= 1566083941;\r
3723                 Nonce = _byteswap_ulong(Nonce);\r
3724                 memcpy(&Key[i * 4], &Nonce, 4);\r
3725         }\r
3726         memcpy(&Key[64], Salt, SaltLength);\r
3727         memcpy(&Key[64 + SaltLength], SecretKey, SecretKeyLength);\r
3728         sha_memory((char*)&Key, 64 + SaltLength + SecretKeyLength, Hash);\r
3729         // sha.cはビッグエンディアンのため\r
3730         for(i = 0; i < 5; i++)\r
3731                 Hash[i] = _byteswap_ulong(Hash[i]);\r
3732         memcpy(&Key[0], &Hash, 20);\r
3733         memset(&Key[20], 0, 44);\r
3734         for(i = 0; i < 64; i++)\r
3735                 Key[i] ^= 0x36;\r
3736         sha_memory((char*)&Key, 64, Hash);\r
3737         // sha.cはビッグエンディアンのため\r
3738         for(i = 0; i < 5; i++)\r
3739                 Hash[i] = _byteswap_ulong(Hash[i]);\r
3740         memcpy(&Key[64], &Hash, 20);\r
3741         for(i = 0; i < 64; i++)\r
3742                 Key[i] ^= 0x6a;\r
3743         sha_memory((char*)&Key, 84, Hash);\r
3744         // sha.cはビッグエンディアンのため\r
3745         for(i = 0; i < 5; i++)\r
3746                 Hash[i] = _byteswap_ulong(Hash[i]);\r
3747         memcpy(pHash, &Hash, 20);\r
3748 }\r
3749 \r
3750 void MaskSettingsData(const char* Salt, int SaltLength, void* Data, DWORD Size, int EscapeZero)\r
3751 {\r
3752         BYTE* p;\r
3753         DWORD i;\r
3754         BYTE Mask[20];\r
3755         p = (BYTE*)Data;\r
3756         for(i = 0; i < Size; i++)\r
3757         {\r
3758                 if(i % 20 == 0)\r
3759                         GetMaskWithHMACSHA1(i, Salt, SaltLength, &Mask);\r
3760                 if(EscapeZero == NO || (p[i] != 0 && p[i] != Mask[i % 20]))\r
3761                         p[i] ^= Mask[i % 20];\r
3762         }\r
3763 }\r
3764 \r
3765 void UnmaskSettingsData(const char* Salt, int SaltLength, void* Data, DWORD Size, int EscapeZero)\r
3766 {\r
3767         MaskSettingsData(Salt, SaltLength, Data, Size, EscapeZero);\r
3768 }\r
3769 \r
3770 void CalculateSettingsDataChecksum(void* Data, DWORD Size)\r
3771 {\r
3772         ulong Hash[5];\r
3773         DWORD i;\r
3774         BYTE Mask[20];\r
3775         sha_memory((char*)Data, Size, Hash);\r
3776         // sha.cはビッグエンディアンのため\r
3777         for(i = 0; i < 5; i++)\r
3778                 Hash[i] = _byteswap_ulong(Hash[i]);\r
3779         memcpy(&Mask, &Hash, 20);\r
3780         for(i = 0; i < 20; i++)\r
3781                 EncryptSettingsChecksum[i] ^= Mask[i];\r
3782 }\r
3783 \r
3784 // ポータブル版判定\r
3785 int IsRegAvailable()\r
3786 {\r
3787         int Sts;\r
3788         void* h;\r
3789         Sts = NO;\r
3790         SetRegType(REGTYPE_REG);\r
3791         if(OpenReg("FFFTP", &h) == FFFTP_SUCCESS)\r
3792         {\r
3793                 CloseReg(h);\r
3794                 Sts = YES;\r
3795         }\r
3796         return Sts;\r
3797 }\r
3798 \r
3799 int IsIniAvailable()\r
3800 {\r
3801         int Sts;\r
3802         void* h;\r
3803         Sts = NO;\r
3804         SetRegType(REGTYPE_INI);\r
3805         if(OpenReg("FFFTP", &h) == FFFTP_SUCCESS)\r
3806         {\r
3807                 CloseReg(h);\r
3808                 Sts = YES;\r
3809         }\r
3810         return Sts;\r
3811 }\r
3812 \r
3813 // バージョン確認\r
3814 int ReadSettingsVersion()\r
3815 {\r
3816         void *hKey3;\r
3817         int i;\r
3818         int Version;\r
3819 \r
3820         SetRegType(REGTYPE_INI);\r
3821         if((i = OpenReg("FFFTP", &hKey3)) != FFFTP_SUCCESS)\r
3822         {\r
3823                 if(AskForceIni() == NO)\r
3824                 {\r
3825                         SetRegType(REGTYPE_REG);\r
3826                         i = OpenReg("FFFTP", &hKey3);\r
3827                 }\r
3828         }\r
3829         Version = INT_MAX;\r
3830         if(i == FFFTP_SUCCESS)\r
3831         {\r
3832                 ReadIntValueFromReg(hKey3, "Version", &Version);\r
3833                 CloseReg(hKey3);\r
3834         }\r
3835         return Version;\r
3836 }\r
3837 \r
3838 // FileZilla XML形式エクスポート対応\r
3839 void SaveSettingsToFileZillaXml()\r
3840 {\r
3841         char Fname[FMAX_PATH+1];\r
3842         FILE* f;\r
3843         TIME_ZONE_INFORMATION tzi;\r
3844         int Level;\r
3845         int i;\r
3846         HOSTDATA Host;\r
3847         char Tmp[FMAX_PATH+1];\r
3848         char* p1;\r
3849         char* p2;\r
3850         strcpy(Fname, "FileZilla.xml");\r
3851         if(SelectFile(GetMainHwnd(), Fname, MSGJPN286, MSGJPN356, "xml", OFN_EXTENSIONDIFFERENT | OFN_OVERWRITEPROMPT, 1) == TRUE)\r
3852         {\r
3853                 if((f = fopen(Fname, "wt")) != NULL)\r
3854                 {\r
3855                         fputs("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>\n", f);\r
3856                         fputs("<FileZilla3>\n", f);\r
3857                         fputs("<Servers>\n", f);\r
3858                         GetTimeZoneInformation(&tzi);\r
3859                         Level = 0;\r
3860                         i = 0;\r
3861                         while(CopyHostFromList(i, &Host) == FFFTP_SUCCESS)\r
3862                         {\r
3863                                 while((Host.Level & SET_LEVEL_MASK) < Level)\r
3864                                 {\r
3865                                         fputs("</Folder>\n", f);\r
3866                                         Level--;\r
3867                                 }\r
3868                                 if(Host.Level & SET_LEVEL_GROUP)\r
3869                                 {\r
3870                                         fputs("<Folder expanded=\"1\">\n", f);\r
3871                                         fprintf(f, "%s&#x0A;\n", Host.HostName);\r
3872                                         Level++;\r
3873                                 }\r
3874                                 else\r
3875                                 {\r
3876                                         fputs("<Server>\n", f);\r
3877                                         fprintf(f, "<Host>%s</Host>\n", Host.HostAdrs);\r
3878                                         fprintf(f, "<Port>%d</Port>\n", Host.Port);\r
3879                                         if(Host.UseNoEncryption == YES)\r
3880                                                 fprintf(f, "<Protocol>%s</Protocol>\n", "0");\r
3881                                         else if(Host.UseFTPES == YES)\r
3882                                                 fprintf(f, "<Protocol>%s</Protocol>\n", "4");\r
3883                                         else if(Host.UseFTPIS == YES)\r
3884                                                 fprintf(f, "<Protocol>%s</Protocol>\n", "3");\r
3885                                         else\r
3886                                                 fprintf(f, "<Protocol>%s</Protocol>\n", "0");\r
3887                                         fprintf(f, "<Type>%s</Type>\n", "0");\r
3888                                         fprintf(f, "<User>%s</User>\n", Host.UserName);\r
3889                                         fprintf(f, "<Pass>%s</Pass>\n", Host.PassWord);\r
3890                                         fprintf(f, "<Account>%s</Account>\n", Host.Account);\r
3891                                         if(Host.Anonymous == YES || strlen(Host.UserName) == 0)\r
3892                                                 fprintf(f, "<Logontype>%s</Logontype>\n", "0");\r
3893                                         else\r
3894                                                 fprintf(f, "<Logontype>%s</Logontype>\n", "1");\r
3895                                         fprintf(f, "<TimezoneOffset>%d</TimezoneOffset>\n", tzi.Bias + Host.TimeZone * 60);\r
3896                                         if(Host.Pasv == YES)\r
3897                                                 fprintf(f, "<PasvMode>%s</PasvMode>\n", "MODE_PASSIVE");\r
3898                                         else\r
3899                                                 fprintf(f, "<PasvMode>%s</PasvMode>\n", "MODE_ACTIVE");\r
3900                                         fprintf(f, "<MaximumMultipleConnections>%d</MaximumMultipleConnections>\n", Host.MaxThreadCount);\r
3901                                         switch(Host.NameKanjiCode)\r
3902                                         {\r
3903                                         case KANJI_SJIS:\r
3904                                                 fprintf(f, "<EncodingType>%s</EncodingType>\n", "Custom");\r
3905                                                 fprintf(f, "<CustomEncoding>%s</CustomEncoding>\n", "Shift_JIS");\r
3906                                                 break;\r
3907                                         case KANJI_JIS:\r
3908                                                 // 非対応\r
3909                                                 fprintf(f, "<EncodingType>%s</EncodingType>\n", "Auto");\r
3910                                                 break;\r
3911                                         case KANJI_EUC:\r
3912                                                 fprintf(f, "<EncodingType>%s</EncodingType>\n", "Custom");\r
3913                                                 fprintf(f, "<CustomEncoding>%s</CustomEncoding>\n", "EUC-JP");\r
3914                                                 break;\r
3915                                         case KANJI_SMB_HEX:\r
3916                                                 // 非対応\r
3917                                                 fprintf(f, "<EncodingType>%s</EncodingType>\n", "Auto");\r
3918                                                 break;\r
3919                                         case KANJI_SMB_CAP:\r
3920                                                 // 非対応\r
3921                                                 fprintf(f, "<EncodingType>%s</EncodingType>\n", "Auto");\r
3922                                                 break;\r
3923                                         case KANJI_UTF8N:\r
3924                                                 fprintf(f, "<EncodingType>%s</EncodingType>\n", "UTF-8");\r
3925                                                 break;\r
3926                                         case KANJI_UTF8HFSX:\r
3927                                                 // 非対応\r
3928                                                 fprintf(f, "<EncodingType>%s</EncodingType>\n", "Auto");\r
3929                                                 break;\r
3930                                         default:\r
3931                                                 fprintf(f, "<EncodingType>%s</EncodingType>\n", "Auto");\r
3932                                                 break;\r
3933                                         }\r
3934                                         if(Host.FireWall == YES)\r
3935                                                 fprintf(f, "<BypassProxy>%s</BypassProxy>\n", "0");\r
3936                                         else\r
3937                                                 fprintf(f, "<BypassProxy>%s</BypassProxy>\n", "1");\r
3938                                         fprintf(f, "<Name>%s</Name>\n", Host.HostName);\r
3939                                         fprintf(f, "<LocalDir>%s</LocalDir>\n", Host.LocalInitDir);\r
3940                                         if(strchr(Host.RemoteInitDir, '\\') != NULL)\r
3941                                         {\r
3942                                                 fputs("<RemoteDir>", f);\r
3943                                                 fputs("8 0", f);\r
3944                                                 strcpy(Tmp, Host.RemoteInitDir);\r
3945                                                 p1 = Tmp;\r
3946                                                 while(*p1 != '\0')\r
3947                                                 {\r
3948                                                         while(*p1 == '\\')\r
3949                                                         {\r
3950                                                                 p1++;\r
3951                                                         }\r
3952                                                         if((p2 = strchr(p1, '\\')) != NULL)\r
3953                                                         {\r
3954                                                                 *p2 = '\0';\r
3955                                                                 p2++;\r
3956                                                         }\r
3957                                                         else\r
3958                                                                 p2 = strchr(p1, '\0');\r
3959                                                         if(*p1 != '\0')\r
3960                                                                 fprintf(f, " %d %s", _mbslen(p1), p1);\r
3961                                                         p1 = p2;\r
3962                                                 }\r
3963                                                 fputs("</RemoteDir>\n", f);\r
3964                                         }\r
3965                                         else if(strchr(Host.RemoteInitDir, '/') != NULL)\r
3966                                         {\r
3967                                                 fputs("<RemoteDir>", f);\r
3968                                                 fputs("1 0", f);\r
3969                                                 strcpy(Tmp, Host.RemoteInitDir);\r
3970                                                 p1 = Tmp;\r
3971                                                 while(*p1 != '\0')\r
3972                                                 {\r
3973                                                         while(*p1 == '/')\r
3974                                                         {\r
3975                                                                 p1++;\r
3976                                                         }\r
3977                                                         if((p2 = strchr(p1, '/')) != NULL)\r
3978                                                         {\r
3979                                                                 *p2 = '\0';\r
3980                                                                 p2++;\r
3981                                                         }\r
3982                                                         else\r
3983                                                                 p2 = strchr(p1, '\0');\r
3984                                                         if(*p1 != '\0')\r
3985                                                                 fprintf(f, " %d %s", _mbslen(p1), p1);\r
3986                                                         p1 = p2;\r
3987                                                 }\r
3988                                                 fputs("</RemoteDir>\n", f);\r
3989                                         }\r
3990                                         else\r
3991                                                 fprintf(f, "<RemoteDir>%s</RemoteDir>\n", Host.RemoteInitDir);\r
3992                                         if(Host.SyncMove == YES)\r
3993                                                 fprintf(f, "<SyncBrowsing>%s</SyncBrowsing>\n", "1");\r
3994                                         else\r
3995                                                 fprintf(f, "<SyncBrowsing>%s</SyncBrowsing>\n", "0");\r
3996                                         fprintf(f, "%s&#x0A;\n", Host.HostName);\r
3997                                         fputs("</Server>\n", f);\r
3998                                 }\r
3999                                 i++;\r
4000                         }\r
4001                         while(Level > 0)\r
4002                         {\r
4003                                 fputs("</Folder>\n", f);\r
4004                                 Level--;\r
4005                         }\r
4006                         fputs("</Servers>\n", f);\r
4007                         // TODO: 環境設定\r
4008 //                      fputs("<Settings>\n", f);\r
4009 //                      fputs("</Settings>\n", f);\r
4010                         fputs("</FileZilla3>\n", f);\r
4011                         fclose(f);\r
4012                 }\r
4013                 else\r
4014                         MessageBox(GetMainHwnd(), MSGJPN357, "FFFTP", MB_OK | MB_ICONERROR);\r
4015         }\r
4016 }\r
4017 \r