プログラムのメインとなる「over128.cpp」のソースです。私用した全てのソースが入っているプロジェクト自体はこちらからダウンロード可能です。
// Over128.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//
#include "stdafx.h"
#include "Over128.h"
C9Reg g_cReg;
HWND g_hWnd;
DWORD g_dwBeforeValue;
LPCTSTR g_szRebootMsg = _T("設定を変更しました。\n変更した設定を有効にするには再起動する必要があります。今すぐ再起動しますか?");
LPCTSTR g_szEnableLBA = _T("EnableBigLba");
LPCTSTR g_szURL = _T("http://ir9.jp/");
LPCTSTR g_szAuthor = _T("いろきゅう");
LPCTSTR g_szErrorMsg[] =
{
_T("正常終了。"),
_T("設定を読み書きする為のレジストリキーが開けませんでした。"),
_T("設定をレジストリに書き込めませんでした。"),
_T("このアプリケーションは、Windows2000以外のOSに対応していません。"),
_T("お使いのシステムは、Windows2000 ServicePack3 以降が適用されていません。\nWindows2000で128GB以上に対応するには、ServicePack3以降 が適用されている必要があります。"),
_T("不明なエラーが発生しました。"),
};
/*------------------------------------------------------------*
*
* 関数定義
*
*------------------------------------------------------------*/
int ReadReg()
{
if(g_cReg.Open(C9Reg::f_eLocalMachine, _T("SYSTEM\\ControlSet001\\Services\\atapi\\Parameters")))
throw E_RegOpenError;
CS9RegValue* psRegValue = g_cReg.GetValue(g_szEnableLBA);
LONG nCheckButtonID = IDC_RADIO_Disable;
// Valueがあったら 値を読み込んで判定
if(psRegValue)
{
g_dwBeforeValue = psRegValue->GetDWORD();
(g_dwBeforeValue != 0)&&(nCheckButtonID = IDC_RADIO_Enable);
}
::CheckRadioButton(g_hWnd, IDC_RADIO_Disable, IDC_RADIO_Enable, nCheckButtonID);
return 0;
}
BOOL WriteReg()
{
DWORD dwValue = 1;
if(::IsDlgButtonChecked(g_hWnd, IDC_RADIO_Enable) != BST_CHECKED)
{ // 有効にしないのかー。
dwValue = 0;
}
if(g_cReg.SetValueDWORD(g_szEnableLBA, dwValue) != ERROR_SUCCESS)
throw E_RegWriteError;
return dwValue != g_dwBeforeValue;
}
int CheckOS()
{
C9iWindowsVersion cVer;
tchar szSubVer[128];
// バージョンチェック
if(cVer.GetPlatformID() != VER_PLATFORM_WIN32_NT)
throw E_OtherOS;
if(!(cVer.GetMajer() == 5 && cVer.GetMinor() == 0))
throw E_OtherOS;
// 長さが足りぬ!
if(cVer.GetSubVerLength() < 13L)
throw E_NotSP3;
// Service Pack のチェック
cVer.GetSubVerEx(szSubVer);
if(szSubVer[13] < _T('1') && szSubVer[13] > _T('9')) // アルファベットだった場合を排除
throw E_NotSP3;
if(szSubVer[13] >= _T('1') && szSubVer[13] < _T('3')) // SP3 以前を排除
throw E_NotSP3;
return 0;
}
int OnError(const E8Error e)
{
::MessageBox(g_hWnd, g_szErrorMsg[e], _T("大問題が発生したにょ!"), MB_OK | MB_ICONSTOP);
g_cReg.Close();
::EndDialog(g_hWnd, 1);
return 0;
}
INT_PTR DlgProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
switch(msg)
{
case WM_INITDIALOG:
{
try
{
g_hWnd = hWnd;
CheckOS();
ReadReg();
::SetDlgItemText(hWnd, IDC_EDIT_URL, g_szURL);
::SetDlgItemText(hWnd, IDC_STATIC_Author, g_szAuthor);
}
catch(const E8Error e)
{
OnError(e);
}
catch(...)
{
OnError(E_Unknown);
}
}
break;
case WM_CLOSE:
{
::EndDialog(hWnd, 0);
}
break;
case WM_COMMAND:
{
switch(LOWORD(wp))
{
case IDOK:
{
try
{
CBOOL bReboot = WriteReg();
g_cReg.Close();
if(bReboot &&
::MessageBox(hWnd, g_szRebootMsg, _T("再起動が必要にょ。"), MB_YESNO | MB_ICONINFORMATION) == IDYES)
{
::ExitWindowsEx(EWX_REBOOT, 0);
}
}
catch(const E8Error e)
{
OnError(e);
}
catch(...)
{
OnError(E_Unknown);
}
} // Break無し
case IDCANCEL:
{
::PostMessage(hWnd, WM_CLOSE, 0, 0);
}
break;
}
}
break;
}
return false;
}
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
return ::DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC)DlgProc, 0);
}