none
CreateProcessで起動したプロセスで一部のレジストリが見えない RRS feed

  • 質問

  • 皆様お世話になります。

    問題を絞り込んだサンプルプログラム(Visual Studio Express 2015 で構築)を下記に示しますが、これで起動した Powershellで、dir HKLM:\Software\Microsoft\Office\14.0\Common を実行すると、あるはずのレジストリの幾つが見えません。

    Powershell の代わりに cmd.exe を起動し、regedit で見ても同じです。

    見えないレジストリに再現性がありますが、問題のキーに Users の読取権は存在しますし、Administrator で実行しても同じ症状です。

    CreateProcess の使い方の問題と思われますが、下記で何が問題か分かりましたらご教示頂けますと幸いです。

    #include "windows.h"
    
    int main()
    {
        STARTUPINFO si = {sizeof si};
        PROCESS_INFORMATION pi = { 0 };
        CreateProcess(L"C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\powershell.exe", 
            L"Powershell.exe", NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
        return 0;
    }
    

    念のため、regeditの画像も添付します。

    本来のレジストリは下記ですが、

    CreateProcessで起動したプロセスから見たレジストリが下記です。

    実害として、InstallRoot が調べられなくて困っています。

    Windows10 Pro 64bit バージョン1803 です。

    よろしくお願いします。

    2019年8月26日 3:04

回答

  • HKEY_LOCAL_MACHINE の内容や C:¥Windows¥System32 の実態はそれを見ようとするプロセスが 32bit か 64bit かによって変わるように実装されています。

    64bit 環境で実行する場合はそれを意識する必要があります。

    端的には CreateProcesd するときのパスを System32 ではなく、SysNative にすれば良いとは思いますが、同じプログラムを 32bit で併用する場合は一工夫必要かもしれません。

    参考 https://learnin.hatenablog.com/entry/20110424/p1

    • 回答としてマーク M14Cluster 2019年8月26日 5:06
    2019年8月26日 3:17

すべての返信

  • HKEY_LOCAL_MACHINE の内容や C:¥Windows¥System32 の実態はそれを見ようとするプロセスが 32bit か 64bit かによって変わるように実装されています。

    64bit 環境で実行する場合はそれを意識する必要があります。

    端的には CreateProcesd するときのパスを System32 ではなく、SysNative にすれば良いとは思いますが、同じプログラムを 32bit で併用する場合は一工夫必要かもしれません。

    参考 https://learnin.hatenablog.com/entry/20110424/p1

    • 回答としてマーク M14Cluster 2019年8月26日 5:06
    2019年8月26日 3:17
  • Azulean 様、コメントありがとうございます。

    Visual Studio のターゲットを x64 にすることで見えるようになりました。

    確かに 64bit/32bit がまだ混在しており、自動実行させるので、レジストリの run の記述を変えるしかなさそうですね。

    ありがとうございました。

    2019年8月26日 3:59
  • Azulean 様。

    呑み込みが悪くてすみません。

    CreateProcess(L"C:\\Windows\\SysNative\\WindowsPowerShell\\v1.0\\powershell.exe", ...

    これにより32bitアプリから64bit版のPowershellが起動できるということですね。

    これなら32bitアプリ内でOSのビット数を判定すれば良いことなので、端末のレジストリを触らずに対処できます。

    ありがとうございました。

    2019年8月26日 10:27