// MainMenu.cpp :
// メインウインドウのメニューから呼び出されるモジュール

#include "stdafx.h"
#include "RNSF7.h"
#include "MainWindow.h"
#include "MainMenu.h"
#include "opendlg.h"

bool backupRegistry(HWND hWnd)
{
	RegFlushKey(HKEY_LOCAL_MACHINE);
	RegFlushKey(HKEY_CURRENT_USER);
	if (isNT) { // Windows 2000/XP
		if (IDYES == MessageBox(hWnd, (winver > 500)?"Windows付属の「バックアップ」を呼び出します。\n「バックアップ」から「バックアップウィザード」を起動し、「システム状態データのみのバックアップ」を選べば、レジストリのバックアップを作ることができます。\n\n「バックアップ」の使い方については、Windowsのマニュアルかヘルプを参照して下さい。\n「バックアップ」を起動しますか?":
		                                             "Windows 2000付属の「バックアップ」で、システム状態のバックアップを行います。\nこのあと表示されるダイアログで、バックアップ先ファイル名を設定してください。\n\n「バックアップ」の詳細は、Windowsのマニュアルかヘルプを参照して下さい。\n「バックアップ」を起動しますか?", "レジストリのバックアップ", MB_YESNO | MB_ICONQUESTION)) {
		    char ntbackup[MAX_PATH*2];
			char bkfname[MAX_PATH*2] = "";
			char ntbparam[MAX_PATH*2 + 100] = "";

			if (winver == 500) {
				if (saveDialog(hWnd, "バックアップファイル(*.bkf)\0*.bkf\0すべてのファイル(*.*)\0*.*\0\0", bkfname, _countof(bkfname), "バックアップ先ファイル名の設定", "bkf")) {
					wsprintf(ntbparam, "Backup SystemState /l:f /m normal /rs:no /a /d \"いじくるつくーるによって作成\" /f \"%s\"", bkfname);
				}
				else {
					return true;
				}
			}
				
			GetSystemDirectory(ntbackup, _countof(ntbackup));
            lstrcat(ntbackup, "\\NTBACKUP.EXE");
			if ((HINSTANCE)32 >= ShellExecute(hWnd, "open", ntbackup, (winver > 500) ? NULL : ntbparam, NULL, SW_SHOWNORMAL)) {
				MessageBox(hWnd, (winver > 500)?"「バックアップ」の起動に失敗しました。\nWindows XP Professional/Server 2003では、Ntbackup.exeが正しくインストールされているかどうか確認して下さい。\nWindows XP Home Editionでは、次の手順により、手動でNtbackup.exeをインストールして下さい。\n\n1. Windows CD-ROM中の\\VALUEADD\\MSFT\\NTBACKUP\\Ntbackup.msi をダブルクリックし、インストールウィザードを起動する。\n2. 画面の指示に従ってインストールを行います。":
			                                    "「バックアップ」の起動に失敗しました。\nNtbackup.exeが正しくインストールされているかどうか確認して下さい。", "レジストリのバックアップ", MB_OK | MB_ICONSTOP);
				return false;
			}
			else {
				return true;
			}
		}
	}
#if _MSC_VER < 1500
#ifndef _WIN64
	else if (winver >= 410) { // Windows 98/Me
		if (IDYES == MessageBox(hWnd, "Windows 98/Me付属の「レジストリチェッカー」を呼び出します。\nレジストリチェッカーはWindows起動時に毎回、レジストリのチェックとバックアップの作成を行っています。\n\nここでレジストリチェッカーを起動すると、今の時点でのレジストリのバックアップを取ることができます。\n「レジストリチェッカー」を起動しますか?", "レジストリチェッカー", MB_YESNO | MB_ICONQUESTION)) {
			if ((HINSTANCE)32 >= ShellExecute(hWnd,"open","SCANREGW.EXE",NULL,NULL,SW_SHOWNORMAL)) {
				MessageBox(hWnd, "「レジストリチェッカー」の起動に失敗しました。", "レジストリのバックアップ", MB_OK | MB_ICONSTOP);
				return false;
			}
			else {
				return true;
			}
		}
	}
#if 0
	else { // Windows 95
		if (IDYES == MessageBox(hWnd, "レジストリファイル(System.datとUser.dat)のバックアップを行います。\nProfilesフォルダがある場合は、この中のUser.datもバックアップします。\nバックアップ先のフォルダは\\Rnbackupです。\nすでにこのツールによりバックアップが行われている場合、前回のバックアップデータは今回のバックアップデータで上書きされます。\n\nレジストリファイルのバックアップを行いますか?", "レジストリバックアップ", MB_YESNO | MB_ICONQUESTION)) {
			// \RNBACKUP フォルダに、Windowsフォルダ下にある全てのsystem.dat, user.datのコピーを行う。
			// \RNBACKUP.BAT という名前で、自動復元のためのバッチファイルを作る。
			char windir[MAX_PATH*2], rnbackup[MAX_PATH*2], rnbackup_bat[MAX_PATH*2];
			char dstfile[MAX_PATH*2], srcfile[MAX_PATH*2];
			HANDLE hFileBat, hFff;
			WIN32_FIND_DATA520 wfd;
			DWORD dwNum;

			GetWindowsDirectory(windir, _countof(windir));
			lstrcpy(rnbackup, windir);
			lstrcpy(rnbackup+3, "RNBACKUP");
			CreateDirectory(rnbackup, NULL);

			// Windowsフォルダのショートファイル名を得る(Win95が対象なので、ショートファイル名は必ずあるはずだし、そもそもrnbackupはDOSコマンドで実行されるモノだから、ショートファイル名は必須)
			GetShortPathName(windir, windir, _countof(windir));

			// Rnbackup.batのフルパスを生成
			lstrcpy(rnbackup_bat, rnbackup);
			lstrcat(rnbackup_bat, ".BAT");

			// Rnbackup.batをオープン
			if (INVALID_HANDLE_VALUE == (hFileBat = CreateFile(rnbackup_bat,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL))) {
				MessageBox(hWnd, "復元のためのバッチファイル(\\Rnbackup.bat)を作成できませんでした。レジストリファイルのバックアップ作業は続行します。", "レジストリのバックアップ", MB_OK | MB_ICONEXCLAMATION);
				return false;
			}
			else {
				const char *wbuf = "@ECHO OFF\r\nECHO レジストリファイルの復元を行います。\r\nECHO 復元を中断する場合は、Ctrl+Cキーを押して下さい。\r\nPAUSE\r\nECHO レジストリファイルを復元しています...\r\n";
				WriteFile(hFileBat,wbuf,lstrlen(wbuf),&dwNum,NULL);
			}

			// Windows\SYSTEM.DATをコピー
			lstrcpy(srcfile,windir);   lstrcat(srcfile,"\\SYSTEM.DAT");
			lstrcpy(dstfile,rnbackup); lstrcat(dstfile,"\\SYSTEM.DAT");
			SetFileAttributes(dstfile, FILE_ATTRIBUTE_NORMAL);
			if (CopyFile(srcfile, dstfile, FALSE)) {
				SetFileAttributes(dstfile, FILE_ATTRIBUTE_NORMAL);
				// RNBACKUP.BATへの復元コマンドの書き込み
				if (hFileBat != INVALID_HANDLE_VALUE) {
					WriteFile(hFileBat,"ATTRIB -R -S -H > NUL ",22,&dwNum,NULL);
					WriteFile(hFileBat,srcfile,lstrlen(srcfile),&dwNum,NULL);
					WriteFile(hFileBat,"\r\nCOPY ",7,&dwNum,NULL);
					WriteFile(hFileBat,dstfile,lstrlen(dstfile),&dwNum,NULL);
					WriteFile(hFileBat," ",1,&dwNum,NULL);
					WriteFile(hFileBat,srcfile,lstrlen(srcfile),&dwNum,NULL);
					WriteFile(hFileBat,"\r\nATTRIB +R +H -A ",18,&dwNum,NULL);
					WriteFile(hFileBat,srcfile,lstrlen(srcfile),&dwNum,NULL);
					WriteFile(hFileBat,"\r\n",2,&dwNum,NULL);
				}
			}
			else {
				MessageBox(hWnd, "SYSTEM.DATのコピーに失敗しました。\nバックアップ作業は続行します。", "レジストリのバックアップ", MB_OK | MB_ICONSTOP);
			}

			// Windows\USER.DATをコピー
			lstrcpy(srcfile,windir);   lstrcat(srcfile,"\\USER.DAT");
			lstrcpy(dstfile,rnbackup); lstrcat(dstfile,"\\USER.DAT");
			SetFileAttributes(dstfile, FILE_ATTRIBUTE_NORMAL);
			if (CopyFile(srcfile, dstfile, FALSE)) {
				SetFileAttributes(dstfile, FILE_ATTRIBUTE_NORMAL);
				// RNBACKUP.BATへの復元コマンドの書き込み
				if (hFileBat != INVALID_HANDLE_VALUE) {
					WriteFile(hFileBat,"ATTRIB -R -S -H > NUL ",22,&dwNum,NULL);
					WriteFile(hFileBat,srcfile,lstrlen(srcfile),&dwNum,NULL);
					WriteFile(hFileBat,"\r\nCOPY ",7,&dwNum,NULL);
					WriteFile(hFileBat,dstfile,lstrlen(dstfile),&dwNum,NULL);
					WriteFile(hFileBat," ",1,&dwNum,NULL);
					WriteFile(hFileBat,srcfile,lstrlen(srcfile),&dwNum,NULL);
					WriteFile(hFileBat,"\r\nATTRIB +R +H -A ",18,&dwNum,NULL);
					WriteFile(hFileBat,srcfile,lstrlen(srcfile),&dwNum,NULL);
					WriteFile(hFileBat,"\r\n",2,&dwNum,NULL);
				}
			}
			else {
				MessageBox(hWnd, "USER.DATのコピーに失敗しました。\nバックアップ作業は続行します。", "レジストリのバックアップ", MB_OK | MB_ICONSTOP);
			}

			lstrcat(windir,"\\PROFILES");

			// Windows\Profile ディレクトリが存在するかどうかチェックする
			if (INVALID_HANDLE_VALUE  != (hFff = FindFirstFile520(windir, &wfd))) {
				FindClose(hFff);
				if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
					char windir_profiles_alldir[MAX_PATH*2];

					// まずは RNBACKUP\Profiles を作成
					lstrcat(rnbackup,"\\PROFILES");
					CreateDirectory(rnbackup, NULL);

					lstrcpy(windir_profiles_alldir, windir);
					lstrcat(windir_profiles_alldir, "\\*.*");

					// Windows\Profiles\*.* を検索し、中のUSER.DATをコピー
					if (INVALID_HANDLE_VALUE  != (hFff = FindFirstFile520(windir_profiles_alldir, &wfd))) {
						do {
							if ((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && strcmp(wfd.cFileName,".") != 0 && strcmp(wfd.cFileName,"..") != 0) {
								// Windows\Profiles\(User)\User.dat フルパスを生成
								lstrcpy(srcfile, windir);
								lstrcat(srcfile, "\\");
								lstrcat(srcfile, wfd.cFileName);
								lstrcat(srcfile, "\\USER.DAT");

								// Rnbackup\Profiles\(User)\User.dat コピー先ファイル名を生成
								lstrcpy(dstfile, rnbackup);
								lstrcat(dstfile, "\\");
								lstrcat(dstfile, wfd.cFileName);
								if (CreateDirectory(dstfile, NULL)) { // ディレクトリ生成
									lstrcat(dstfile, "\\USER.DAT");

									// コピー
									SetFileAttributes(dstfile, FILE_ATTRIBUTE_NORMAL);
									if (CopyFile(srcfile, dstfile, FALSE)) {
										SetFileAttributes(dstfile, FILE_ATTRIBUTE_NORMAL);
										// RNBACKUP.BATへの復元コマンドの書き込み
										if (hFileBat != INVALID_HANDLE_VALUE) {
											GetShortPathName(srcfile, srcfile, _countof(srcfile)); // ショートファイル名を得る(Win95が対象なので、ショートファイル名は必ずあるはずだし、そもそもrnbackupはDOSコマンドで実行されるモノだから、ショートファイル名は必須)
											GetShortPathName(dstfile, dstfile, _countof(dstfile)); // ショートファイル名を得る(Win95が対象なので、ショートファイル名は必ずあるはずだし、そもそもrnbackupはDOSコマンドで実行されるモノだから、ショートファイル名は必須)
											WriteFile(hFileBat,"ATTRIB -R -S -H > NUL ",22,&dwNum,NULL);
											WriteFile(hFileBat,srcfile,lstrlen(srcfile),&dwNum,NULL);
											WriteFile(hFileBat,"\r\nCOPY ",7,&dwNum,NULL);
											WriteFile(hFileBat,dstfile,lstrlen(dstfile),&dwNum,NULL);
											WriteFile(hFileBat," ",1,&dwNum,NULL);
											WriteFile(hFileBat,srcfile,lstrlen(srcfile),&dwNum,NULL);
											WriteFile(hFileBat,"\r\nATTRIB +R +H -A ",18,&dwNum,NULL);
											WriteFile(hFileBat,srcfile,lstrlen(srcfile),&dwNum,NULL);
											WriteFile(hFileBat,"\r\n",2,&dwNum,NULL);
										}
									}
								}
							}
						} while( FindNextFile520(hFff, &wfd) );
						FindClose(hFff);
					}
				}
			}

			if (hFileBat != INVALID_HANDLE_VALUE) {
				const char *wbuf = "ECHO レジストリファイルの復元が終了しました。Ctrl+Alt+Delを押して、コンピュータを再起動して下さい。\r\n";

				WriteFile(hFileBat,wbuf,lstrlen(wbuf),&dwNum,NULL);
				CloseHandle(hFileBat);
				MessageBox(hWnd, "レジストリのバックアップが終了しました。\n復元の方法は、[ツール]メニューから[レジストリの復元]を選ぶと、見ることができます。", "レジストリのバックアップ", MB_OK | MB_ICONINFORMATION);
			}
			else {
				MessageBox(hWnd, "レジストリのバックアップが終了しました。\nただし、バックアップ途中で自動復元用のバッチファイルの作成に失敗したため、復元は手動で行う必要があるかもしれません。\n\n復元の方法は、[ツール]メニューから[レジストリの復元]を選ぶと、見ることができます。", "レジストリのバックアップ", MB_OK | MB_ICONINFORMATION);
			}
			return true;
		}
	}
#endif
#endif /* _WIN64 */
#endif // _MSC_VER < 1500
	return true;
}

