おとうさま、大きなHDDを使えるようにするの? のソース

プログラムのメインとなる「over128.cpp」のソースです。私用した全てのソースが入っているプロジェクト自体はこちらからダウンロード可能です。

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);
}
▲このページのTOP▲