]> git.proxmox.com Git - mirror_edk2.git/blob - IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/UpdatePage.c
HII Library Class interface refine.
[mirror_edk2.git] / IntelFrameworkModulePkg / Universal / BdsDxe / BootMaint / UpdatePage.c
1 /** @file
2 Dynamically update the pages.
3
4 Copyright (c) 2004 - 2008, Intel Corporation. <BR>
5 All rights reserved. This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
9
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12
13 **/
14
15 #include "BootMaint.h"
16
17 /**
18 Refresh the global UpdateData structure.
19
20 **/
21 VOID
22 RefreshUpdateData (
23 VOID
24 )
25 {
26 gUpdateData.Offset = 0;
27 }
28
29 /**
30 Add a "Go back to main page" tag in front of the form when there are no
31 "Apply changes" and "Discard changes" tags in the end of the form.
32
33 @param CallbackData The BMM context data.
34
35 **/
36 VOID
37 UpdatePageStart (
38 IN BMM_CALLBACK_DATA *CallbackData
39 )
40 {
41 RefreshUpdateData ();
42
43 if (!(CallbackData->BmmAskSaveOrNot)) {
44 //
45 // Add a "Go back to main page" tag in front of the form when there are no
46 // "Apply changes" and "Discard changes" tags in the end of the form.
47 //
48 CreateGotoOpCode (
49 FORM_MAIN_ID,
50 STRING_TOKEN (STR_FORM_GOTO_MAIN),
51 STRING_TOKEN (STR_FORM_GOTO_MAIN),
52 0,
53 FORM_MAIN_ID,
54 &gUpdateData
55 );
56 }
57
58 }
59
60 /**
61 Create the "Apply changes" and "Discard changes" tags. And
62 ensure user can return to the main page.
63
64 @param CallbackData The BMM context data.
65
66 **/
67 VOID
68 UpdatePageEnd (
69 IN BMM_CALLBACK_DATA *CallbackData
70 )
71 {
72 //
73 // Create the "Apply changes" and "Discard changes" tags.
74 //
75 if (CallbackData->BmmAskSaveOrNot) {
76 CreateSubTitleOpCode (
77 STRING_TOKEN (STR_NULL_STRING),
78 0,
79 0,
80 0,
81 &gUpdateData
82 );
83
84 CreateGotoOpCode (
85 FORM_MAIN_ID,
86 STRING_TOKEN (STR_SAVE_AND_EXIT),
87 STRING_TOKEN (STR_NULL_STRING),
88 EFI_IFR_FLAG_CALLBACK,
89 KEY_VALUE_SAVE_AND_EXIT,
90 &gUpdateData
91 );
92 }
93
94 //
95 // Ensure user can return to the main page.
96 //
97 CreateGotoOpCode (
98 FORM_MAIN_ID,
99 STRING_TOKEN (STR_NO_SAVE_AND_EXIT),
100 STRING_TOKEN (STR_NULL_STRING),
101 EFI_IFR_FLAG_CALLBACK,
102 KEY_VALUE_NO_SAVE_AND_EXIT,
103 &gUpdateData
104 );
105
106 IfrLibUpdateForm (
107 CallbackData->BmmHiiHandle,
108 &mBootMaintGuid,
109 CallbackData->BmmCurrentPageId,
110 CallbackData->BmmCurrentPageId,
111 FALSE,
112 &gUpdateData
113 );
114 }
115
116 /**
117 Clean up the dynamic opcode at label and form specified by both LabelId.
118
119 @param LabelId It is both the Form ID and Label ID for opcode deletion.
120 @param CallbackData The BMM context data.
121
122 **/
123 VOID
124 CleanUpPage (
125 IN UINT16 LabelId,
126 IN BMM_CALLBACK_DATA *CallbackData
127 )
128 {
129 RefreshUpdateData ();
130
131 //
132 // Remove all op-codes from dynamic page
133 //
134 IfrLibUpdateForm (
135 CallbackData->BmmHiiHandle,
136 &mBootMaintGuid,
137 LabelId,
138 LabelId,
139 FALSE,
140 &gUpdateData
141 );
142 }
143
144 /**
145 Boot a file selected by user at File Expoloer of BMM.
146
147 @param FileContext The file context data, which contains the device path
148 of the file to be boot from.
149
150 @retval EFI_SUCCESS The function completed successfull.
151 @return Other value if the boot from the file fails.
152
153 **/
154 EFI_STATUS
155 BootThisFile (
156 IN BM_FILE_CONTEXT *FileContext
157 )
158 {
159 EFI_STATUS Status;
160 UINTN ExitDataSize;
161 CHAR16 *ExitData;
162 BDS_COMMON_OPTION *Option;
163
164 Option = (BDS_COMMON_OPTION *) AllocatePool (sizeof (BDS_COMMON_OPTION));
165 ASSERT (Option != NULL);
166 Option->Description = FileContext->FileName;
167 Option->DevicePath = FileContext->DevicePath;
168 Option->LoadOptionsSize = 0;
169 Option->LoadOptions = NULL;
170
171 //
172 // Since current no boot from removable media directly is allowed */
173 //
174 gST->ConOut->ClearScreen (gST->ConOut);
175
176 ExitDataSize = 0;
177
178 Status = BdsLibBootViaBootOption (Option, Option->DevicePath, &ExitDataSize, &ExitData);
179
180 return Status;
181
182 }
183
184 /**
185 Create a list of Goto Opcode for all terminal devices logged
186 by TerminaMenu. This list will be inserted to form FORM_CON_COM_SETUP_ID.
187
188 @param CallbackData The BMM context data.
189 **/
190 VOID
191 UpdateConCOMPage (
192 IN BMM_CALLBACK_DATA *CallbackData
193 )
194 {
195 BM_MENU_ENTRY *NewMenuEntry;
196 UINT16 Index;
197
198 CallbackData->BmmAskSaveOrNot = FALSE;
199
200 UpdatePageStart (CallbackData);
201
202
203 for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {
204 NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);
205
206 CreateGotoOpCode (
207 FORM_CON_COM_SETUP_ID,
208 NewMenuEntry->DisplayStringToken,
209 STRING_TOKEN (STR_NULL_STRING),
210 EFI_IFR_FLAG_CALLBACK,
211 (UINT16) (TERMINAL_OPTION_OFFSET + Index),
212 &gUpdateData
213 );
214 }
215
216 UpdatePageEnd (CallbackData);
217 }
218
219 /**
220 Create a lit of boot option from global BootOptionMenu. It
221 allow user to delete the boot option.
222
223 @param CallbackData The BMM context data.
224
225 **/
226 VOID
227 UpdateBootDelPage (
228 IN BMM_CALLBACK_DATA *CallbackData
229 )
230 {
231 BM_MENU_ENTRY *NewMenuEntry;
232 BM_LOAD_CONTEXT *NewLoadContext;
233 UINT16 Index;
234
235 CallbackData->BmmAskSaveOrNot = TRUE;
236
237 UpdatePageStart (CallbackData);
238 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &BootOptionMenu);
239
240 ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.BootOptionDel) / sizeof (CallbackData->BmmFakeNvData.BootOptionDel[0])));
241 for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {
242 NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);
243 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;
244 if (NewLoadContext->IsLegacy) {
245 continue;
246 }
247
248 NewLoadContext->Deleted = FALSE;
249 CallbackData->BmmFakeNvData.BootOptionDel[Index] = 0x00;
250
251 CreateCheckBoxOpCode (
252 (EFI_QUESTION_ID) (BOOT_OPTION_DEL_QUESTION_ID + Index),
253 VARSTORE_ID_BOOT_MAINT,
254 (UINT16) (BOOT_OPTION_DEL_VAR_OFFSET + Index),
255 NewMenuEntry->DisplayStringToken,
256 NewMenuEntry->HelpStringToken,
257 0,
258 0,
259 &gUpdateData
260 );
261 }
262
263 UpdatePageEnd (CallbackData);
264 }
265
266 /**
267 Create a lit of driver option from global DriverMenu.
268
269 @param CallbackData The BMM context data.
270
271 **/
272 VOID
273 UpdateDrvAddHandlePage (
274 IN BMM_CALLBACK_DATA *CallbackData
275 )
276 {
277 BM_MENU_ENTRY *NewMenuEntry;
278 UINT16 Index;
279
280 CallbackData->BmmAskSaveOrNot = FALSE;
281
282 UpdatePageStart (CallbackData);
283
284 for (Index = 0; Index < DriverMenu.MenuNumber; Index++) {
285 NewMenuEntry = BOpt_GetMenuEntry (&DriverMenu, Index);
286
287 CreateGotoOpCode (
288 FORM_DRV_ADD_HANDLE_DESC_ID,
289 NewMenuEntry->DisplayStringToken,
290 STRING_TOKEN (STR_NULL_STRING),
291 EFI_IFR_FLAG_CALLBACK,
292 (UINT16) (HANDLE_OPTION_OFFSET + Index),
293 &gUpdateData
294 );
295 }
296
297 UpdatePageEnd (CallbackData);
298 }
299
300 /**
301 Create a lit of driver option from global DriverOptionMenu. It
302 allow user to delete the driver option.
303
304 @param CallbackData The BMM context data.
305
306 **/
307 VOID
308 UpdateDrvDelPage (
309 IN BMM_CALLBACK_DATA *CallbackData
310 )
311 {
312 BM_MENU_ENTRY *NewMenuEntry;
313 BM_LOAD_CONTEXT *NewLoadContext;
314 UINT16 Index;
315
316 CallbackData->BmmAskSaveOrNot = TRUE;
317
318 UpdatePageStart (CallbackData);
319
320 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &DriverOptionMenu);
321
322 ASSERT (DriverOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.DriverOptionDel) / sizeof (CallbackData->BmmFakeNvData.DriverOptionDel[0])));
323 for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {
324 NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index);
325
326 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;
327 NewLoadContext->Deleted = FALSE;
328 CallbackData->BmmFakeNvData.DriverOptionDel[Index] = 0x00;
329
330 CreateCheckBoxOpCode (
331 (EFI_QUESTION_ID) (DRIVER_OPTION_DEL_QUESTION_ID + Index),
332 VARSTORE_ID_BOOT_MAINT,
333 (UINT16) (DRIVER_OPTION_DEL_VAR_OFFSET + Index),
334 NewMenuEntry->DisplayStringToken,
335 NewMenuEntry->HelpStringToken,
336 0,
337 0,
338 &gUpdateData
339 );
340 }
341
342 UpdatePageEnd (CallbackData);
343 }
344
345 /**
346 Prepare the page to allow user to add description for
347 a Driver Option.
348
349 @param CallbackData The BMM context data.
350
351 **/
352 VOID
353 UpdateDriverAddHandleDescPage (
354 IN BMM_CALLBACK_DATA *CallbackData
355 )
356 {
357 BM_MENU_ENTRY *NewMenuEntry;
358
359 CallbackData->BmmFakeNvData.DriverAddActive = 0x01;
360 CallbackData->BmmFakeNvData.DriverAddForceReconnect = 0x00;
361 CallbackData->BmmAskSaveOrNot = TRUE;
362 NewMenuEntry = CallbackData->MenuEntry;
363
364 UpdatePageStart (CallbackData);
365
366 CreateSubTitleOpCode (
367 NewMenuEntry->DisplayStringToken,
368 0,
369 0,
370 0,
371 &gUpdateData
372 );
373
374 CreateStringOpCode (
375 (EFI_QUESTION_ID) DRV_ADD_HANDLE_DESC_QUESTION_ID,
376 VARSTORE_ID_BOOT_MAINT,
377 DRV_ADD_HANDLE_DESC_VAR_OFFSET,
378 STRING_TOKEN (STR_LOAD_OPTION_DESC),
379 STRING_TOKEN (STR_NULL_STRING),
380 0,
381 0,
382 6,
383 75,
384 &gUpdateData
385 );
386
387 CreateCheckBoxOpCode (
388 (EFI_QUESTION_ID) DRV_ADD_RECON_QUESTION_ID,
389 VARSTORE_ID_BOOT_MAINT,
390 DRV_ADD_RECON_VAR_OFFSET,
391 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON),
392 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON),
393 0,
394 0,
395 &gUpdateData
396 );
397
398 CreateStringOpCode (
399 (EFI_QUESTION_ID) DRIVER_ADD_OPTION_QUESTION_ID,
400 VARSTORE_ID_BOOT_MAINT,
401 DRIVER_ADD_OPTION_VAR_OFFSET,
402 STRING_TOKEN (STR_OPTIONAL_DATA),
403 STRING_TOKEN (STR_NULL_STRING),
404 0,
405 0,
406 6,
407 75,
408 &gUpdateData
409 );
410
411 UpdatePageEnd (CallbackData);
412 }
413
414 /**
415 Update console page.
416
417 @param UpdatePageId The form ID to be updated.
418 @param ConsoleMenu The console menu list.
419 @param CallbackData The BMM context data.
420
421 **/
422 VOID
423 UpdateConsolePage (
424 IN UINT16 UpdatePageId,
425 IN BM_MENU_OPTION *ConsoleMenu,
426 IN BMM_CALLBACK_DATA *CallbackData
427 )
428 {
429 BM_MENU_ENTRY *NewMenuEntry;
430 BM_CONSOLE_CONTEXT *NewConsoleContext;
431 BM_TERMINAL_CONTEXT *NewTerminalContext;
432 UINT16 Index;
433 UINT16 Index2;
434 UINT8 CheckFlags;
435
436 CallbackData->BmmAskSaveOrNot = TRUE;
437
438 UpdatePageStart (CallbackData);
439
440 ASSERT (ConsoleMenu->MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.ConsoleCheck) / sizeof (CallbackData->BmmFakeNvData.ConsoleCheck[0])));
441 for (Index = 0; Index < ConsoleMenu->MenuNumber; Index++) {
442 NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index);
443 NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;
444 CheckFlags = 0;
445 if (NewConsoleContext->IsActive) {
446 CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;
447 CallbackData->BmmFakeNvData.ConsoleCheck[Index] = TRUE;
448 } else {
449 CallbackData->BmmFakeNvData.ConsoleCheck[Index] = FALSE;
450 }
451
452 CreateCheckBoxOpCode (
453 (EFI_QUESTION_ID) (CON_DEVICE_QUESTION_ID + Index),
454 VARSTORE_ID_BOOT_MAINT,
455 (UINT16) (CON_DEVICE_VAR_OFFSET + Index),
456 NewMenuEntry->DisplayStringToken,
457 NewMenuEntry->HelpStringToken,
458 0,
459 CheckFlags,
460 &gUpdateData
461 );
462 }
463
464 for (Index2 = 0; Index2 < TerminalMenu.MenuNumber; Index2++) {
465 CheckFlags = 0;
466 NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index2);
467 NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;
468
469 if (((NewTerminalContext->IsConIn != 0) && (UpdatePageId == FORM_CON_IN_ID)) ||
470 ((NewTerminalContext->IsConOut != 0) && (UpdatePageId == FORM_CON_OUT_ID)) ||
471 ((NewTerminalContext->IsStdErr != 0) && (UpdatePageId == FORM_CON_ERR_ID))
472 ) {
473 CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;
474 CallbackData->BmmFakeNvData.ConsoleCheck[Index] = TRUE;
475 } else {
476 CallbackData->BmmFakeNvData.ConsoleCheck[Index] = FALSE;
477 }
478
479 CreateCheckBoxOpCode (
480 (EFI_QUESTION_ID) (CON_DEVICE_QUESTION_ID + Index),
481 VARSTORE_ID_BOOT_MAINT,
482 (UINT16) (CON_DEVICE_VAR_OFFSET + Index),
483 NewMenuEntry->DisplayStringToken,
484 NewMenuEntry->HelpStringToken,
485 0,
486 CheckFlags,
487 &gUpdateData
488 );
489
490 Index++;
491 }
492
493 UpdatePageEnd (CallbackData);
494 }
495
496 /**
497 Update the page's NV Map if user has changed the order
498 a list. This list can be Boot Order or Driver Order.
499
500 @param UpdatePageId The form ID to be updated.
501 @param OptionMenu The new list.
502 @param CallbackData The BMM context data.
503
504 **/
505 VOID
506 UpdateOrderPage (
507 IN UINT16 UpdatePageId,
508 IN BM_MENU_OPTION *OptionMenu,
509 IN BMM_CALLBACK_DATA *CallbackData
510 )
511 {
512 BM_MENU_ENTRY *NewMenuEntry;
513 UINT16 Index;
514 IFR_OPTION *IfrOptionList;
515
516 CallbackData->BmmAskSaveOrNot = TRUE;
517
518 UpdatePageStart (CallbackData);
519
520 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, OptionMenu);
521
522 ZeroMem (CallbackData->BmmFakeNvData.OptionOrder, 100);
523
524 IfrOptionList = AllocateZeroPool (sizeof (IFR_OPTION) * OptionMenu->MenuNumber);
525 if (IfrOptionList == NULL) {
526 return ;
527 }
528
529 for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {
530 NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index);
531 IfrOptionList[Index].StringToken = NewMenuEntry->DisplayStringToken;
532 IfrOptionList[Index].Value.u8 = (UINT8) (NewMenuEntry->OptionNumber + 1);
533 IfrOptionList[Index].Flags = 0;
534 CallbackData->BmmFakeNvData.OptionOrder[Index] = IfrOptionList[Index].Value.u8;
535 }
536
537 if (OptionMenu->MenuNumber > 0) {
538 CreateOrderedListOpCode (
539 (EFI_QUESTION_ID) OPTION_ORDER_QUESTION_ID,
540 VARSTORE_ID_BOOT_MAINT,
541 OPTION_ORDER_VAR_OFFSET,
542 STRING_TOKEN (STR_CHANGE_ORDER),
543 STRING_TOKEN (STR_CHANGE_ORDER),
544 0,
545 0,
546 EFI_IFR_NUMERIC_SIZE_1,
547 100,
548 IfrOptionList,
549 OptionMenu->MenuNumber,
550 &gUpdateData
551 );
552 }
553
554 FreePool (IfrOptionList);
555
556 UpdatePageEnd (CallbackData);
557
558 CopyMem (
559 CallbackData->BmmOldFakeNVData.OptionOrder,
560 CallbackData->BmmFakeNvData.OptionOrder,
561 100
562 );
563 }
564
565 /**
566 Create the dynamic page to allow user to set
567 the "BootNext" value.
568
569 @param CallbackData The BMM context data.
570
571 **/
572 VOID
573 UpdateBootNextPage (
574 IN BMM_CALLBACK_DATA *CallbackData
575 )
576 {
577 BM_MENU_ENTRY *NewMenuEntry;
578 BM_LOAD_CONTEXT *NewLoadContext;
579 IFR_OPTION *IfrOptionList;
580 UINTN NumberOfOptions;
581 UINT16 Index;
582
583 IfrOptionList = NULL;
584 NumberOfOptions = BootOptionMenu.MenuNumber;
585 CallbackData->BmmAskSaveOrNot = TRUE;
586
587 UpdatePageStart (CallbackData);
588 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &BootOptionMenu);
589
590 if (NumberOfOptions > 0) {
591 IfrOptionList = AllocateZeroPool ((NumberOfOptions + 1) * sizeof (IFR_OPTION));
592
593 ASSERT (IfrOptionList);
594
595 CallbackData->BmmFakeNvData.BootNext = (UINT16) (BootOptionMenu.MenuNumber);
596
597 for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {
598 NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);
599 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;
600 if (NewLoadContext->IsBootNext) {
601 IfrOptionList[Index].Flags = EFI_IFR_OPTION_DEFAULT;
602 CallbackData->BmmFakeNvData.BootNext = Index;
603 } else {
604 IfrOptionList[Index].Flags = 0;
605 }
606
607 IfrOptionList[Index].Value.u16 = Index;
608 IfrOptionList[Index].StringToken = NewMenuEntry->DisplayStringToken;
609 }
610
611 IfrOptionList[Index].Value.u16 = Index;
612 IfrOptionList[Index].StringToken = STRING_TOKEN (STR_NONE);
613 IfrOptionList[Index].Flags = 0;
614 if (CallbackData->BmmFakeNvData.BootNext == Index) {
615 IfrOptionList[Index].Flags |= EFI_IFR_OPTION_DEFAULT;
616 }
617
618 CreateOneOfOpCode (
619 (EFI_QUESTION_ID) BOOT_NEXT_QUESTION_ID,
620 VARSTORE_ID_BOOT_MAINT,
621 BOOT_NEXT_VAR_OFFSET,
622 STRING_TOKEN (STR_BOOT_NEXT),
623 STRING_TOKEN (STR_BOOT_NEXT_HELP),
624 0,
625 EFI_IFR_NUMERIC_SIZE_2,
626 IfrOptionList,
627 (UINTN) (NumberOfOptions + 1),
628 &gUpdateData
629 );
630
631 FreePool (IfrOptionList);
632 }
633
634 UpdatePageEnd (CallbackData);
635 }
636
637 /**
638 Create the dynamic page to allow user to set the "TimeOut" value.
639
640 @param CallbackData The BMM context data.
641
642 **/
643 VOID
644 UpdateTimeOutPage (
645 IN BMM_CALLBACK_DATA *CallbackData
646 )
647 {
648 UINT16 BootTimeOut;
649
650 CallbackData->BmmAskSaveOrNot = TRUE;
651
652 UpdatePageStart (CallbackData);
653
654 BootTimeOut = PcdGet16 (PcdPlatformBootTimeOut);
655
656 CreateNumericOpCode (
657 (EFI_QUESTION_ID) BOOT_TIME_OUT_QUESTION_ID,
658 VARSTORE_ID_BOOT_MAINT,
659 BOOT_TIME_OUT_VAR_OFFSET,
660 STRING_TOKEN (STR_NUM_AUTO_BOOT),
661 STRING_TOKEN (STR_HLP_AUTO_BOOT),
662 0,
663 EFI_IFR_NUMERIC_SIZE_2 | EFI_IFR_DISPLAY_UINT_DEC,
664 0,
665 65535,
666 0,
667 BootTimeOut,
668 &gUpdateData
669 );
670
671 CallbackData->BmmFakeNvData.BootTimeOut = BootTimeOut;
672
673 UpdatePageEnd (CallbackData);
674 }
675
676 /**
677 Refresh the text mode page.
678
679 @param CallbackData The BMM context data.
680
681 **/
682 VOID
683 UpdateConModePage (
684 IN BMM_CALLBACK_DATA *CallbackData
685 )
686 {
687 UINTN Mode;
688 UINTN Index;
689 UINTN Col;
690 UINTN Row;
691 CHAR16 RowString[50];
692 CHAR16 ModeString[50];
693 UINTN TempStringLen;
694 UINTN MaxMode;
695 UINTN ValidMode;
696 EFI_STRING_ID *ModeToken;
697 IFR_OPTION *IfrOptionList;
698 EFI_STATUS Status;
699 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut;
700
701 ConOut = gST->ConOut;
702 Index = 0;
703 ValidMode = 0;
704 MaxMode = (UINTN) (ConOut->Mode->MaxMode);
705
706 CallbackData->BmmAskSaveOrNot = TRUE;
707
708 UpdatePageStart (CallbackData);
709
710 //
711 // Check valid mode
712 //
713 for (Mode = 0; Mode < MaxMode; Mode++) {
714 Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);
715 if (EFI_ERROR (Status)) {
716 continue;
717 }
718 ValidMode++;
719 }
720
721 if (ValidMode == 0) {
722 return;
723 }
724
725 IfrOptionList = AllocateZeroPool (sizeof (IFR_OPTION) * ValidMode);
726 ASSERT(IfrOptionList != NULL);
727
728 ModeToken = AllocateZeroPool (sizeof (EFI_STRING_ID) * ValidMode);
729 ASSERT(ModeToken != NULL);
730
731 //
732 // Determin which mode should be the first entry in menu
733 //
734 GetConsoleOutMode (CallbackData);
735
736 //
737 // Build text mode options
738 //
739 for (Mode = 0; Mode < MaxMode; Mode++) {
740 Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);
741 if (EFI_ERROR (Status)) {
742 continue;
743 }
744
745 //
746 // Build mode string Column x Row
747 //
748 TempStringLen = UnicodeValueToString (ModeString, 0, Col, 0);
749 ASSERT ((TempStringLen + StrLen (L" x ")) < (sizeof (ModeString) / sizeof (ModeString[0])));
750 StrCat (ModeString, L" x ");
751 TempStringLen = UnicodeValueToString (RowString, 0, Row, 0);
752 ASSERT ((StrLen (ModeString) + TempStringLen) < (sizeof (ModeString) / sizeof (ModeString[0])));
753 StrCat (ModeString, RowString);
754
755 ModeToken[Index] = HiiSetString (CallbackData->BmmHiiHandle, 0, ModeString, NULL);
756
757 IfrOptionList[Index].StringToken = ModeToken[Index];
758 IfrOptionList[Index].Value.u16 = (UINT16) Mode;
759 if (Mode == CallbackData->BmmFakeNvData.ConsoleOutMode) {
760 IfrOptionList[Index].Flags = EFI_IFR_OPTION_DEFAULT;
761 } else {
762 IfrOptionList[Index].Flags = 0;
763 }
764 Index++;
765 }
766
767 CreateOneOfOpCode (
768 (EFI_QUESTION_ID) CON_MODE_QUESTION_ID,
769 VARSTORE_ID_BOOT_MAINT,
770 CON_MODE_VAR_OFFSET,
771 STRING_TOKEN (STR_CON_MODE_SETUP),
772 STRING_TOKEN (STR_CON_MODE_SETUP),
773 EFI_IFR_FLAG_RESET_REQUIRED,
774 EFI_IFR_NUMERIC_SIZE_2,
775 IfrOptionList,
776 ValidMode,
777 &gUpdateData
778 );
779 FreePool (IfrOptionList);
780 FreePool (ModeToken);
781
782 UpdatePageEnd (CallbackData);
783 }
784
785 /**
786 Create the dynamic page which allows user to set the property such as Baud Rate, Data Bits,
787 Parity, Stop Bits, Terminal Type.
788
789 @param CallbackData The BMM context data.
790
791 **/
792 VOID
793 UpdateTerminalPage (
794 IN BMM_CALLBACK_DATA *CallbackData
795 )
796 {
797 UINT8 Index;
798 UINT8 CheckFlags;
799 IFR_OPTION *IfrOptionList;
800 BM_MENU_ENTRY *NewMenuEntry;
801 BM_TERMINAL_CONTEXT *NewTerminalContext;
802
803 CallbackData->BmmAskSaveOrNot = TRUE;
804
805 UpdatePageStart (CallbackData);
806
807 NewMenuEntry = BOpt_GetMenuEntry (
808 &TerminalMenu,
809 CallbackData->CurrentTerminal
810 );
811
812 if (NewMenuEntry == NULL) {
813 return ;
814 }
815
816 NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;
817
818 IfrOptionList = AllocateZeroPool (sizeof (IFR_OPTION) * 19);
819 if (IfrOptionList == NULL) {
820 return ;
821 }
822
823 for (Index = 0; Index < sizeof (BaudRateList) / sizeof (BaudRateList [0]); Index++) {
824 CheckFlags = 0;
825 if (NewTerminalContext->BaudRate == (UINT64) (BaudRateList[Index].Value)) {
826 CheckFlags |= EFI_IFR_OPTION_DEFAULT;
827 NewTerminalContext->BaudRateIndex = Index;
828 CallbackData->BmmFakeNvData.COMBaudRate = NewTerminalContext->BaudRateIndex;
829 }
830
831 IfrOptionList[Index].Flags = CheckFlags;
832 IfrOptionList[Index].StringToken = BaudRateList[Index].StringToken;
833 IfrOptionList[Index].Value.u8 = Index;
834 }
835
836 CreateOneOfOpCode (
837 (EFI_QUESTION_ID) COM_BAUD_RATE_QUESTION_ID,
838 VARSTORE_ID_BOOT_MAINT,
839 COM_BAUD_RATE_VAR_OFFSET,
840 STRING_TOKEN (STR_COM_BAUD_RATE),
841 STRING_TOKEN (STR_COM_BAUD_RATE),
842 0,
843 EFI_IFR_NUMERIC_SIZE_1,
844 IfrOptionList,
845 19,
846 &gUpdateData
847 );
848
849 for (Index = 0; Index < sizeof (DataBitsList) / sizeof (DataBitsList[0]); Index++) {
850 CheckFlags = 0;
851
852 if (NewTerminalContext->DataBits == DataBitsList[Index].Value) {
853 NewTerminalContext->DataBitsIndex = Index;
854 CallbackData->BmmFakeNvData.COMDataRate = NewTerminalContext->DataBitsIndex;
855 CheckFlags |= EFI_IFR_OPTION_DEFAULT;
856 }
857
858 IfrOptionList[Index].Flags = CheckFlags;
859 IfrOptionList[Index].StringToken = DataBitsList[Index].StringToken;
860 IfrOptionList[Index].Value.u8 = Index;
861 }
862
863 CreateOneOfOpCode (
864 (EFI_QUESTION_ID) COM_DATA_RATE_QUESTION_ID,
865 VARSTORE_ID_BOOT_MAINT,
866 COM_DATA_RATE_VAR_OFFSET,
867 STRING_TOKEN (STR_COM_DATA_BITS),
868 STRING_TOKEN (STR_COM_DATA_BITS),
869 0,
870 EFI_IFR_NUMERIC_SIZE_1,
871 IfrOptionList,
872 4,
873 &gUpdateData
874 );
875
876 for (Index = 0; Index < sizeof (ParityList) / sizeof (ParityList[0]); Index++) {
877 CheckFlags = 0;
878 if (NewTerminalContext->Parity == ParityList[Index].Value) {
879 CheckFlags |= EFI_IFR_OPTION_DEFAULT;
880 NewTerminalContext->ParityIndex = (UINT8) Index;
881 CallbackData->BmmFakeNvData.COMParity = NewTerminalContext->ParityIndex;
882 }
883
884 IfrOptionList[Index].Flags = CheckFlags;
885 IfrOptionList[Index].StringToken = ParityList[Index].StringToken;
886 IfrOptionList[Index].Value.u8 = Index;
887 }
888
889 CreateOneOfOpCode (
890 (EFI_QUESTION_ID) COM_PARITY_QUESTION_ID,
891 VARSTORE_ID_BOOT_MAINT,
892 COM_PARITY_VAR_OFFSET,
893 STRING_TOKEN (STR_COM_PARITY),
894 STRING_TOKEN (STR_COM_PARITY),
895 0,
896 EFI_IFR_NUMERIC_SIZE_1,
897 IfrOptionList,
898 5,
899 &gUpdateData
900 );
901
902 for (Index = 0; Index < sizeof (StopBitsList) / sizeof (StopBitsList[0]); Index++) {
903 CheckFlags = 0;
904 if (NewTerminalContext->StopBits == StopBitsList[Index].Value) {
905 CheckFlags |= EFI_IFR_OPTION_DEFAULT;
906 NewTerminalContext->StopBitsIndex = (UINT8) Index;
907 CallbackData->BmmFakeNvData.COMStopBits = NewTerminalContext->StopBitsIndex;
908 }
909
910 IfrOptionList[Index].Flags = CheckFlags;
911 IfrOptionList[Index].StringToken = StopBitsList[Index].StringToken;
912 IfrOptionList[Index].Value.u8 = Index;
913 }
914
915 CreateOneOfOpCode (
916 (EFI_QUESTION_ID) COM_STOP_BITS_QUESTION_ID,
917 VARSTORE_ID_BOOT_MAINT,
918 COM_STOP_BITS_VAR_OFFSET,
919 STRING_TOKEN (STR_COM_STOP_BITS),
920 STRING_TOKEN (STR_COM_STOP_BITS),
921 0,
922 EFI_IFR_NUMERIC_SIZE_1,
923 IfrOptionList,
924 3,
925 &gUpdateData
926 );
927
928 for (Index = 0; Index < 4; Index++) {
929 CheckFlags = 0;
930 if (NewTerminalContext->TerminalType == Index) {
931 CheckFlags |= EFI_IFR_OPTION_DEFAULT;
932 CallbackData->BmmFakeNvData.COMTerminalType = NewTerminalContext->TerminalType;
933 }
934
935 IfrOptionList[Index].Flags = CheckFlags;
936 IfrOptionList[Index].StringToken = (EFI_STRING_ID) TerminalType[Index];
937 IfrOptionList[Index].Value.u8 = Index;
938 }
939
940 CreateOneOfOpCode (
941 (EFI_QUESTION_ID) COM_TERMINAL_QUESTION_ID,
942 VARSTORE_ID_BOOT_MAINT,
943 COM_TERMINAL_VAR_OFFSET,
944 STRING_TOKEN (STR_COM_TERMI_TYPE),
945 STRING_TOKEN (STR_COM_TERMI_TYPE),
946 0,
947 EFI_IFR_NUMERIC_SIZE_1,
948 IfrOptionList,
949 4,
950 &gUpdateData
951 );
952
953 FreePool (IfrOptionList);
954
955 UpdatePageEnd (CallbackData);
956 }
957
958 /**
959 Dispatch the correct update page function to call based on
960 the UpdatePageId.
961
962 @param UpdatePageId The form ID.
963 @param CallbackData The BMM context data.
964
965 **/
966 VOID
967 UpdatePageBody (
968 IN UINT16 UpdatePageId,
969 IN BMM_CALLBACK_DATA *CallbackData
970 )
971 {
972 CleanUpPage (UpdatePageId, CallbackData);
973 switch (UpdatePageId) {
974 case FORM_CON_IN_ID:
975 UpdateConsolePage (UpdatePageId, &ConsoleInpMenu, CallbackData);
976 break;
977
978 case FORM_CON_OUT_ID:
979 UpdateConsolePage (UpdatePageId, &ConsoleOutMenu, CallbackData);
980 break;
981
982 case FORM_CON_ERR_ID:
983 UpdateConsolePage (UpdatePageId, &ConsoleErrMenu, CallbackData);
984 break;
985
986 case FORM_BOOT_CHG_ID:
987 UpdateOrderPage (UpdatePageId, &BootOptionMenu, CallbackData);
988 break;
989
990 case FORM_DRV_CHG_ID:
991 UpdateOrderPage (UpdatePageId, &DriverOptionMenu, CallbackData);
992 break;
993
994 default:
995 break;
996 }
997 }
998
999 /**
1000 Get the index number (#### in Boot####) for the boot option pointed to a BBS legacy device type
1001 specified by DeviceType.
1002
1003 @param DeviceType The legacy device type. It can be floppy, network, harddisk, cdrom,
1004 etc.
1005 @param OptionIndex Returns the index number (#### in Boot####).
1006 @param OptionSize Return the size of the Boot### variable.
1007
1008 **/
1009 VOID *
1010 GetLegacyBootOptionVar (
1011 IN UINTN DeviceType,
1012 OUT UINTN *OptionIndex,
1013 OUT UINTN *OptionSize
1014 )
1015 {
1016 EFI_DEVICE_PATH_PROTOCOL *DevicePath;
1017 VOID *OptionBuffer;
1018 UINTN OrderSize;
1019 UINTN Index;
1020 UINT16 *OrderBuffer;
1021 CHAR16 StrTemp[100];
1022 UINT16 FilePathSize;
1023 UINT8 *Ptr;
1024 UINT8 *OptionalData;
1025
1026 //
1027 // Get Boot Option number from the size of BootOrder
1028 //
1029 OrderBuffer = BdsLibGetVariableAndSize (
1030 L"BootOrder",
1031 &gEfiGlobalVariableGuid,
1032 &OrderSize
1033 );
1034
1035 if (OrderBuffer == NULL) {
1036 return NULL;
1037 }
1038
1039 for (Index = 0; Index < OrderSize / sizeof (UINT16); Index++) {
1040 UnicodeSPrint (StrTemp, 100, L"Boot%04x", OrderBuffer[Index]);
1041 OptionBuffer = BdsLibGetVariableAndSize (
1042 StrTemp,
1043 &gEfiGlobalVariableGuid,
1044 OptionSize
1045 );
1046 if (NULL == OptionBuffer) {
1047 continue;
1048 }
1049
1050 Ptr = (UINT8 *) OptionBuffer;
1051 Ptr += sizeof (UINT32);
1052
1053 FilePathSize = *(UINT16 *) Ptr;
1054 Ptr += sizeof (UINT16);
1055
1056 Ptr += StrSize ((CHAR16 *) Ptr);
1057
1058 //
1059 // Now Ptr point to Device Path
1060 //
1061 DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) Ptr;
1062 Ptr += FilePathSize;
1063
1064 //
1065 // Now Ptr point to Optional Data
1066 //
1067 OptionalData = Ptr;
1068
1069 if ((DeviceType == ((BBS_TABLE *) OptionalData)->DeviceType) &&
1070 (BBS_DEVICE_PATH == DevicePath->Type) &&
1071 (BBS_BBS_DP == DevicePath->SubType)
1072 ) {
1073 *OptionIndex = OrderBuffer[Index];
1074 FreePool (OrderBuffer);
1075 return OptionBuffer;
1076 } else {
1077 FreePool (OptionBuffer);
1078 }
1079 }
1080
1081 FreePool (OrderBuffer);
1082 return NULL;
1083 }
1084
1085 /**
1086 Create a dynamic page so that Legacy Device boot order
1087 can be set for specified device type.
1088
1089 @param UpdatePageId The form ID. It also spefies the legacy device type.
1090 @param CallbackData The BMM context data.
1091
1092
1093 **/
1094 VOID
1095 UpdateSetLegacyDeviceOrderPage (
1096 IN UINT16 UpdatePageId,
1097 IN BMM_CALLBACK_DATA *CallbackData
1098 )
1099 {
1100 BM_LEGACY_DEV_ORDER_CONTEXT *DevOrder;
1101 BM_MENU_OPTION *OptionMenu;
1102 BM_MENU_ENTRY *NewMenuEntry;
1103 IFR_OPTION *IfrOptionList;
1104 EFI_STRING_ID StrRef;
1105 EFI_STRING_ID StrRefHelp;
1106 BBS_TYPE BbsType;
1107 UINTN VarSize;
1108 UINTN Pos;
1109 UINTN Bit;
1110 UINT16 Index;
1111 UINT16 Key;
1112 CHAR16 String[100];
1113 CHAR16 *TypeStr;
1114 CHAR16 *TypeStrHelp;
1115 UINT16 VarDevOrder;
1116 UINT8 *VarData;
1117 UINT8 *LegacyOrder;
1118 UINT8 *OldData;
1119 UINT8 *DisMap;
1120
1121 OptionMenu = NULL;
1122 Key = 0;
1123 StrRef = 0;
1124 StrRefHelp = 0;
1125 TypeStr = NULL;
1126 TypeStrHelp = NULL;
1127 BbsType = BBS_FLOPPY;
1128 LegacyOrder = NULL;
1129 OldData = NULL;
1130 DisMap = NULL;
1131
1132 CallbackData->BmmAskSaveOrNot = TRUE;
1133 UpdatePageStart (CallbackData);
1134
1135 DisMap = CallbackData->BmmOldFakeNVData.DisableMap;
1136
1137 SetMem (DisMap, 32, 0);
1138 //
1139 // Create oneof option list
1140 //
1141 switch (UpdatePageId) {
1142 case FORM_SET_FD_ORDER_ID:
1143 OptionMenu = (BM_MENU_OPTION *) &LegacyFDMenu;
1144 Key = (UINT16) LEGACY_FD_QUESTION_ID;
1145 TypeStr = STR_FLOPPY;
1146 TypeStrHelp = STR_FLOPPY_HELP;
1147 BbsType = BBS_FLOPPY;
1148 LegacyOrder = CallbackData->BmmFakeNvData.LegacyFD;
1149 OldData = CallbackData->BmmOldFakeNVData.LegacyFD;
1150 break;
1151
1152 case FORM_SET_HD_ORDER_ID:
1153 OptionMenu = (BM_MENU_OPTION *) &LegacyHDMenu;
1154 Key = (UINT16) LEGACY_HD_QUESTION_ID;
1155 TypeStr = STR_HARDDISK;
1156 TypeStrHelp = STR_HARDDISK_HELP;
1157 BbsType = BBS_HARDDISK;
1158 LegacyOrder = CallbackData->BmmFakeNvData.LegacyHD;
1159 OldData = CallbackData->BmmOldFakeNVData.LegacyHD;
1160 break;
1161
1162 case FORM_SET_CD_ORDER_ID:
1163 OptionMenu = (BM_MENU_OPTION *) &LegacyCDMenu;
1164 Key = (UINT16) LEGACY_CD_QUESTION_ID;
1165 TypeStr = STR_CDROM;
1166 TypeStrHelp = STR_CDROM_HELP;
1167 BbsType = BBS_CDROM;
1168 LegacyOrder = CallbackData->BmmFakeNvData.LegacyCD;
1169 OldData = CallbackData->BmmOldFakeNVData.LegacyCD;
1170 break;
1171
1172 case FORM_SET_NET_ORDER_ID:
1173 OptionMenu = (BM_MENU_OPTION *) &LegacyNETMenu;
1174 Key = (UINT16) LEGACY_NET_QUESTION_ID;
1175 TypeStr = STR_NET;
1176 TypeStrHelp = STR_NET_HELP;
1177 BbsType = BBS_EMBED_NETWORK;
1178 LegacyOrder = CallbackData->BmmFakeNvData.LegacyNET;
1179 OldData = CallbackData->BmmOldFakeNVData.LegacyNET;
1180 break;
1181
1182 case FORM_SET_BEV_ORDER_ID:
1183 OptionMenu = (BM_MENU_OPTION *) &LegacyBEVMenu;
1184 Key = (UINT16) LEGACY_BEV_QUESTION_ID;
1185 TypeStr = STR_BEV;
1186 TypeStrHelp = STR_BEV_HELP;
1187 BbsType = BBS_BEV_DEVICE;
1188 LegacyOrder = CallbackData->BmmFakeNvData.LegacyBEV;
1189 OldData = CallbackData->BmmOldFakeNVData.LegacyBEV;
1190 break;
1191
1192 default:
1193 DEBUG ((EFI_D_ERROR, "Invalid command ID for updating page!\n"));
1194 return;
1195 }
1196
1197 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, OptionMenu);
1198
1199 IfrOptionList = AllocateZeroPool (sizeof (IFR_OPTION) * (OptionMenu->MenuNumber + 1));
1200 if (NULL == IfrOptionList) {
1201 return ;
1202 }
1203
1204 for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {
1205 NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index);
1206 IfrOptionList[Index].Flags = 0;
1207 if (0 == Index) {
1208 IfrOptionList[Index].Flags |= EFI_IFR_OPTION_DEFAULT;
1209 }
1210
1211 IfrOptionList[Index].StringToken = NewMenuEntry->DisplayStringToken;
1212 IfrOptionList[Index].Value.u8 = (UINT8) ((BM_LEGACY_DEVICE_CONTEXT *) NewMenuEntry->VariableContext)->Index;
1213 }
1214 //
1215 // for item "Disabled"
1216 //
1217 IfrOptionList[Index].Flags = 0;
1218 IfrOptionList[Index].StringToken = STRING_TOKEN (STR_DISABLE_LEGACY_DEVICE);
1219 IfrOptionList[Index].Value.u8 = 0xFF;
1220
1221 //
1222 // Get Device Order from variable
1223 //
1224 VarData = BdsLibGetVariableAndSize (
1225 VAR_LEGACY_DEV_ORDER,
1226 &EfiLegacyDevOrderGuid,
1227 &VarSize
1228 );
1229
1230 if (NULL != VarData) {
1231 DevOrder = (BM_LEGACY_DEV_ORDER_CONTEXT *) VarData;
1232 while (VarData < VarData + VarSize) {
1233 if (DevOrder->BbsType == BbsType) {
1234 break;
1235 }
1236
1237 VarData += sizeof (BBS_TYPE);
1238 VarData += *(UINT16 *) VarData;
1239 DevOrder = (BM_LEGACY_DEV_ORDER_CONTEXT *) VarData;
1240 }
1241 //
1242 // Create oneof tag here for FD/HD/CD #1 #2
1243 //
1244 for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {
1245 //
1246 // Create the string for oneof tag
1247 //
1248 UnicodeSPrint (String, sizeof (String), TypeStr, Index);
1249 StrRef = HiiSetString (CallbackData->BmmHiiHandle, 0, String, NULL);
1250
1251 UnicodeSPrint (String, sizeof (String), TypeStrHelp, Index);
1252 StrRefHelp = HiiSetString (CallbackData->BmmHiiHandle, 0, String, NULL);
1253
1254 CreateOneOfOpCode (
1255 (EFI_QUESTION_ID) (Key + Index),
1256 VARSTORE_ID_BOOT_MAINT,
1257 (UINT16) (Key + Index - CONFIG_OPTION_OFFSET),
1258 StrRef,
1259 StrRefHelp,
1260 EFI_IFR_FLAG_CALLBACK,
1261 EFI_IFR_NUMERIC_SIZE_1,
1262 IfrOptionList,
1263 OptionMenu->MenuNumber + 1,
1264 &gUpdateData
1265 );
1266
1267 VarDevOrder = *(UINT16 *) ((UINT8 *) DevOrder + sizeof (BBS_TYPE) + sizeof (UINT16) + Index * sizeof (UINT16));
1268
1269 if (0xFF00 == (VarDevOrder & 0xFF00)) {
1270 LegacyOrder[Index] = 0xFF;
1271 Pos = (VarDevOrder & 0xFF) / 8;
1272 Bit = 7 - ((VarDevOrder & 0xFF) % 8);
1273 DisMap[Pos] = (UINT8) (DisMap[Pos] | (UINT8) (1 << Bit));
1274 } else {
1275 LegacyOrder[Index] = (UINT8) (VarDevOrder & 0xFF);
1276 }
1277 }
1278 }
1279
1280 CopyMem (OldData, LegacyOrder, 100);
1281
1282 if (IfrOptionList != NULL) {
1283 FreePool (IfrOptionList);
1284 IfrOptionList = NULL;
1285 }
1286
1287 UpdatePageEnd (CallbackData);
1288 }
1289
1290 /**
1291 Dispatch the display to the next page based on NewPageId.
1292
1293 @param Private The BMM context data.
1294 @param NewPageId The original page ID.
1295
1296 **/
1297 VOID
1298 UpdatePageId (
1299 BMM_CALLBACK_DATA *Private,
1300 UINT16 NewPageId
1301 )
1302 {
1303 if ((NewPageId < FILE_OPTION_OFFSET) && (NewPageId >= HANDLE_OPTION_OFFSET)) {
1304 //
1305 // If we select a handle to add driver option, advance to the add handle description page.
1306 //
1307 NewPageId = FORM_DRV_ADD_HANDLE_DESC_ID;
1308 } else if ((NewPageId == KEY_VALUE_SAVE_AND_EXIT) || (NewPageId == KEY_VALUE_NO_SAVE_AND_EXIT)) {
1309 //
1310 // Return to main page after "Save Changes" or "Discard Changes".
1311 //
1312 NewPageId = FORM_MAIN_ID;
1313 } else if ((NewPageId >= TERMINAL_OPTION_OFFSET) && (NewPageId < CONSOLE_OPTION_OFFSET)) {
1314 NewPageId = FORM_CON_COM_SETUP_ID;
1315 }
1316
1317 if ((NewPageId > 0) && (NewPageId < MAXIMUM_FORM_ID)) {
1318 Private->BmmPreviousPageId = Private->BmmCurrentPageId;
1319 Private->BmmCurrentPageId = NewPageId;
1320 }
1321 }