web-dev-qa-db-ja.com

c:\ windows \ sysWow64にあるcmd.exeからx64ビットバージョンのレジストリを実行する方法

レジストリのx64ビット部分に値を追加する必要がある32ビットアプリケーションがあります。

regedit.exe -s fileWithKeys.regを使用してそれを実行したいのですが、regeditをスパンしようとすると(アプリケーションのコードでC:\windows\sysnativeディレクトリを使用しました)、32ビットバージョンが表示されます。これらのキーを適切なx64ビットノードに追加するには、x64ビットバージョンのツール(regedit)をスパンする必要があります。

C:\Windows\SysWOW64\cmd.exeを実行し、そこからC:\Windows\regedit.exeを呼び出すことで、これをシミュレートできることがわかりました。代わりに32ビットバージョンのregeditを実行しているように見えるため、64ビットバージョンを実行できません。

それを行う方法はありますか?

6
Darqer

64ビットWindowsには、ファイルシステムとレジストリリダイレクトと呼ばれるものが存在します。これらは、32ビットWindows用に作成された古いアプリケーションとの互換性、および古いバージョンのWindows用に設計されたアプリケーション用に存在します。 WoW64は、32ビットプロセスによって行われたすべてのシステムコールをフックします。64ビットバージョンのWindowsで実行されている32ビットアプリケーションがC:\ Windows\System32を呼び出す場合、WoW64は透過的にC:\ Windows\SysWoW64にリダイレクトします。 C.\Windows\Sysnative仮想ディレクトリは、ディレクトリのnativeバージョン(64ビットバージョン)を示します。そのファイルシステムパスを参照するスレッドのビット数。

レジストリにも同様のメカニズムが存在します。これがWoW6432Nodeキーのすべてです。厳密には、簡潔にしたい場合は、レジストリのこれらの32ビットおよび64ビットビューを呼び出します。

32ビットプロセス内からHiveのネイティブ(64ビット)部分のキーにアクセスするためのコードを(C#で)少し前に作成しました。ここに要約されたスニペットがあります:

// Accessing 64-bit registry key from 32-bit process
enum RegAccessFlag
{
    NONE                   = 0,
    KEY_QUERY_VALUE        = 0x0001,
    KEY_SET_VALUE          = 0x0002,
    KEY_CREATE_SUB_KEY     = 0x0004,
    KEY_ENUMERATE_SUB_KEYS = 0x0008,
    KEY_NOTIFY             = 0x0010,
    KEY_CREATE_LINK        = 0x0020,
    KEY_WOW64_64KEY        = 0x0100, // This is the ticket
    KEY_WOW64_32KEY        = 0x0200,
    KEY_WOW64_RES          = 0x0300
}

public static UIntPtr HKEY_LOCAL_MACHINE = new UIntPtr(0x80000002u);

[DllImport("advapi32.dll", CharSet = CharSet.Auto)]
public static extern int RegOpenKeyEx(UIntPtr hkey, string subKey, int ulOptions, int samDesired, out UIntPtr hkResult);

static void Main(string[] args)
{
    int statusCode = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE", 0, (int)RegAccessFlag.KEY_WOW64_64KEY | (int)RegAccessFlag.KEY_QUERY_VALUE, out hKey);
}

もちろん、開いた後でキーから値を読み取るか、新しい値を作成する必要があります。終了したらキーを閉じることを忘れないでください。ただし、コードを書くことに注意を払えば、始められるでしょう。 。

しかし、別の32ビットプロセスから32ビットプロセスを生成することについて話しているため、子プロセスは、64ビットプラットフォームでレジストリのネイティブビューにアクセスできます...両方の組み合わせを扱っています。ファイルシステムのリダイレクトレジストリのリダイレクトの両方が邪魔になります。 そして、それに加えて、regedit.exeは、この点で少し特別なユーティリティです。

TL; DR:C:\Windows\sysnative\regedt32.exeではなくregedit.exeを試してください。

https://stackoverflow.com/questions/12233396/open-64-bit-regedit-from-32-bit-application

6
Ryan Ries

64ビットWindows OSでのregedit.exeのデフォルトバージョン64ビットバージョン です。

C:\Windows\SysWOW64にあるregedit実行可能ファイルは32ビットバージョンであり、C:\Windowsにある実行可能ファイルは64ビットバージョンです。

ですから、SysWOW64から実行すると、32ビットバージョンが表示されます。あなたは32ビットバージョンを実行しているためです。 SysWOW64は、32ビットバージョンが配置されている場所と、それが使用される場所です(互換性を確保するために64ビットシステムによって実行されるため)。

Wow6432Nodeの下にあるHKEY_LOCAL_MACHINE\SOFTWAREキーの存在を介して、実行しているregeditのバージョンを確認/確認できます。 C:\Windowsからregeditを実行すると、そのノードが存在します(レジストリキーの32ビットバージョンが表示されます)。 C:\Windows\SysWOW64からregeditを実行すると、既に32ビットレジストリを表示しているため、そのキーは存在しません。

C:\Windows\regedit.exe <=> 64ビットバージョンのregedit。
C:\Windows\SysWOW64\regedit.exe <=> regeditの32ビットバージョン。

3
HopelessN00b

のようだ "%systemroot%\regedit.exe"は、何らかのリダイレクトも行います。

Vistaから、これは64ビットシステムで32ビットcmdを実行している場合に機能します。

"%systemroot%\sysnative\cmd.exe" /c "%systemroot%\regedit.exe"
1
Jari Kulmala