Windows10

32bitソフトの64bit環境での動作

WOW64でのレジストリリダイレクトの例

次のコード例は、64ビットWindowsのレジストリリダイレクタによって提供されるレジストリの個別のビューを示しています。また、キーが共有されているかリダイレクトされているかに応じて、キーの値がどのように設定されるかを示します。詳細については、「WOW64の影響を受けるレジストリキー」を参照してください。

32ビットと64ビットの両方のWindows用に、次のコードを個別にコンパイルします。結果の各実行可能ファイルを64ビットWindowsで実行し、出力を比較します。両方のバージョンのサンプル出力は、ソースコードの下にリストされています。

#include <windows.h>
#include <stdio.h>

#pragma comment(lib, "advapi32.lib")

// Define application constants.
#if defined(_WIN64)

#define VIEW_DATA L"Hello! 64-bit World"
#define ALT_VIEW_DATA L"Hello! 32-bit World"
#define CROSS_ACCESS KEY_WOW64_32KEY

#else

#define VIEW_DATA L"Hello! 32-bit World"
#define ALT_VIEW_DATA L"Hello! 64-bit World"
#define CROSS_ACCESS KEY_WOW64_64KEY

#endif

// Create a registry key and set its value.
// Return TRUE if the function succeeds, FALSE if it fails.
BOOL
    CreateRegistryKeyValue(
        HKEY hKeyParent,
        PWCHAR KeyName,
        REGSAM rsAccessMask,
        REGSAM rsSamViewFlag,
        PBYTE pValue,
        DWORD dwValueSize
        )
{
    DWORD dwDisposition;
    HKEY  hKey;
    DWORD dwRet;

    dwRet = 
        RegCreateKeyEx(
            hKeyParent,
            KeyName,
            0,
            NULL,
            REG_OPTION_NON_VOLATILE,
            rsAccessMask | rsSamViewFlag,
            NULL,
            &hKey,
            &dwDisposition);

    if (dwRet != ERROR_SUCCESS)
    {
        printf("Error opening or creating key.\n");
        return FALSE;
    }

    // Attempt to set the value of the key.
    // If the call fails, close the key and return.
    if (ERROR_SUCCESS !=
            RegSetValueEx(
                hKey,
                NULL,
                0,
                REG_SZ,
                pValue,
                dwValueSize))
    {
        printf("Could not set registry value.\n");
        RegCloseKey(hKey);
        return FALSE;
    }

    RegCloseKey(hKey);
    return TRUE;
}

// Access a registry key and print its value.
// Return TRUE if the function succeeds, FALSE if it fails.
BOOL
    AccessRegistryKeyValue(
        HKEY hKeyParent,
        PWCHAR KeyName,
        REGSAM rsAccessMask,
        REGSAM rsSamViewFlag
        )
{
    HKEY hKey;
    WCHAR Buffer[MAX_PATH];
    DWORD dwSize = sizeof(Buffer);
    DWORD dwType;
    DWORD dwRet;

    dwRet =
        RegOpenKeyEx(
            hKeyParent,
            KeyName,
            0,
            rsAccessMask | rsSamViewFlag,
            &hKey);

    if (dwRet != ERROR_SUCCESS)
    {
        printf("Error opening key!\n");
        return FALSE;
    }

    if (ERROR_SUCCESS !=
            RegQueryValueEx(
                hKey,
                NULL,
                0,
                &dwType,
                (PBYTE)Buffer,
                &dwSize))
    {
        printf("Could not read registry value.\n");
        RegCloseKey(hKey);
        return FALSE;
    }

    if (rsSamViewFlag != 0)
    {
        printf("Alternate view:   %S\n", Buffer);
    }
    else
    {
        printf("Default view:     %S\n", Buffer);
    }

    RegCloseKey(hKey);
    return TRUE;
}

