UWPアプリ仮想化レジストリ(registry.dat)の作り方

最近 Java でデスクトップ ブリッジ UWP アプリの開発に取り組んでいます。その中で 既定では存在しないレジストリのいくつかを読み取る必要が出てきました。既定では存在していないレジストリなので なんらかの方法で事前に書き込みをしておかなければなりません。

デスクトップ ブリッジでは権限があればレジストリへの書き込みもできるようですが できることなら権限を要求せずに解決したいところです。そこで デスクトップ ブリッジ UWP の仮想化されたレジストリ機能を使ってみることにしました。

デスクトップ ブリッジ UWP アプリではレジストリへのアクセスが可能です。これは リダイレクトによって実現されています。詳細は下記マイクロソフトのサイトで解説されています。

registry.dat とは

マイクロソフトのサイトの解説によると UWP パッケージ内に registry.dat というファイルを同梱しておくと HKLM¥SOFTWARE レジストリ配下の読み取り時に registry.dat が参照されるようになる とのこと。

なるほど 仕組みが分かってきました。ですが 肝心の registry.dat の構造や作り方については説明されていません。

いろいろと調べた結果 registry.dat はハイブと呼ばれるバイナリー形式のファイルであることが分かりました。よく使われているテキスト形式のレジストリ ファイル 拡張子 .reg とは異なります。

Desktop App Converter を使えば registry.dat が自動的に作成されるようですが 私は MakeAppx コマンドで UWP パッケージを作成しているので 自前で registry.dat を用意する必要がありました。

registry.dat を作る手順

ここからは 具体例を交えながら registry.dat の作成手順を説明していきます。

私が開発しているアプリでは JPKI ライブラリを参照するために以下のレジストリキーが必要でした。

  • HKEY_LOCAL_MACHINE¥SOFTWARE ¥Microsoft¥Cryptography¥Defaults¥Provider¥JPKI Crypto Service Provider
  • HKEY_LOCAL_MACHINE¥SOFTWARE ¥Microsoft¥Cryptography¥Defaults¥Provider¥JPKI Crypto Service Provider for Auth
  • HKEY_LOCAL_MACHINE¥SOFTWARE ¥Microsoft¥Cryptography¥Defaults¥Provider¥JPKI Crypto Service Provider for Sign

これらのレジストリキーを registry.dat に収めて UWP アプリからレジストリ参照できるようにしていきます。

1. レジストリをエクスポートする

※ 作業用 PC に必要なレジストリを登録しておいてください。

レジストリ エディター regedit.exe を起動して レジストリの必要な部分をエクスポートします。後でテキストエディターを使って編集するので余計な部分を含んでいても問題ありません。

ファイルの種類は 登録ファイル (*.reg) にします。ファイル名は適当に付けてかまいません。

2. レジストリファイルを編集する

エクスポートしたレジストリファイル .reg をテキストエディターで開きます。.reg ファイルは UTF-16LE 形式です。UTF-16LE に対応しているテキストエディターを使用してください。メモ帳でも大丈夫です

余分なレジストリキーを削除する

レジストリの範囲を広くエクスポートしていた場合は 余計なレジストリキーを削除します。

レジストリキーのプリフィックスを置換する

