Windows CE (.NET) とか IoTとか

組込みWindows と IoTの話を扱います

CE Update Checkの研究

Platform Builder 6.0 をインストールすると、VS2005 IDE の Toolsメニュー、Platform Builder for CE 6.0 以下に"CE Update Check"というツールがインストールされます。このツールは実行した時点で有効なWindows CE Updateをチェックし、ビルドツリーに存在するコンポーネントが最新のものであるか確認してくれます。

Ceupdatecheck1

このツールは当初Windows CE 5.0向けの追加ツールとしてQFEに含まれる形でリリースされました。CE 6.0ではQFE以外にもR2およびR3がリリースされ、そのたびにCE Update Checkの動作も混乱しました。そこで、どのような原理でこのツールが動作しているかを調査してみました。

まずチェックしたのはCEUpdateCheckの実行ファイルですが、PB6ではこのツール項目はレジストリの以下の場所で指定されているようです。

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Platform Builder\6.00\External Tools\CE &Update Check]
"ToolCmd"="C:\\Program Files\\Microsoft Platform Builder\\6.00\\cepb\\SustainedEngineering\\CEUpdateCheck.exe"
"ToolDir"="C:\\Program Files\\Microsoft Platform Builder\\6.00\\cepb\\SustainedEngineering\\"
"ToolOpt"=dword:00000001

このツール自体は驚いたことに、R3インストール後も最初の6.0でインストールされたものがそのまま使用されています。つまり、最新のQFEファイルの情報は外部のデータファイル、またはインターネット上のサーバーで管理されているということです。

次に気がつくのは、CE Update Check を動かした時点での最新のリリース以降のデータしか表示されないということです。
この記事を書いている 7月30日時点では 2009年9月以降のQFEしかチェックされません。つまり、それ以前のアップデートは正しくインストールされていることを前提にしている(あるいはチェックしていない)ことになります。2009年9月とは R3のリリース後の初めてのQFEリリースで、つまりはR3以降のQFEのみチェックするように動作しており、これはインターネットから情報を得ているということが想像されます。

R3リリース直後にはまだサーバー上の情報が更新がされていなかったためR3用の正しい情報が表示されず、9月のQFEがリリースされたときに初めてR3用にサーバー情報も更新されたと考えると辻褄が合います。

当方では以前から\WINCE600のビルドツリーのみを維持する方式をとっているのですが、一方それではどうやってR2/R3/QFEのインストールをチェックしているのかということが問題になります。SP1/R2/R3では以下のレジストリで認識しているようです。

CE6/SP1/R2までインストールした時

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Platform Builder\6.00\Setup]
"Locale"=dword:00000409
"Version"="6.00.2027"
"CETK"="C:\\Program Files\\Microsoft Platform Builder\\6.00\\CEPB\\WCETK"
"SP1_ENU"="C:\\Program Files\\Microsoft Platform Builder\\6.00\\"
"SP1"="C:\\Program Files\\Microsoft Platform Builder\\6.00\\"
"FP1_ENU"="D:\\WINCE600\\"
"FP1"="D:\\WINCE600\\"

R3インストール後

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Platform Builder\6.00\Setup]
"Locale"=dword:00000409
"Version"="6.00.2027"
"CETK"="C:\\Program Files\\Microsoft Platform Builder\\6.00\\CEPB\\WCETK"
"SP1_ENU"="C:\\Program Files\\Microsoft Platform Builder\\6.00\\"
"SP1"="C:\\Program Files\\Microsoft Platform Builder\\6.00\\"
"FP1_ENU"="D:\\WINCE600\\"
"FP1"="D:\\WINCE600\\"
"FP2_ENU"="D:\\WINCE600\\"
"FP2"="D:\\WINCE600\\"

※以上は英語版インストール時です。日本語版でどうなるかは試していません

また、どのQFEがインストールされたかを記録するファイルがWindows フォルダにあるようです。

C:\Windows\WinCEPB60.ini

このファイルが存在しない(たとえばファイル名を変えてみる)と、CE Update CheckはQFEがインストールされているかどうかをそもそもチェックしません。つまり、QFEをインストールしたビルドツリーは同時にC:\Windows\WinCEPB60.ini を保存する必要があることになります。

また、面白いのはビルドツリー内に
\WINCE600\CRC\Updates.ini
というショートカットファイルが作成され、これが C:\WINDOWS\WinCEPB60.ini をさしていることです。
ためしにC:\WINDOWS\WinCEPB60.iniを一時移動し、ショートカットWinCEPB60.iniのリンク先も変えてみたところ、Updates.iniを開くとWinCEPB60.iniの内容が表示されましたが、CE Update Checkは認識しませんでした。

ちなみにWindows CE 5.0と5.0用のQFEをSide by Sideインストール(というか、CE5インストール後CE6もインストール)していると WinCEPB50.ini ファイルも存在し、CE6のCEUpdateCheckでCE5用もチェックするようです。

Ceupdatecheck_3

Pre-Sysgen Buildなどを行って \PUBLIC\COMMON\OAK\lib 以下の標準でビルド済み提供されているstatic Lib を上書きしてしまった場合、これがQFEにも含まれていると上のように赤丸ビックリになってしまいます。