Windows CE (.NET) とか IoTとか

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

Compact7のVCEPCのローダーがDHCPの取得に失敗する件

Windows Embedded Compact7 の Virtual CEPCのビルドが終了して(Windows7の場合は)Windows Virtual PCでVCEPCのOSイメージのダウンロード実行を行います。

ここで提供されているハードディスクイメージ

D:\WINCE700\platform\VirtualPC\VM\hd0_sample.vhd

を使用してVirtual PC用のブートローダーを起動するのですが、

Send DHCP Discover Message (attempt 1)
Send DHCP Discover Message (attempt 2)
Send DHCP Discover Message (attempt 3)

(中略)


Send DHCP Discover Message (attempt 24)
Send DHCP Discover Message (attempt 25)
Send DHCP Discover Message (attempt 26)
ERROR: BootTransportPb: Failed get IP address from DHCP server!
ERROR: BootDownloadBin!ImageType: BootTransportRead Failed!

*** Setting to low power state ***

*** HALT ***

のようにいつまでたってもDHCPのアドレス取得が行われない現象に遭遇しました。

Windows Virtual PCでは同じ設定でWindows XPのネットワークアクセスができることは確認しています。そこでWiresharkを使用してDHCPパケットの様子を見てみたところ...

※キャプチャフィルタに"udp portrange 67-68"を設定するとDHCPパケットのみ取得できます。

Wiresharkcaptureoption_2

確かに"DHCP Discover"でリクエストを出し"DHCP Offer"でDHCPサーバーからの回答が届いているのに応答していないことを確認しました。これはローダーをデバッグビルドして動かしてみるか...と思って、Visual Studio 2008から

のような手順でVCEPC用のブートローダーのDebug Build版をリリースディレクトリに作成しました。

あとは"Advanced Virtual CEPC.pdf"の"Creating a Stand-Alone VHD Manually
"のところに書いてある手順でブート用ハードディスクイメージを作成し、CESYSコマンドでMBRブートローダーを書き込みしたあと、VCEPCを起動してみました。

そうすると今度はDHCP取得が何事もなかったかのように正しく動作し、(COM1経由でデバッグメッセージを取得できるのですが)確認するまでもありませんでした。Wiresharkでも"DHCP Request""DHCP ACK"パケットが確認できます。

Wiresharkcapturedhcp_4

※たぶんローダー本体かDEC2114xドライバのDHCP取得のタイムアウト時間が短すぎるのではないかと思います。

そのようなわけで現在は単純にデバッグビルドのローダーを組み込んだVHDイメージでVCEPCを動かしています。実際にこの手順で作成したVHDWindows7 のディスクの管理でマウントしてコマンドプロンプトからattribコマンドで確認すると、System Hidden Readonly 属性でWCELDR ファイルが書き込まれているのを確認することができます。

(2011年8月20日追記)

その後、ReleaseビルドでwceldrC を再ビルドしてcesysコマンドでVHDに書き込んでみましたが、再ビルドしたローダーは問題なくDHCP取得できます。

D:\WINCE700\OSDesigns\VCEPC\VCEPC\RelDir\VirtualPC_x86_Release>dir wceldr*
ドライブ D のボリューム ラベルは DATA です
ボリューム シリアル番号は A06B-0EE4 です

D:\WINCE700\OSDesigns\VCEPC\VCEPC\RelDir\VirtualPC_x86_Release のディレクト

2011/08/21  05:06           111,899 wceldrC
2011/08/21  05:06           111,787 wceldrS
               2 個のファイル             223,686 バイト
               0 個のディレクトリ  124,948,951,040 バイトの空き領域

D:\WINCE700\OSDesigns\VCEPC\VCEPC\RelDir\VirtualPC_x86_Release>D:\WINCE700\platf
orm\VirtualPC\src\boot\tools\bin\i386\cesys g: wceldrC -f
Microsoft (R) Windows CE Boot Disk Preparation Tool
Copyright (C) Microsoft Corporation. All rights reserved

Boot Loader transfered on drive G:

D:\WINCE700\OSDesigns\VCEPC\VCEPC\RelDir\VirtualPC_x86_Release>

これは要するに、最初から用意されているVHDイメージ

\WINCE700\platform\VirtualPC\VM\hd0_sample.vhd

に含まれているローダーのバージョンが古いということではないでしょうか?

普通にリリースビルドのVCEPCをビルドした後、VHDをマウントして上のように cesys コマンドで上書きすれば問題ない、という事のように思います。

※cesysコマンドはDOS版とNT版がありますが、上のようにNT版を使用してください。また、「Cannot obtain exclusive access to drive X:」のようなエラーが出て書き込みできない場合には、エクスプローラなどで.vhdファイルのあるフォルダを開いていないか(開いていたら閉じる)を確認してください。