]> git.proxmox.com Git - mirror_edk2.git/blob - IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/UpdatePage.c
Fix ICC build warning.
[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 ASSERT (OptionMenu->MenuNumber <= (sizeof (IfrOptionList) / sizeof (IfrOptionList[0])));
530 for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {
531 NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index);
532 IfrOptionList[Index].StringToken = NewMenuEntry->DisplayStringToken;
533 IfrOptionList[Index].Value.u8 = (UINT8) (NewMenuEntry->OptionNumber + 1);
534 IfrOptionList[Index].Flags = 0;
535 CallbackData->BmmFakeNvData.OptionOrder[Index] = IfrOptionList[Index].Value.u8;
536 }
537
538 if (OptionMenu->MenuNumber > 0) {
539 CreateOrderedListOpCode (
540 (EFI_QUESTION_ID) OPTION_ORDER_QUESTION_ID,
541 VARSTORE_ID_BOOT_MAINT,
542 OPTION_ORDER_VAR_OFFSET,
543 STRING_TOKEN (STR_CHANGE_ORDER),
544 STRING_TOKEN (STR_CHANGE_ORDER),
545 0,
546 0,
547 EFI_IFR_NUMERIC_SIZE_1,
548 100,
549 IfrOptionList,
550 OptionMenu->MenuNumber,
551 &gUpdateData
552 );
553 }
554
555 FreePool (IfrOptionList);
556
557 UpdatePageEnd (CallbackData);
558
559 CopyMem (
560 CallbackData->BmmOldFakeNVData.OptionOrder,
561 CallbackData->BmmFakeNvData.OptionOrder,
562 100
563 );
564 }
565
566 /**
567 Create the dynamic page to allow user to set
568 the "BootNext" value.
569
570 @param CallbackData The BMM context data.
571
572 **/
573 VOID
574 UpdateBootNextPage (
575 IN BMM_CALLBACK_DATA *CallbackData
576 )
577 {
578 BM_MENU_ENTRY *NewMenuEntry;
579 BM_LOAD_CONTEXT *NewLoadContext;
580 IFR_OPTION *IfrOptionList;
581 UINTN NumberOfOptions;
582 UINT16 Index;
583
584 IfrOptionList = NULL;
585 NumberOfOptions = BootOptionMenu.MenuNumber;
586 CallbackData->BmmAskSaveOrNot = TRUE;
587
588 UpdatePageStart (CallbackData);
589 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &BootOptionMenu);
590
591 if (NumberOfOptions > 0) {
592 IfrOptionList = AllocateZeroPool ((NumberOfOptions + 1) * sizeof (IFR_OPTION));
593
594 ASSERT (IfrOptionList);
595
596 CallbackData->BmmFakeNvData.BootNext = (UINT16) (BootOptionMenu.MenuNumber);
597
598 for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {
599 NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);
600 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;
601 if (NewLoadContext->IsBootNext) {
602 IfrOptionList[Index].Flags = EFI_IFR_OPTION_DEFAULT;
603 CallbackData->BmmFakeNvData.BootNext = Index;
604 } else {
605 IfrOptionList[Index].Flags = 0;
606 }
607
608 IfrOptionList[Index].Value.u16 = Index;
609 IfrOptionList[Index].StringToken = NewMenuEntry->DisplayStringToken;
610 }
611
612 IfrOptionList[Index].Value.u16 = Index;
613 IfrOptionList[Index].StringToken = STRING_TOKEN (STR_NONE);
614 IfrOptionList[Index].Flags = 0;
615 if (CallbackData->BmmFakeNvData.BootNext == Index) {
616 IfrOptionList[Index].Flags |= EFI_IFR_OPTION_DEFAULT;
617 }
618
619 CreateOneOfOpCode (
620 (EFI_QUESTION_ID) BOOT_NEXT_QUESTION_ID,
621 VARSTORE_ID_BOOT_MAINT,
622 BOOT_NEXT_VAR_OFFSET,
623 STRING_TOKEN (STR_BOOT_NEXT),
624 STRING_TOKEN (STR_BOOT_NEXT_HELP),
625 0,
626 EFI_IFR_NUMERIC_SIZE_2,
627 IfrOptionList,
628 (UINTN) (NumberOfOptions + 1),
629 &gUpdateData
630 );
631
632 FreePool (IfrOptionList);
633 }
634
635 UpdatePageEnd (CallbackData);
636 }
637
638 /**
639 Create the dynamic page to allow user to set the "TimeOut" value.
640
641 @param CallbackData The BMM context data.
642
643 **/
644 VOID
645 UpdateTimeOutPage (
646 IN BMM_CALLBACK_DATA *CallbackData
647 )
648 {
649 UINT16 BootTimeOut;
650
651 CallbackData->BmmAskSaveOrNot = TRUE;
652
653 UpdatePageStart (CallbackData);
654
655 BootTimeOut = BdsLibGetTimeout ();
656
657 CreateNumericOpCode (
658 (EFI_QUESTION_ID) BOOT_TIME_OUT_QUESTION_ID,
659 VARSTORE_ID_BOOT_MAINT,
660 BOOT_TIME_OUT_VAR_OFFSET,
661 STRING_TOKEN (STR_NUM_AUTO_BOOT),
662 STRING_TOKEN (STR_HLP_AUTO_BOOT),
663 0,
664 EFI_IFR_NUMERIC_SIZE_2 | EFI_IFR_DISPLAY_UINT_DEC,
665 0,
666 65535,
667 0,
668 BootTimeOut,
669 &gUpdateData
670 );
671
672 CallbackData->BmmFakeNvData.BootTimeOut = BootTimeOut;
673
674 UpdatePageEnd (CallbackData);
675 }
676
677 /**
678 Refresh the text mode page.
679
680 @param CallbackData The BMM context data.
681
682 **/
683 VOID
684 UpdateConModePage (
685 IN BMM_CALLBACK_DATA *CallbackData
686 )
687 {
688 UINTN Mode;
689 UINTN Index;
690 UINTN Col;
691 UINTN Row;
692 CHAR16 RowString[50];
693 CHAR16 ModeString[50];
694 UINTN TempStringLen;
695 UINTN MaxMode;
696 UINTN ValidMode;
697 EFI_STRING_ID *ModeToken;
698 IFR_OPTION *IfrOptionList;
699 EFI_STATUS Status;
700 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut;
701
702 ConOut = gST->ConOut;
703 Index = 0;
704 ValidMode = 0;
705 MaxMode = (UINTN) (ConOut->Mode->MaxMode);
706
707 CallbackData->BmmAskSaveOrNot = TRUE;
708
709 UpdatePageStart (CallbackData);
710
711 //
712 // Check valid mode
713 //
714 for (Mode = 0; Mode < MaxMode; Mode++) {
715 Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);
716 if (EFI_ERROR (Status)) {
717 continue;
718 }
719 ValidMode++;
720 }
721
722 if (ValidMode == 0) {
723 return;
724 }
725
726 IfrOptionList = AllocateZeroPool (sizeof (IFR_OPTION) * ValidMode);
727 ASSERT(IfrOptionList != NULL);
728
729 ModeToken = AllocateZeroPool (sizeof (EFI_STRING_ID) * ValidMode);
730 ASSERT(ModeToken != NULL);
731
732 //
733 // Determin which mode should be the first entry in menu
734 //
735 GetConsoleOutMode (CallbackData);
736
737 //
738 // Build text mode options
739 //
740 for (Mode = 0; Mode < MaxMode; Mode++) {
741 Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);
742 if (EFI_ERROR (Status)) {
743 continue;
744 }
745
746 //
747 // Build mode string Column x Row
748 //
749 TempStringLen = UnicodeValueToString (ModeString, 0, Col, 0);
750 ASSERT ((TempStringLen + StrLen (L" x ")) < (sizeof (ModeString) / sizeof (ModeString[0])));
751 StrCat (ModeString, L" x ");
752 TempStringLen = UnicodeValueToString (RowString, 0, Row, 0);
753 ASSERT ((StrLen (ModeString) + TempStringLen) < (sizeof (ModeString) / sizeof (ModeString[0])));
754 StrCat (ModeString, RowString);
755
756 HiiLibNewString (CallbackData->BmmHiiHandle, &ModeToken[Index], ModeString);
757
758 IfrOptionList[Index].StringToken = ModeToken[Index];
759 IfrOptionList[Index].Value.u16 = (UINT16) Mode;
760 if (Mode == CallbackData->BmmFakeNvData.ConsoleOutMode) {
761 IfrOptionList[Index].Flags = EFI_IFR_OPTION_DEFAULT;
762 } else {
763 IfrOptionList[Index].Flags = 0;
764 }
765 Index++;
766 }
767
768 CreateOneOfOpCode (
769 (EFI_QUESTION_ID) CON_MODE_QUESTION_ID,
770 VARSTORE_ID_BOOT_MAINT,
771 CON_MODE_VAR_OFFSET,
772 STRING_TOKEN (STR_CON_MODE_SETUP),
773 STRING_TOKEN (STR_CON_MODE_SETUP),
774 EFI_IFR_FLAG_RESET_REQUIRED,
775 EFI_IFR_NUMERIC_SIZE_2,
776 IfrOptionList,
777 ValidMode,
778 &gUpdateData
779 );
780 FreePool (IfrOptionList);
781 FreePool (ModeToken);
782
783 UpdatePageEnd (CallbackData);
784 }
785
786 /**
787 Create the dynamic page which allows user to set the property such as Baud Rate, Data Bits,
788 Parity, Stop Bits, Terminal Type.
789
790 @param CallbackData The BMM context data.
791
792 **/
793 VOID
794 UpdateTerminalPage (
795 IN BMM_CALLBACK_DATA *CallbackData
796 )
797 {
798 UINT8 Index;
799 UINT8 CheckFlags;
800 IFR_OPTION *IfrOptionList;
801 BM_MENU_ENTRY *NewMenuEntry;
802 BM_TERMINAL_CONTEXT *NewTerminalContext;
803
804 CallbackData->BmmAskSaveOrNot = TRUE;
805
806 UpdatePageStart (CallbackData);
807
808 NewMenuEntry = BOpt_GetMenuEntry (
809 &TerminalMenu,
810 CallbackData->CurrentTerminal
811 );
812
813 if (NewMenuEntry == NULL) {
814 return ;
815 }
816
817 NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;
818
819 IfrOptionList = AllocateZeroPool (sizeof (IFR_OPTION) * 19);
820 if (IfrOptionList == NULL) {
821 return ;
822 }
823
824 for (Index = 0; Index < sizeof (BaudRateList) / sizeof (BaudRateList [0]); Index++) {
825 CheckFlags = 0;
826 if (NewTerminalContext->BaudRate == (UINT64) (BaudRateList[Index].Value)) {
827 CheckFlags |= EFI_IFR_OPTION_DEFAULT;
828 NewTerminalContext->BaudRateIndex = Index;
829 CallbackData->BmmFakeNvData.COMBaudRate = NewTerminalContext->BaudRateIndex;
830 }
831
832 IfrOptionList[Index].Flags = CheckFlags;
833 IfrOptionList[Index].StringToken = BaudRateList[Index].StringToken;
834 IfrOptionList[Index].Value.u8 = Index;
835 }
836
837 CreateOneOfOpCode (
838 (EFI_QUESTION_ID) COM_BAUD_RATE_QUESTION_ID,
839 VARSTORE_ID_BOOT_MAINT,
840 COM_BAUD_RATE_VAR_OFFSET,
841 STRING_TOKEN (STR_COM_BAUD_RATE),
842 STRING_TOKEN (STR_COM_BAUD_RATE),
843 0,
844 EFI_IFR_NUMERIC_SIZE_1,
845 IfrOptionList,
846 19,
847 &gUpdateData
848 );
849
850 for (Index = 0; Index < sizeof (DataBitsList) / sizeof (DataBitsList[0]); Index++) {
851 CheckFlags = 0;
852
853 if (NewTerminalContext->DataBits == DataBitsList[Index].Value) {
854 NewTerminalContext->DataBitsIndex = Index;
855 CallbackData->BmmFakeNvData.COMDataRate = NewTerminalContext->DataBitsIndex;
856 CheckFlags |= EFI_IFR_OPTION_DEFAULT;
857 }
858
859 IfrOptionList[Index].Flags = CheckFlags;
860 IfrOptionList[Index].StringToken = DataBitsList[Index].StringToken;
861 IfrOptionList[Index].Value.u8 = Index;
862 }
863
864 CreateOneOfOpCode (
865 (EFI_QUESTION_ID) COM_DATA_RATE_QUESTION_ID,
866 VARSTORE_ID_BOOT_MAINT,
867 COM_DATA_RATE_VAR_OFFSET,
868 STRING_TOKEN (STR_COM_DATA_BITS),
869 STRING_TOKEN (STR_COM_DATA_BITS),
870 0,
871 EFI_IFR_NUMERIC_SIZE_1,
872 IfrOptionList,
873 4,
874 &gUpdateData
875 );
876
877 for (Index = 0; Index < sizeof (ParityList) / sizeof (ParityList[0]); Index++) {
878 CheckFlags = 0;
879 if (NewTerminalContext->Parity == ParityList[Index].Value) {
880 CheckFlags |= EFI_IFR_OPTION_DEFAULT;
881 NewTerminalContext->ParityIndex = (UINT8) Index;
882 CallbackData->BmmFakeNvData.COMParity = NewTerminalContext->ParityIndex;
883 }
884
885 IfrOptionList[Index].Flags = CheckFlags;
886 IfrOptionList[Index].StringToken = ParityList[Index].StringToken;
887 IfrOptionList[Index].Value.u8 = Index;
888 }
889
890 CreateOneOfOpCode (
891 (EFI_QUESTION_ID) COM_PARITY_QUESTION_ID,
892 VARSTORE_ID_BOOT_MAINT,
893 COM_PARITY_VAR_OFFSET,
894 STRING_TOKEN (STR_COM_PARITY),
895 STRING_TOKEN (STR_COM_PARITY),
896 0,
897 EFI_IFR_NUMERIC_SIZE_1,
898 IfrOptionList,
899 5,
900 &gUpdateData
901 );
902
903 for (Index = 0; Index < sizeof (StopBitsList) / sizeof (StopBitsList[0]); Index++) {
904 CheckFlags = 0;
905 if (NewTerminalContext->StopBits == StopBitsList[Index].Value) {
906 CheckFlags |= EFI_IFR_OPTION_DEFAULT;
907 NewTerminalContext->StopBitsIndex = (UINT8) Index;
908 CallbackData->BmmFakeNvData.COMStopBits = NewTerminalContext->StopBitsIndex;
909 }
910
911 IfrOptionList[Index].Flags = CheckFlags;
912 IfrOptionList[Index].StringToken = StopBitsList[Index].StringToken;
913 IfrOptionList[Index].Value.u8 = Index;
914 }
915
916 CreateOneOfOpCode (
917 (EFI_QUESTION_ID) COM_STOP_BITS_QUESTION_ID,
918 VARSTORE_ID_BOOT_MAINT,
919 COM_STOP_BITS_VAR_OFFSET,
920 STRING_TOKEN (STR_COM_STOP_BITS),
921 STRING_TOKEN (STR_COM_STOP_BITS),
922 0,
923 EFI_IFR_NUMERIC_SIZE_1,
924 IfrOptionList,
925 3,
926 &gUpdateData
927 );
928
929 for (Index = 0; Index < 4; Index++) {
930 CheckFlags = 0;
931 if (NewTerminalContext->TerminalType == Index) {
932 CheckFlags |= EFI_IFR_OPTION_DEFAULT;
933 CallbackData->BmmFakeNvData.COMTerminalType = NewTerminalContext->TerminalType;
934 }
935
936 IfrOptionList[Index].Flags = CheckFlags;
937 IfrOptionList[Index].StringToken = (EFI_STRING_ID) TerminalType[Index];
938 IfrOptionList[Index].Value.u8 = Index;
939 }
940
941 CreateOneOfOpCode (
942 (EFI_QUESTION_ID) COM_TERMINAL_QUESTION_ID,
943 VARSTORE_ID_BOOT_MAINT,
944 COM_TERMINAL_VAR_OFFSET,
945 STRING_TOKEN (STR_COM_TERMI_TYPE),
946 STRING_TOKEN (STR_COM_TERMI_TYPE),
947 0,
948 EFI_IFR_NUMERIC_SIZE_1,
949 IfrOptionList,
950 4,
951 &gUpdateData
952 );
953
954 FreePool (IfrOptionList);
955
956 UpdatePageEnd (CallbackData);
957 }
958
959 /**
960 Dispatch the correct update page function to call based on
961 the UpdatePageId.
962
963 @param UpdatePageId The form ID.
964 @param CallbackData The BMM context data.
965
966 **/
967 VOID
968 UpdatePageBody (
969 IN UINT16 UpdatePageId,
970 IN BMM_CALLBACK_DATA *CallbackData
971 )
972 {
973 CleanUpPage (UpdatePageId, CallbackData);
974 switch (UpdatePageId) {
975 case FORM_CON_IN_ID:
976 UpdateConsolePage (UpdatePageId, &ConsoleInpMenu, CallbackData);
977 break;
978
979 case FORM_CON_OUT_ID:
980 UpdateConsolePage (UpdatePageId, &ConsoleOutMenu, CallbackData);
981 break;
982
983 case FORM_CON_ERR_ID:
984 UpdateConsolePage (UpdatePageId, &ConsoleErrMenu, CallbackData);
985 break;
986
987 case FORM_BOOT_CHG_ID:
988 UpdateOrderPage (UpdatePageId, &BootOptionMenu, CallbackData);
989 break;
990
991 case FORM_DRV_CHG_ID:
992 UpdateOrderPage (UpdatePageId, &DriverOptionMenu, CallbackData);
993 break;
994
995 default:
996 break;
997 }
998 }
999
1000 /**
1001 Get the index number (#### in Boot####) for the boot option pointed to a BBS legacy device type
1002 specified by DeviceType.
1003
1004 @param DeviceType The legacy device type. It can be floppy, network, harddisk, cdrom,
1005 etc.
1006 @param OptionIndex Returns the index number (#### in Boot####).
1007 @param OptionSize Return the size of the Boot### variable.
1008
1009 **/
1010 VOID *
1011 GetLegacyBootOptionVar (
1012 IN UINTN DeviceType,
1013 OUT UINTN *OptionIndex,
1014 OUT UINTN *OptionSize
1015 )
1016 {
1017 EFI_DEVICE_PATH_PROTOCOL *DevicePath;
1018 VOID *OptionBuffer;
1019 UINTN OrderSize;
1020 UINTN Index;
1021 UINT16 *OrderBuffer;
1022 CHAR16 StrTemp[100];
1023 UINT16 FilePathSize;
1024 UINT8 *Ptr;
1025 UINT8 *OptionalData;
1026
1027 //
1028 // Get Boot Option number from the size of BootOrder
1029 //
1030 OrderBuffer = BdsLibGetVariableAndSize (
1031 L"BootOrder",
1032 &gEfiGlobalVariableGuid,
1033 &OrderSize
1034 );
1035
1036 if (OrderBuffer == NULL) {
1037 return NULL;
1038 }
1039
1040 for (Index = 0; Index < OrderSize / sizeof (UINT16); Index++) {
1041 UnicodeSPrint (StrTemp, 100, L"Boot%04x", OrderBuffer[Index]);
1042 OptionBuffer = BdsLibGetVariableAndSize (
1043 StrTemp,
1044 &gEfiGlobalVariableGuid,
1045 OptionSize
1046 );
1047 if (NULL == OptionBuffer) {
1048 continue;
1049 }
1050
1051 Ptr = (UINT8 *) OptionBuffer;
1052 Ptr += sizeof (UINT32);
1053
1054 FilePathSize = *(UINT16 *) Ptr;
1055 Ptr += sizeof (UINT16);
1056
1057 Ptr += StrSize ((CHAR16 *) Ptr);
1058
1059 //
1060 // Now Ptr point to Device Path
1061 //
1062 DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) Ptr;
1063 Ptr += FilePathSize;
1064
1065 //
1066 // Now Ptr point to Optional Data
1067 //
1068 OptionalData = Ptr;
1069
1070 if ((DeviceType == ((BBS_TABLE *) OptionalData)->DeviceType) &&
1071 (BBS_DEVICE_PATH == DevicePath->Type) &&
1072 (BBS_BBS_DP == DevicePath->SubType)
1073 ) {
1074 *OptionIndex = OrderBuffer[Index];
1075 FreePool (OrderBuffer);
1076 return OptionBuffer;
1077 } else {
1078 FreePool (OptionBuffer);
1079 }
1080 }
1081
1082 FreePool (OrderBuffer);
1083 return NULL;
1084 }
1085
1086 /**
1087 Create a dynamic page so that Legacy Device boot order
1088 can be set for specified device type.
1089
1090 @param UpdatePageId The form ID. It also spefies the legacy device type.
1091 @param CallbackData The BMM context data.
1092
1093
1094 **/
1095 VOID
1096 UpdateSetLegacyDeviceOrderPage (
1097 IN UINT16 UpdatePageId,
1098 IN BMM_CALLBACK_DATA *CallbackData
1099 )
1100 {
1101 BM_LEGACY_DEV_ORDER_CONTEXT *DevOrder;
1102 BM_MENU_OPTION *OptionMenu;
1103 BM_MENU_ENTRY *NewMenuEntry;
1104 IFR_OPTION *IfrOptionList;
1105 EFI_STRING_ID StrRef;
1106 EFI_STRING_ID StrRefHelp;
1107 BBS_TYPE BbsType;
1108 UINTN VarSize;
1109 UINTN Pos;
1110 UINTN Bit;
1111 UINT16 Index;
1112 UINT16 Key;
1113 CHAR16 String[100];
1114 CHAR16 *TypeStr;
1115 CHAR16 *TypeStrHelp;
1116 UINT16 VarDevOrder;
1117 UINT8 *VarData;
1118 UINT8 *LegacyOrder;
1119 UINT8 *OldData;
1120 UINT8 *DisMap;
1121
1122 OptionMenu = NULL;
1123 Key = 0;
1124 StrRef = 0;
1125 StrRefHelp = 0;
1126 TypeStr = NULL;
1127 TypeStrHelp = NULL;
1128 BbsType = BBS_FLOPPY;
1129 LegacyOrder = NULL;
1130 OldData = NULL;
1131 DisMap = NULL;
1132
1133 CallbackData->BmmAskSaveOrNot = TRUE;
1134 UpdatePageStart (CallbackData);
1135
1136 DisMap = CallbackData->BmmOldFakeNVData.DisableMap;
1137
1138 SetMem (DisMap, 32, 0);
1139 //
1140 // Create oneof option list
1141 //
1142 switch (UpdatePageId) {
1143 case FORM_SET_FD_ORDER_ID:
1144 OptionMenu = (BM_MENU_OPTION *) &LegacyFDMenu;
1145 Key = (UINT16) LEGACY_FD_QUESTION_ID;
1146 TypeStr = STR_FLOPPY;
1147 TypeStrHelp = STR_FLOPPY_HELP;
1148 BbsType = BBS_FLOPPY;
1149 LegacyOrder = CallbackData->BmmFakeNvData.LegacyFD;
1150 OldData = CallbackData->BmmOldFakeNVData.LegacyFD;
1151 break;
1152
1153 case FORM_SET_HD_ORDER_ID:
1154 OptionMenu = (BM_MENU_OPTION *) &LegacyHDMenu;
1155 Key = (UINT16) LEGACY_HD_QUESTION_ID;
1156 TypeStr = STR_HARDDISK;
1157 TypeStrHelp = STR_HARDDISK_HELP;
1158 BbsType = BBS_HARDDISK;
1159 LegacyOrder = CallbackData->BmmFakeNvData.LegacyHD;
1160 OldData = CallbackData->BmmOldFakeNVData.LegacyHD;
1161 break;
1162
1163 case FORM_SET_CD_ORDER_ID:
1164 OptionMenu = (BM_MENU_OPTION *) &LegacyCDMenu;
1165 Key = (UINT16) LEGACY_CD_QUESTION_ID;
1166 TypeStr = STR_CDROM;
1167 TypeStrHelp = STR_CDROM_HELP;
1168 BbsType = BBS_CDROM;
1169 LegacyOrder = CallbackData->BmmFakeNvData.LegacyCD;
1170 OldData = CallbackData->BmmOldFakeNVData.LegacyCD;
1171 break;
1172
1173 case FORM_SET_NET_ORDER_ID:
1174 OptionMenu = (BM_MENU_OPTION *) &LegacyNETMenu;
1175 Key = (UINT16) LEGACY_NET_QUESTION_ID;
1176 TypeStr = STR_NET;
1177 TypeStrHelp = STR_NET_HELP;
1178 BbsType = BBS_EMBED_NETWORK;
1179 LegacyOrder = CallbackData->BmmFakeNvData.LegacyNET;
1180 OldData = CallbackData->BmmOldFakeNVData.LegacyNET;
1181 break;
1182
1183 case FORM_SET_BEV_ORDER_ID:
1184 OptionMenu = (BM_MENU_OPTION *) &LegacyBEVMenu;
1185 Key = (UINT16) LEGACY_BEV_QUESTION_ID;
1186 TypeStr = STR_BEV;
1187 TypeStrHelp = STR_BEV_HELP;
1188 BbsType = BBS_BEV_DEVICE;
1189 LegacyOrder = CallbackData->BmmFakeNvData.LegacyBEV;
1190 OldData = CallbackData->BmmOldFakeNVData.LegacyBEV;
1191 break;
1192
1193 default:
1194 DEBUG ((EFI_D_ERROR, "Invalid command ID for updating page!\n"));
1195 return;
1196 }
1197
1198 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, OptionMenu);
1199
1200 IfrOptionList = AllocateZeroPool (sizeof (IFR_OPTION) * (OptionMenu->MenuNumber + 1));
1201 if (NULL == IfrOptionList) {
1202 return ;
1203 }
1204
1205 for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {
1206 NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index);
1207 IfrOptionList[Index].Flags = 0;
1208 if (0 == Index) {
1209 IfrOptionList[Index].Flags |= EFI_IFR_OPTION_DEFAULT;
1210 }
1211
1212 IfrOptionList[Index].StringToken = NewMenuEntry->DisplayStringToken;
1213 IfrOptionList[Index].Value.u8 = (UINT8) ((BM_LEGACY_DEVICE_CONTEXT *) NewMenuEntry->VariableContext)->Index;
1214 }
1215 //
1216 // for item "Disabled"
1217 //
1218 IfrOptionList[Index].Flags = 0;
1219 IfrOptionList[Index].StringToken = STRING_TOKEN (STR_DISABLE_LEGACY_DEVICE);
1220 IfrOptionList[Index].Value.u8 = 0xFF;
1221
1222 //
1223 // Get Device Order from variable
1224 //
1225 VarData = BdsLibGetVariableAndSize (
1226 VAR_LEGACY_DEV_ORDER,
1227 &EfiLegacyDevOrderGuid,
1228 &VarSize
1229 );
1230
1231 if (NULL != VarData) {
1232 DevOrder = (BM_LEGACY_DEV_ORDER_CONTEXT *) VarData;
1233 while (VarData < VarData + VarSize) {
1234 if (DevOrder->BbsType == BbsType) {
1235 break;
1236 }
1237
1238 VarData += sizeof (BBS_TYPE);
1239 VarData += *(UINT16 *) VarData;
1240 DevOrder = (BM_LEGACY_DEV_ORDER_CONTEXT *) VarData;
1241 }
1242 //
1243 // Create oneof tag here for FD/HD/CD #1 #2
1244 //
1245 for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {
1246 //
1247 // Create the string for oneof tag
1248 //
1249 UnicodeSPrint (String, sizeof (String), TypeStr, Index);
1250 StrRef = 0;
1251 HiiLibNewString (CallbackData->BmmHiiHandle, &StrRef, String);
1252
1253 UnicodeSPrint (String, sizeof (String), TypeStrHelp, Index);
1254 StrRefHelp = 0;
1255 HiiLibNewString (CallbackData->BmmHiiHandle, &StrRefHelp, String);
1256
1257 CreateOneOfOpCode (
1258 (EFI_QUESTION_ID) (Key + Index),
1259 VARSTORE_ID_BOOT_MAINT,
1260 (UINT16) (Key + Index - CONFIG_OPTION_OFFSET),
1261 StrRef,
1262 StrRefHelp,
1263 EFI_IFR_FLAG_CALLBACK,
1264 EFI_IFR_NUMERIC_SIZE_1,
1265 IfrOptionList,
1266 OptionMenu->MenuNumber + 1,
1267 &gUpdateData
1268 );
1269
1270 VarDevOrder = *(UINT16 *) ((UINT8 *) DevOrder + sizeof (BBS_TYPE) + sizeof (UINT16) + Index * sizeof (UINT16));
1271
1272 if (0xFF00 == (VarDevOrder & 0xFF00)) {
1273 LegacyOrder[Index] = 0xFF;
1274 Pos = (VarDevOrder & 0xFF) / 8;
1275 Bit = 7 - ((VarDevOrder & 0xFF) % 8);
1276 DisMap[Pos] = (UINT8) (DisMap[Pos] | (UINT8) (1 << Bit));
1277 } else {
1278 LegacyOrder[Index] = (UINT8) (VarDevOrder & 0xFF);
1279 }
1280 }
1281 }
1282
1283 CopyMem (OldData, LegacyOrder, 100);
1284
1285 if (IfrOptionList != NULL) {
1286 FreePool (IfrOptionList);
1287 IfrOptionList = NULL;
1288 }
1289
1290 UpdatePageEnd (CallbackData);
1291 }
1292
1293 /**
1294 Dispatch the display to the next page based on NewPageId.
1295
1296 @param Private The BMM context data.
1297 @param NewPageId The original page ID.
1298
1299 **/
1300 VOID
1301 UpdatePageId (
1302 BMM_CALLBACK_DATA *Private,
1303 UINT16 NewPageId
1304 )
1305 {
1306 if ((NewPageId < FILE_OPTION_OFFSET) && (NewPageId >= HANDLE_OPTION_OFFSET)) {
1307 //
1308 // If we select a handle to add driver option, advance to the add handle description page.
1309 //
1310 NewPageId = FORM_DRV_ADD_HANDLE_DESC_ID;
1311 } else if ((NewPageId == KEY_VALUE_SAVE_AND_EXIT) || (NewPageId == KEY_VALUE_NO_SAVE_AND_EXIT)) {
1312 //
1313 // Return to main page after "Save Changes" or "Discard Changes".
1314 //
1315 NewPageId = FORM_MAIN_ID;
1316 } else if ((NewPageId >= TERMINAL_OPTION_OFFSET) && (NewPageId < CONSOLE_OPTION_OFFSET)) {
1317 NewPageId = FORM_CON_COM_SETUP_ID;
1318 }
1319
1320 if ((NewPageId > 0) && (NewPageId < MAXIMUM_FORM_ID)) {
1321 Private->BmmPreviousPageId = Private->BmmCurrentPageId;
1322 Private->BmmCurrentPageId = NewPageId;
1323 }
1324 }