bool restoreRegistry(HWND hWnd)
{
	RegFlushKey(HKEY_LOCAL_MACHINE);
	RegFlushKey(HKEY_CURRENT_USER);
	if (isNT) {
		/*if (winver == 500) {
			MessageBox(hWnd, "Windows 2000で、あらかじめバックアップしておいたレジストリの復元を行うには、Windows 2000のCD-ROMまたはセットアップディスクを使います。\n「セットアップへようこそ」が表示されたところでRを押します。\n\n詳しくはWindowsのヘルプかマニュアルを参照して下さい。", "レジストリのリストア",MB_OK | MB_ICONINFORMATION);
			return true;
		}
		else*/ { // Windows 2000/XP
			if (IDYES == MessageBox(hWnd, "Windows付属の「バックアップ」を呼び出します。\n以前に「バックアップ」で作成したレジストリデータから復元するには、復元ウィザードを利用します。\n\n「バックアップ」の使い方については、Windowsのマニュアルかヘルプを参照して下さい。\n「バックアップ」を起動しますか?", "レジストリのリストア", MB_YESNO | MB_ICONQUESTION)) {
			    char ntbackup[MAX_PATH*2];

				GetSystemDirectory(ntbackup, _countof(ntbackup));
	            lstrcat(ntbackup, "\\NTBACKUP.EXE");
				if ((HINSTANCE)32 >= ShellExecute(hWnd,"open",ntbackup,NULL,NULL,SW_SHOWNORMAL)) {
					MessageBox(hWnd,  (winver > 500)?"「バックアップ」の起動に失敗しました。\nWindows XP Professional/Server 2003では、Ntbackup.exeが正しくインストールされているかどうか、確認して下さい。\nWindows XP Home Editionでは、次の手順により、手動でNtbackup.exeをインストールして下さい。\n\n1. Windows CD-ROM中の\\VALUEADD\\MSFT\\NTBACKUP\\Ntbackup.msi をダブルクリックし、インストールウィザードを起動する。\n2. 画面の指示に従ってインストールを行い、最後に[Finish]を押します。":
			                                         "「バックアップ」の起動に失敗しました。\nNtbackup.exeが正しくインストールされているかどうか確認して下さい。", "レジストリのリストア", MB_OK | MB_ICONSTOP);
					return false;
				}
				else
					return true;
			}
		}
	}
#if _MSC_VER < 1500
#ifndef _WIN64
	else if (winver == 410) { // Windows 98
		MessageBox(hWnd, "Windows 98では、Windows動作中にレジストリの復元を行うことはできません。\n次の手順によりDOSモードに移行してから復元して下さい。\n\n1.コンピュータを再起動します。\n2.Windowsのロゴが出る直前で、[Ctrl]を押しっぱなしにします。\n3.Command Prompt Only(または「コマンドプロンプトのみ」)を選択します。なお、選択はキーボードのカーソルキーとEnterキーを使って行います。\n\nDOSモードの起動に成功したら、「scanreg /restore」を入力してEnterキーを押します。復元プログラムが起動しますので、一覧の中から最新の、起動に成功したレジストリのバックアップを選んでOKを押して下さい。", "レジストリのリストア",MB_OK | MB_ICONINFORMATION);
		return true;
	}
	else if (winver >= 490) { // Windows Me
		if (IDYES == MessageBox(hWnd, "Windows Me付属の「レジストリチェッカー」を呼び出し、以前に作成したバックアップデータから、レジストリを復元することができます。\n「レジストリチェッカー」を起動しますか?", "レジストリのリストア", MB_YESNO | MB_ICONQUESTION)) {
			if ((HINSTANCE)32 >= ShellExecute(hWnd,"open","SCANREGW.EXE","/RESTORE",NULL,SW_SHOWNORMAL)) {
				MessageBox(hWnd, "「レジストリチェッカー」の起動に失敗しました。", "レジストリのリストア", MB_OK | MB_ICONSTOP);
				return true;
			}
			else
				return false;
		}
	}
#if 0
	else { // Windows 95
		MessageBox(hWnd, "Windows 95では、Windows動作中にレジストリの復元を行うことはできません。\n次の手順によりDOSモードに移行してから復元して下さい。\n\n1.コンピュータを再起動します。\n2.Starting Windows 95...(またはWindows 95を起動しています...)が表示されているところで、[F8]を押します。\n3.Command Prompt Only(または「コマンドプロンプトのみ」)を選択します。なお、選択はキーボードのカーソルキーとEnterキーを使って行います。\n\nDOSモードの起動に成功したら、「rnbackup」を入力してEnterキーを押します。復元プログラムが起動し、「レジストリバックアップ」で作成されたレジストリファイルがすべて復元されます。\n\nなお、このとき全てのレジストリファイルを復元したくない場合は、手作業でレジストリファイルのコピーを行うことにより、個別に復元できます。", "レジストリのリストア",MB_OK | MB_ICONINFORMATION);
		return true;
	}
#endif
#endif /* _WIN64 */
#endif // _MSC_VER < 1500
	return true;
}