int
main()
{
    BOOL Res;

    // Define the list of keys to work with.
    typedef struct {
        HKEY hkRoot;
        LPWSTR szRootName;
        LPWSTR szName;
    }KEYDATA;

    KEYDATA Keys[] =
    {
        { HKEY_LOCAL_MACHINE, L"HKLM", L"Software\\Hello World" },
        { HKEY_CLASSES_ROOT,  L"HKCR", L"Hello" },
        { HKEY_CLASSES_ROOT,  L"HKCR", L"CLSID\\{00000000-0000-0000-0000-ABCD00000000}" },
        { HKEY_CLASSES_ROOT,  L"HKCR", L"CLSID\\{00000000-0000-0000-0000-ABCD00000000}\\InprocServer32" },
        { HKEY_CLASSES_ROOT,  L"HKCR", L"CLSID\\{00000000-0000-0000-0000-ABCD00000000}\\LocalServer32" }
    };

    // Now create the keys.
    for (int i = 0; i < _countof(Keys); i++)
    {
        // Create the keys in the alternate view of the registry.
        Res = 
            CreateRegistryKeyValue(
                Keys[i].hkRoot,
                Keys[i].szName,
                KEY_READ | KEY_WRITE,
                CROSS_ACCESS,
                (PBYTE)ALT_VIEW_DATA,
                sizeof(ALT_VIEW_DATA));
        if (Res == FALSE)
        {
            printf("Could not create keys in alternate view of the registry.\n");
            return 1; 
       }

        // Create the keys in the default view of the registry.
        Res = 
            CreateRegistryKeyValue(
                Keys[i].hkRoot,
                Keys[i].szName,
                KEY_READ | KEY_WRITE,
                0,
                (PBYTE)VIEW_DATA,
                sizeof(VIEW_DATA));
        if (Res == FALSE)
        {
            printf("Could not create keys in default view of the registry.\n");
            return 1;
        }
    }

    // Access the registry and print key values.
    printf("Application string: %S\n", VIEW_DATA);

    for (int i = 0; i < _countof(Keys); i++)
    {
        printf("%S\\%S\n", Keys[i].szRootName, Keys[i].szName);
        Res = 
            AccessRegistryKeyValue(
                Keys[i].hkRoot,
                Keys[i].szName,
                KEY_READ, 
                0);
        if (Res == FALSE)
        {
            printf("Unable to access default view of registry.\n");
            return 1;
        }

        // Calls with CROSS_ACCESS explicitly access the alternate registry view.
        Res =
            AccessRegistryKeyValue(
                Keys[i].hkRoot,
                Keys[i].szName,
                KEY_READ,
                CROSS_ACCESS);
        if (Res == FALSE)
        {
            printf("Unable to access alternate view of registry.\n");
            return 1;
        }
    }
    return 0;
}

64ビットバージョンの例を実行すると、次の出力が生成されます。このキーが共有されているため、HKCR \ Helloのデフォルトビューと代替ビューの値は同じです。他のキーの値はリダイレクトされるため、異なります。

Windows Server 2008、Windows Vista、Windows Server 2003、およびWindows XP:これらのオペレーティングシステムでこの例を実行すると、LocalServer32キーのデフォルトビューと代替ビューは同じ値になります。これは、LocalServer32キーがリダイレクトされて反映されるため、キーへのハンドルが閉じられるとすぐに、レジストリの64ビットビューと32ビットビューの間でその値が同期されます。 Windows 7以降、レジストリリフレクションは削除されました。詳細については、「レジストリリフレクション」を参照してください。

Application string: Hello! 64-bit World
HKLM\Software\Hello World
Default view:     Hello! 64-bit World
Alternate view:   Hello! 32-bit World
HKCR\Hello
Default view:     Hello! 64-bit World
Alternate view:   Hello! 64-bit World
HKCR\CLSID\{00000000-0000-0000-0000-ABCD00000000}
Default view:     Hello! 64-bit World
Alternate view:   Hello! 32-bit World
HKCR\CLSID\{00000000-0000-0000-0000-ABCD00000000}\InprocServer32
Default view:     Hello! 64-bit World
Alternate view:   Hello! 32-bit World
HKCR\CLSID\{00000000-0000-0000-0000-ABCD00000000}\LocalServer32
Default view:     Hello! 64-bit World
Alternate view:   Hello! 32-bit World

