為了讓我的 VM LAB 環境更方便,決定花一點時間把 Windows XP、Windows 7 x86 及 Windows 7 x64 包在同一個 VM 硬碟檔裡,並且在做好完整 Windows 更新後執行 Sysperp,等於未來只要開機後就會自動重設 SID,還能當成 Base 碟,也確保未來大量測試的正確性。

但在我開心地把三個 OS 做好更新並執行 Sysprep 後,發現無論是要進入 Windows 7 x86 還是 Windows 7 x64,都會產生這樣的錯誤。(編註:因 Windows 7 採英文版安裝,所以 Boot Manager 為英文介面)

從錯誤的檔案是「\windows\system32\ntoskrnl.exe」,狀態代碼為「0xc0000359」,直覺是因為硬體的不同而導致無法正常開機,但...我是放在 Hyper-V 的同一個 VM 跑耶... /=.=/

試了些方法想解決,卻依然跳同樣的錯誤,最後死馬當活馬醫,掛上 Windows 7 的安裝 ISO 看是否能修復,沒想到卻找到無法開機的真正原因。

其實在 Windows 7 安裝畫面選擇「修復您的電腦 (R)」

Windows 7 就會很賢慧地找出並準備修復。
問題出在 Windows 裝置 (Windows Device) 的位置找不到或錯誤,才導致無法開機。

從詳細資料中也可以得知 Windows 7 準備幫忙修復的方式為何。
原來是找回 Window 裝置的正確資訊,而且還很貼心地 (!?)  把我原本設定的標籤改成「Windows 7 Ultimate (已復原)」,連開機資訊都弄一個副本檔案在「C:\Boot\BCD.Backup.0001」。

對於我這種有點作業系統潔癖症的人來說,多丟一個檔是不太能容忍的事情,儘管是很貼心的備份,還是決定自己做點手工,取消自動修復進入「系統復原選項」。由於是開機項目的錯誤,所以必須在命令提示字元用指令處理。

開機項目當然是用 BCDEdit 來做,輸入「bcdedit」叫出目前的開機資訊。
果然,在這就發現嚴重的錯誤。

先大略講解一下我包多重系統的方式。因為 Windows XP 的多重開機設定不夠完善,理所當然是用 Windows 7 的 Boot Manager 來處理,安裝 OS 的順序依次為 Windows XP、Windows 7 x64 及 Windows 7 x86。

VM 是一個預設 127 GB 的硬碟檔,我特別分割成 C、D、E 三個主要磁碟區,而 Windows 也按照先後順序安裝在不同的磁碟中。但在執行過 Sysprep 後,BCDEdit 的資訊並不會使用原本的系統位置,反而將「device」覆寫成「locate=\Windows\system32\winload.exe」,連「osdevice」也被改掉成「locate=\Windows」。

下場是什麼!? 就是開機時,找的是 C 槽的 Windows ,那是 XP 啊啊啊啊... (抱頭) 開得成功才有鬼 /:S/

手工修復方式就是做跟 Windows 7 自動修復一樣的事情,將「device」及「osdevice」改成對應的磁區位置,要用指令「bcdedit /set {identifier}  <datatype> "value"」。

{identifer} 指的就是要修改的系統對應識別元,譬如我的 Windows 7 x64 就是對應 {82bb1a4f-8410-11e1-b574-9ba5fbef58e9} 那串;「device」或「osdevice」就是 datatype;value 則要正確指定磁區,如「partition=d:」。

執行後再執行一次 bcdedit 檢查。

跳出重開機登入,果然就沒有再出現錯誤了。 /:D/
而且這才知道,我的原始 Win7 是英文版然後再加上繁中語言包,在 sysprep 後的首次登入,原來是可以選擇語言的。