3

私が取り組んでいるコードには、32 ビットと 64 ビットの両方のコンポーネントがあり、レジストリで情報を共有する必要があります。このため、関数を使用するときにレジストリのリダイレクトを制御しようとしていNtOpenKeyます (のユーザーモードに相当ZwOpenKey) - 64 ビット コードからこの関数を呼び出す必要がありますが、32 ビット レジストリにアクセスする必要があります。(コードは以前は 32 ビットのみでしたが、現在は 64 ビットにアップグレードされているため、既存のコードをできるだけ多く使用することをお勧めします。これは、すべてを書き直して使用したくないということRegOpenKeyExです。)

当然、高レベルのレジストリ機能とは異なりNtOpenKey、アクセス フラグを認識しないため、リダイレクトを指定する方法はありません。KEY_WOW64_32KEY

現時点で考えられる唯一の解決策はWow6432Node、レジストリにアクセスするときにキー名を明示的にハードコーディングすることです。何かのようなもの:

\Registry\Machine\Software\Wow6432Node\MyCompanyKey\MyKey

残念ながら、これはハッキングに近いものであり、マイクロソフトは特に推奨していません。

この問題の正しい解決策はありますか? ドキュメントを読んでも役に立たず、関連する検索結果も見つかりませんでした。

編集:ちょっとした追加の詳細: Windows Server 2003 32 ビット/64 ビット、Windows 7/8、および Windows Server 2008 32 ビット/64 ビットをサポートする必要があります。(基本的に、Windows Server 2003 + Windows 7 以降のすべてのサーバー フレーバー。)

4

2 に答える 2

2

ネイティブAPIは、に相当するものを提供していませんKEY_WOW64_32KEY。オプションは次のとおりです。

  1. Win32APIを使用します。
  2. ネイティブAPIを使用し、パスをハードコーディングします。
  3. Win32とネイティブAPIを組み合わせます。Win32 APIを使用して、で開きHKLM\SoftwareますKEY_WOW64_32KEY。次に、を呼び出しNtQueryKeyてキーのネイティブ名を確認します。そして、そこからネイティブAPIを使用します。これにより、ハードコーディングに対する反対意見を回避できます。

オプション3はもっともらしいように聞こえますが、私は電話NtQueryKeyをかけたことがなく、そのアイデアが機能するかどうかさえ確信できません。

于 2012-11-05T22:31:41.680 に答える
0

どうやら私はあなたの問題を誤解していたようです - 私はこのフラグをアクセス指定子ではなくkey optionと考えていました。 その場合は、アクセス マスクとして問題なく動作するはずです。それを試すとどうなりますか?
NtOpenKeyKEY_WOW64_32KEY

古い答え (間違った):

これが、Windows Vista 以降で導入された理由NtOpenKeyExです。

利用可能な場合は使用することをお勧めしNtOpenKeyExます (静的ではなく動的にリンクするようにしてください)。そうでない場合は、NtCreateKey可能であれば使用するか、Wow6432Nodeそうでない場合に使用します。

私の知る限り、他の解決策はありません。

于 2012-11-05T19:36:23.520 に答える