レジストリの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ビットバージョンを実行できません。
それを行う方法はありますか?
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
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ビットバージョン。
のようだ "%systemroot%\regedit.exe"
は、何らかのリダイレクトも行います。
Vistaから、これは64ビットシステムで32ビットcmd
を実行している場合に機能します。
"%systemroot%\sysnative\cmd.exe" /c "%systemroot%\regedit.exe"