2011年9月23日 星期五

Boot Menu

1. 在Driver.c中的DxeMain(), 首先會去Locate三個Protocol, 分別是EFI_HII_CONFIG_ROUTING_PROTOCOL, EFI_HII_DATABASE_PROTOCOL以及EFI_FORM_BROWSER2_PROTOCOL.

2. 找到gST->ConsoleInHandle的EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL.

3. 檢查BootMenu的Protocol是否已安裝, 如果還未安裝, 表示正在Post階段, Setup還沒初始化, 這時候需要先註冊Event, 等EFI_HII_PLATFORM_SETUP_FORMSET安裝後, 再呼叫BmInitSetupMenu(), 註冊完之後順便安裝BootMenu的Protocol.

4.1. (XP版)在SetupBootMenu.c中, BmInitSetupMenu()首先會透過BmLoadBootOptions()去載入所有Boot Option. 接著呼叫BmInitSetupMenuStrings()以及BmInitSetupMenuForm(). 最後透過HiiLibCreatePackageListDriverHandle()建立HII Driver Handle, 透過HiiLibCreatePackageListFromPackages()建立HII Package List.

4.2. (MB3版)在BootIii.c中, BmInitSetupMenu()首先會透過CreateHiiDriverHandle()建立HII Driver Handle. 接著呼叫PreparePackageList()以及NewPackageList()去安裝VFR Form. 接著Locate SCT_BDS_SERVICES_PROTOCOL. 透過Protocol呼叫GetBootList().
4.2.1. BootManager會先InitializeLoadOptions(), Load Option又可分成兩種, 一種是Boot, 另一種是Driver.

5. 如果Setup Menu的Boot Page沒有被執行, 那麼BootManager就會來執行BmInitMenu().

6. 在Menu.c中, BmInitMenu()首先會執行BootMenu.c的BmInitBootMenu()去初始化Boot Menu畫面的設定值. BmInitMenu()也會執行AppMenu.c的BmInitAppMenu()去初始化App Menu畫面的設定值. 接著透過BootOption.c的BmLoadBootOptions()去Load所有Boot Option. 接著執行BmInitAppMenu()和BmLoadAppOptions(). 最後透過HiiLibCreatePackageListDriverHandle()建立HII Driver Handle, 透過HiiLibCreatePackageListFromPackages()建立HII Package List (這段Code類似SetupBootMenu的部分, 但在這裡只有安裝String而已, 沒有安裝Form.

6.1 當BootOption.c執行BmLoadBootOption()時, 會透過BDS_SERVICES_PROTOCOL->GetBootList()去取得Boot List的起點.

7. 最後透過BmDrawMenu()去畫BootMenu. 用BmInteractMenu()去接受Keyboard按下的鍵來做反應.