サンプルの32ビットバージョンを実行すると、次の出力が生成されます。 32ビットアプリケーションの場合、レジストリの64ビットビューが代替ビューになるため、共有キーであるHKCR \ Helloを除いて、値が逆になります。

Application string: Hello! 32-bit World
HKLM\Software\Hello World
Default view:     Hello! 32-bit World
Alternate view:   Hello! 64-bit World
HKCR\Hello
Default view:     Hello! 32-bit World
Alternate view:   Hello! 32-bit World
HKCR\CLSID\{00000000-0000-0000-0000-ABCD00000000}
Default view:     Hello! 32-bit World
Alternate view:   Hello! 64-bit World
HKCR\CLSID\{00000000-0000-0000-0000-ABCD00000000}\InprocServer32
Default view:     Hello! 32-bit World
Alternate view:   Hello! 64-bit World
HKCR\CLSID\{00000000-0000-0000-0000-ABCD00000000}\LocalServer32
Default view:     Hello! 32-bit World
Alternate view:   Hello! 64-bit World

この例をregeditで実行した場合の影響を調べるには、次のキーの値を調べます。アプリケーションでは、ハードコードされたレジストリパスでWow6432Nodeを使用しないようにする必要があります。

** HKLM \\ SOFTWARE \\ Hello World ** ** HKLM \\ SOFTWARE \\ Wow6432Node \\ Hello World ** ** HKCR \\ CLSID \\ {00000000-0000-0000-0000-ABCD00000000} ** ** HKCR \\ CLSID \\ {00000000-0000-0000-0000-ABCD00000000} \\ InprocServer32 ** ** HKCR \\ CLSID \\ {00000000-0000-0000-0000-ABCD00000000} \\ LocalServer32 ** ** HKCR \ \ Hello HKCR \\ Wow6432Node \\ CLSID \\ {00000000-0000-0000-0000-ABCD00000000} ** ** HKCR \\ Wow6432Node \\ CLSID \\ {00000000-0000-0000-0000-ABCD00000000} \\ InprocServer32 * * ** HKCR \\ Wow6432Node \\ CLSID \\ {00000000-0000-0000-0000-ABCD00000000} \\ LocalServer32 ** ** HKCR \\ Wow6432Node \\ Hello **

 

関連トピック

レジストリリダイレクタ

レジストリリフレクション

 

より快適な環境へ

マンションや賃貸住宅などの事情で光回線が引けない方に朗報です。

ポイント

  • 全ての端末代金0円!
  • 業界最安級でインターネット使い放題
    ※月額:3,250円
  • どれだけ使っても、速度低下無し
  • データ量も速さもダントツです!
  • 最短即日発送!

【ギガWi-Fi】

ギガWi-Fi
【ギガWi-Fi】

ギガWi-Fi
【ギガWi-Fi】

ギガWi-Fi
【ギガWi-Fi】

公式サイトで詳細を見る

  • この記事を書いた人

山本

はじめまして。「山本まこと」と申します。フリーランスでシステムエンジニアを現役でさせて頂いています。業務内容はシステム設計、プログラム作成等何でさせて頂いています。 特にサーバ構築、業務端末(パソコン)の構築の仕事を多くさせて頂いています。サーバ構築はOSが24時間止まらず高パフォーマンスで動作する用に設定したり セキュリティ対策(脆弱性)を実施することやデータベースの構築も実施します。業務端末(パソコン)の構築は業務アプリケーションが快適に動作するようOSの設定を実施します。パソコンは日進月歩で性能はどんどん向上しています。 またマイクロソフトのOSもWinows7からWindows10へ移行する段階を迎えています。Windows10においては、使い勝手はとても良くなっていますが、自動化が進み、一度不調になってしまうと設定変更での修復するにはコツが必要です。 また、マシンスペックについてもある程度のものが要求されます。このホームページでは、皆さんがパソコンを快適に使っていただけるようにお役に立てたらと思い、記事を書かせて頂いています。

-32bitソフトの64bit環境での動作
-,

© 2020 幸せになれるPCライフ