bool systemRestore(HWND hWnd)
{
	RegFlushKey(HKEY_LOCAL_MACHINE);
	RegFlushKey(HKEY_CURRENT_USER);
#if _MSC_VER < 1500
#ifndef _WIN64
	if ( !isNT ) { // Windows Meであれば、Smgr.dllのバージョンを調べ、古ければ警告
		char smgrdll[MAX_PATH*2];
		WIN32_FIND_DATA520 ffd;
		HANDLE hFindFile;
		FILETIME LocalFileTime;
		SYSTEMTIME SystemTime;

		GetSystemDirectory(smgrdll, _countof(smgrdll));
		lstrcat(smgrdll, "\\SMGR.DLL");
		if ( INVALID_HANDLE_VALUE != (hFindFile = FindFirstFile520(smgrdll, &ffd)) ) {
			FindClose( hFindFile );
			FileTimeToLocalFileTime( &(ffd.ftLastWriteTime), &LocalFileTime );
			FileTimeToSystemTime( &LocalFileTime, &SystemTime );
			if (SystemTime.wYear < 2001 || (SystemTime.wYear == 2001 && SystemTime.wMonth < 2) || (SystemTime.wYear == 2001 && SystemTime.wMonth == 2 && SystemTime.wDay < 23)) {
				if (IDYES != MessageBox(hWnd, "「システムの復元」に不具合があり、2001年9月8日を過ぎると機能しなくなるおそれがあります。\nこの不具合を修正するには、Windows Meのパッチを当てるか、サービスパックを適用するか、Windows Updateを実行して下さい。\n\n強制的に「システムの復元」を実行したい場合は[はい]を押して下さい。強制的に実行しない場合は、[いいえ]を押し、「システムの復元」を修正してから、再度実行して下さい。", "システムの復元", MB_YESNO | MB_ICONEXCLAMATION))
					return false;
			}
		}
	}
#endif /* _WIN64 */
#endif // _MSC_VER < 1500
	if (IDYES == MessageBox(hWnd, "Windows付属の「システムの復元」を呼び出します。\n「システムの復元」は、レジストリファイルを含め、システムの重要なファイルをまとめてバックアップし、「復元ポイント」を作ることができます。\n復元ポイントは日付ごとに管理され、復元も容易です。\n\n「システムの復元」の使い方については、Windowsのマニュアルかヘルプを参照して下さい。\n「システムの復元」を起動しますか?", "システムの復元", MB_YESNO | MB_ICONQUESTION)) {
		char rstrui[MAX_PATH];

		GetSystemDirectory(rstrui, _countof(rstrui));
		lstrcat(rstrui, winver >= 600 ? "\\RSTRUI.EXE" : "\\RESTORE\\RSTRUI.EXE");
		if ((HINSTANCE)32 >= ShellExecute(hWnd,"open",rstrui,NULL,NULL,SW_SHOWNORMAL)) {
			MessageBox(hWnd, "「システムの復元」の起動に失敗しました。", "システムの復元", MB_OK | MB_ICONSTOP);
			return false;
		}
		else
			return true;
	}
	return true;
}