テキストエディターの置換機能を使って [HKEY_LOCAL_MACHINE¥SOFTWARE¥ [HKEY_CURRENT_USER¥_REGISTRY_DAT_WORK¥ に置換します。置換先には任意の名前が付けられますが HKEY_CURRENT_USER 配下でレジストリに存在していない名前を付けてください

置換後 すべてのレジストリキーは HKEY_CURRENT_USER¥_REGISTRY_DAT_WORK¥ で始まっています。

編集した内容を UTF-16LE 形式で保存します。メモ帳の場合は文字コードとして Unicode を選択してください

3. 編集したレジストリファイルをインポートする

編集したレジストリファイル .reg をダブルクリックしてレジストリにインポートします。REG IMPORT コマンドでインポートすることもできます

確認ダイアログが表示されるので はい をクリックします。

編集した内容がレジストリに追加されました。

レジストリ エディター regedit.exe を起動して内容を確認します。UWP アプリ実行時に参照したいレジストリ HKEY_LOCAL_MACHINE¥SOFTWARE の内容が HKEY_CURRENT_USER¥_REGISTRY_DAT_WORK の配下に作成されていれば OK です。

4. レジストリをハイブ形式で保存する

コマンドプロンプトを 管理者として実行 して REG SAVE コマンドを実行します。

REG SAVE "HKCU¥_REGISTRY_DAT_WORK" C:¥temp¥registry.dat

これで HKEY_CURRENT_USER¥_REGISTRY_DAT_WORK 配下のレジストリがハイブ形式で registry.dat に保存されます。REG SAVE ではルートキーである HKEY_CURRENT_USER HKCU と省略して指定することができます。

管理者: コマンドプロンプト
Microsoft Windows [Version 10.0.17763.503] (c) 2018 Microsoft Corporation. All rights reserved. C:¥WINDOWS¥system32>REG SAVE "HKCU¥_REGISTRY_DAT_WORK" C:¥temp¥registry.dat この操作を正しく終了しました。

このハイブ形式のファイル registry.dat には 以下のレジストリキーが相対位置として格納されています。

  • Microsoft
    • Cryptography
      • Defaults
        • Provider
          • JPKI Crypto Service Provider
          • JPKI Crypto Service Provider for Auth
          • JPKI Crypto Service Provider for Sign

レジストリファイル .reg の場合は HKEY_LOCAL_MACHINE 等のルートキーを含む絶対位置指定でレジストリキーが保存されますが ハイブは絶対位置を保存していません。

このハイブ registry.dat をデスクトップ ブリッジ UWP パッケージに同梱すると レジストリの HKEY_LOCAL_MACHINE¥SOFTWARE 直下にロードされたかのように参照できます。つまり アプリ実行時には以下のレジストリキーが存在している状態になります。

  • HKEY_LOCAL_MACHINE
    • SOFTWARE
      • Microsoft
        • Cryptography
          • Defaults
            • Provider
              • JPKI Crypto Service Provider
              • JPKI Crypto Service Provider for Auth
              • JPKI Crypto Service Provider for Sign

より正確に言えばロードではなくマージです。ハイブ registry.dat に含まれている上記のレジストリキーはハイブ registry.dat から参照され ハイブ registry.dat に含まれていないその他のレジストリキーはシステム自体のレジストリから検索されます。

5. レジストリを片付ける

作業の過程で レジストリに HKEY_CURRENT_USER¥_REGISTRY_DAT_WORK というキーを作ってしまいました。もう HEKY_CURRENT_USER¥_REGISTRY_DAT_WORK は必要ないので削除しておきましょう。

コマンドプロンプトで次のコマンドを実行すると HKEY_CURRENT_USER¥_REGISTRY_DAT_WORK 配下がまるごと削除できます。

REG DELETE "HKCU¥_REGISTRY_DAT_WORK" /f

この操作を正しく終了しました と表示されれば OK です。

管理者: コマンドプロンプト
C:¥WINDOWS¥system32>REG DELETE "HKCU¥_REGISTRY_DAT_WORK" /f この操作を正しく終了しました。

registry.dat はどこに置くの?

作成した registry.dat UWP パッケージのルートフォルダーに配置します。つまり AppxManifest.xml と同じフォルダーです。

このようなフォルダー構成で appx パッケージを作成すれば アプリ実行時に registry.dat が仮想化されたレジストリとして参照されます。ファイル名は必ず registry.dat としてください。他のファイル名では仮想化レジストリとして認識されません。大文字 小文字の違いは影響しないので Registry.dat などでも大丈夫です

MakeAppx コマンドを使ってパッケージを作成する手順については 以下の記事も参考にしてみてください。

デスクトップ ブリッジ UWP アプリで参照可能なレジストリハイブ registry.dat の作成手順の紹介は以上です。

この記事を共有しませんか?