前回の投稿までに、Installerフォルダーのファイルの列挙ができ、使用容量の確認までしました。今回は、実際に使われているファイルの分別をしたいと思います。この情報は、64ビットWindowsの場合、レジストリの以下の場所にあります。HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\UninstallHKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstallなお、32ビットWindowsの場合は、前者の場所(WOW6432Nodeが無い方)のみです。Installer技術を使ったインストーラーすべてが表示されているわけではありません。一部のインストーラーしか表示されていません。APIを使うと列挙できます。Functions(英語))を使います。この中のMsiEnumProductsEx()などを利用して、インストーラーの列挙をします。Interface(英語))を使ってアクセスした方が容易です。Property(英語))で列挙できます。App(インストーラ調整アプリ)にインストーラーの列挙機能を追加しました。列挙機能が追加されたアプリはバージョン0.2.0以降です。アプリを起動しただけでは、インストーラーの一覧は表示されません。上部の「Installerフォルダーを解析する」ボタンをクリックするとインストーラーの列挙を開始します。インストーラーの列挙には、長い時間がかかります。列挙中は、プログレスバーが表示されるとともに、インストーラー一覧の上にある数字がカウントアップされていきます。インストーラーの製品一覧この例では、二つのインストーラーがインストール済みであることがわかります。この一覧には、インストーラー名、インストーラーのサイズ(全体のサイズ、単体のサイズ、更新ファイルのサイズ)、インストーラーファイル(msiファイル)の場所、インストーラーのプロダクトコードなどが表示されます。インストーラーの一覧は、上部のヘッダ部をクリックすることにより、昇順または、降順に並べ替えができます。未使用ファイル・フォルダーの判別インストーラーの列挙をすることはできました。次はこの情報を利用して、Installerフォルダー内のファイルの中で使用されていないファイルを判別します。インストーラーファイルインストーラー情報からは、インストーラーごとに、インストーラー本体(1個のmsiファイル)とインストーラー更新ファイル(0個以上のmspファイル)、インストーラーのIDであるプロダクトコードの情報などが得られます。プロダクトコードは、システム内でインストーラーを区別するためにインストーラーごとに割り当てられているIDとなります。これらの情報を使って、使用中のファイルおよび使用中のフォルダーを判別します。具体的には、インストーラー情報から参照されている、以下のファイルを使用中として判断します。C:\Windows\Installer\xxxxxx.msp)これらのファイル名はインストーラーごとに固定のファイル名ではなく、ランダムに作成されたファイル名です。これらの情報は、インストーラー情報からフルパスで取得できます。取得できたパスのインストーラーファイルは使用中として判断します。プロダクトコード関連のファイルとフォルダーまた、プロダクトコードをファイル名の一部とする以下のファイルとフォルダーを使用中として判断します。ファイルこれらは、インストーラーが上記のファイル名やフォルダー名が使用されていることがわかったからです。そのため、該当するファイルやフォルダーは使用中として判断します。フォルダー内のファイルが使用中であるかを判断する方法です。このフォルダーの配下には、インストールするファイルのキャッシュが保存されているようです。GUID)形式の名前が使用されています。GUID)といっている人がいます。このパックGUIDは、GUIDの値の順番を入れ替えることにより生成できます。GUIDは、C/C++では以下の構造体で表現できます。8個のBYTEデータで構成されます。パックGUIDは、それぞれのデータごとに4ビット(ニブル)単位で左右を入れ替えた形になります。とき、以下の手順で変換します。インストーラーが使用する$PatchCache$フォルダーインストーラーが使用する$PatchCache$フォルダーは、以下の形式のフォルダーです。フォルダーPackedGUIDは、プロダクトコードをパックGUID形式に変形した値です。SIDは、ユーザー単位でインストールしたインストーラーのユーザーSIDです。こららのファイルは調査によりインストーラーによっては上記のフォルダー名が使用されていることがわかりました。そのため、該当するフォルダーは使用中として判断します。アプリ上の未使用ファイル・フォルダーの一覧これらのアルゴリズムで、使用中ファイル・使用中フォルダーを判断します。Installerフォルダー内にあるファイル・フォルダーから上記のファイル・フォルダーを除外したものを未使用ファイル・フォルダーとして判断します。アプリ上では、下記のように「未使用のファイルとフォルダー」として表示します。未使用ファイルとフォルダーこの例では、未使用のファイルとフォルダーは、「0バイト、0ファイル」となっているので、インストール済みのインストーラーから参照されていない未使用ファイルは存在しないことになります。使用中のインストーラーファイル使用中のインストーラーファイルも簡単に確認できるように表示します。インストーラーファイルとは、インストーラー本体ファイル(msiファイル)とインストーラーの更新ファイル(mspファイル)です。アプリ上では、下記のように「使用中のインストーラーファイル(msi/msp)」として表示します。使用中のインストーラーファイル(msi/msp)この例では、二つのmsiファイルがあり、合計が2.22MBであることがわかります。Appのバージョン0.2.0では、インストール済みのインストーラーから参照されていないファイルを判別できるようになりました。不要ファイルなどを削除して、空き容量を増やすなどの機能はありません。システムから参照されているが、削除可能なファイルの検出もしていません。これらは順次検討していきたいと思います。インターネットを検索すると、このアプリが最終的に目指す機能に似た機能を持つアプリがあることがわかりました。PatchCleanerです。次回は、このアプリの解析結果とPatchCleanerの解析結果を比較してみたいと思います。