// 復元ポイントの作成(成功時メッセージ表示あり)( for Windows Me/XP )
bool createRestorePointManual( HWND hWnd )
{
	UINT result = 0xffffffff;
	char *pmes = "";

	RegFlushKey(HKEY_LOCAL_MACHINE);
	RegFlushKey(HKEY_CURRENT_USER);

	if (IDYES == MessageBox(hWnd, "Windows付属の「システムの復元」用に、「"SOFTWARENAME"」の名称で復元ポイントを作成します。\n「復元ポイント」は、レジストリファイルを含め、システムの重要なファイルをまとめてバックアップしておくものです。\n復元ポイントは日付ごとに管理され、復元も容易です。\n\n「システムの復元」の使い方については、Windowsのマニュアルかヘルプを参照して下さい。\n復元ポイントを作成しますか?", "復元ポイントの作成", MB_YESNO | MB_ICONQUESTION)) {
		result = createRestorePoint( SOFTWARENAME );
		switch(	result ) {
			case ERROR_SUCCESS:
				pmes = "復元ポイントを作成しました。"; //"Creating restore point is successful."
				break;

			case ERROR_BAD_ENVIRONMENT:
				pmes = "セーフモードでは復元ポイントを作成できません。"; //"The function was called in safe mode."
				break;

			case ERROR_DISK_FULL:
				pmes = "ディスクの空き容量が足りないため、復元ポイントを作成できません。"; //"System Restore is in standby mode because disk space is low."
				// warning : Windows Me -- This flag is not supported.
				break;

			case ERROR_FILE_EXISTS:
				pmes = "Wininit.iniに未解決のファイルが残されており、復元ポイントを作成できません。"; //"Pending file-rename operations exist in the file %windir%\\Wininit.ini."
				// warning : Windows Me only というか、おこりうるのか？
				break;

			case ERROR_INTERNAL_ERROR:
				pmes = "復元ポイントの作成に失敗しました。"; //"An internal error occurred."
				break;

			case ERROR_INVALID_DATA:
				pmes = "コミット時に指定されたシーケンス番号が不正です。"; //"The sequence number is invalid."
				break;

			case ERROR_SERVICE_DISABLED:
				pmes = "システムの復元機能は無効にされているため、復元ポイントは作成されませんでした。"; //"System Restore is disabled."
				break;

			case ERROR_TIMEOUT:
				pmes = "タイムアウトです"; //"The call timed out due to a wait on a mutex for setting restore points."
				break;

			default:
				pmes = "復元ポイントの作成に失敗しました。"; //"Cannot create restore point."
				break;
		}

		if ( result == ERROR_SUCCESS ) {
			MessageBox( hWnd, pmes, "復元ポイントの作成", MB_OK | MB_ICONINFORMATION );
			return true;
		}
		else {
			MessageBox( hWnd, pmes, "復元ポイントの作成", MB_OK | MB_ICONEXCLAMATION );
			return false;
		}
	}
	return false;
}

#if _MSC_VER < 1500
#ifndef _WIN64
bool optimizeRegistry(HWND hWnd)
{
	RegFlushKey(HKEY_LOCAL_MACHINE);
	RegFlushKey(HKEY_CURRENT_USER);
	if (!isNT) {
		if (winver == 410) {
			MessageBox(hWnd, "Windows 98では、Windows動作中にレジストリの修復を行うことはできません。\n次の手順によりDOSモードに移行してから復元して下さい。\n\n1.WindowsをDOSモードで再起動します。\n2.プロンプトが表示されたら、scanreg /fix /optと入力します。\n3.最適化が終了したら、Ctrl+Alt+Delを押して、コンピュータを再起動します。", "レジストリの最適化",MB_OK | MB_ICONINFORMATION);
			return true;
		}
		else if (winver == 490) {
			if (IDYES == MessageBox(hWnd, "Windows Meでは、Scanregwを呼び出して、レジストリの修復を行います。\nレジストリの修復後は、Windowsを再起動する必要があります。\n\nScanregwを起動しますか?", "レジストリの最適化", MB_YESNO | MB_ICONQUESTION)) {
				if ((HINSTANCE)32 >= ShellExecute(hWnd,"open","scanregw /fix",NULL,NULL,SW_SHOWNORMAL)) {
					MessageBox(hWnd, "Scanregwの起動に失敗しました。", "レジストリの最適化", MB_OK | MB_ICONSTOP);
					return false;
				}
				else {
					return true;
				}
			}
		}
	}
	return true;
}
#endif /* _WIN64 */
#endif // _MSC_VER < 1500
