updatepage.c

来自「EFI BIOS是Intel提出的下一代的BIOS标准。这里上传的Edk源代码是」· C语言 代码 · 共 1,279 行 · 第 1/3 页

C
1,279
字号
  IN BMM_CALLBACK_DATA                *CallbackData
  )
{
  BM_MENU_ENTRY       *NewMenuEntry;
  BM_CONSOLE_CONTEXT  *NewConsoleContext;
  BM_TERMINAL_CONTEXT *NewTerminalContext;
  UINT16              Index;
  UINT16              Index2;
  UINT8               *Location;
  UINT8               CheckFlags;
  EFI_STATUS          Status;
  VOID        	      *Interface;

  Location                      = (UINT8 *) &UpdateData->Data;
  CallbackData->BmmAskSaveOrNot = TRUE;

  UpdatePageStart (CallbackData, &Location);

  for (Index = 0; Index < ConsoleMenu->MenuNumber; Index++) {
    NewMenuEntry      = BOpt_GetMenuEntry (ConsoleMenu, Index);
    NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;
    CheckFlags        = EFI_IFR_FLAG_INTERACTIVE;
    if (NewConsoleContext->IsActive) {
      CheckFlags |= EFI_IFR_FLAG_DEFAULT;
      CallbackData->BmmFakeNvData->ConsoleCheck[Index] = TRUE;
    } else {
      CallbackData->BmmFakeNvData->ConsoleCheck[Index] = FALSE;
    }

    CreateCheckBoxOpCode (
      (UINT16) (CON_DEVICE_QUESTION_ID + Index),
      (UINT8) 1,
      NewMenuEntry->DisplayStringToken,
      NewMenuEntry->HelpStringToken,
      CheckFlags,
      (UINT16) (CONSOLE_OPTION_OFFSET + Index),
      Location
      );
    Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;
    UpdateData->DataCount++;
  }

  Status = EfiLibLocateProtocol (&gTerminalDriverGuid, &Interface);
  if (!EFI_ERROR (Status)) {
    for (Index2 = 0; Index2 < TerminalMenu.MenuNumber; Index2++) {
      CheckFlags          = EFI_IFR_FLAG_INTERACTIVE;
      NewMenuEntry        = BOpt_GetMenuEntry (&TerminalMenu, Index2);
      NewTerminalContext  = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;

      if ((NewTerminalContext->IsConIn && (UpdatePageId == FORM_CON_IN_ID)) ||
          (NewTerminalContext->IsConOut && (UpdatePageId == FORM_CON_OUT_ID)) ||
          (NewTerminalContext->IsStdErr && (UpdatePageId == FORM_CON_ERR_ID))
          ) {
        CheckFlags |= EFI_IFR_FLAG_DEFAULT;
        CallbackData->BmmFakeNvData->ConsoleCheck[Index] = TRUE;
      } else {
        CallbackData->BmmFakeNvData->ConsoleCheck[Index] = FALSE;
      }

      CreateCheckBoxOpCode (
        (UINT16) (CON_DEVICE_QUESTION_ID + Index),
        (UINT8) 1,
        NewMenuEntry->DisplayStringToken,
        NewMenuEntry->HelpStringToken,
        CheckFlags,
        (UINT16) (CONSOLE_OPTION_OFFSET + Index),
        Location
        );
      Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;
      UpdateData->DataCount++;
      Index++;
    }
  }

  UpdatePageEnd (CallbackData, Location);
}

VOID
UpdateOrderPage (
  IN UINT16                           UpdatePageId,
  IN BM_MENU_OPTION                   *OptionMenu,
  IN BMM_CALLBACK_DATA                *CallbackData
  )
{
  BM_MENU_ENTRY *NewMenuEntry;
  UINT16        Index;
  UINT8         *Location;
  IFR_OPTION    *IfrOptionList;

  Location                      = (UINT8 *) &UpdateData->Data;
  CallbackData->BmmAskSaveOrNot = TRUE;

  UpdatePageStart (CallbackData, &Location);

  CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, OptionMenu);

  EfiZeroMem (CallbackData->BmmFakeNvData->OptionOrder, 100);

  IfrOptionList = EfiAllocateZeroPool (sizeof (IFR_OPTION) * OptionMenu->MenuNumber);
  if (NULL == IfrOptionList) {
    return ;
  }

  for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {
    NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index);
    IfrOptionList[Index].StringToken = NewMenuEntry->DisplayStringToken;
    IfrOptionList[Index].Value = (UINT16) (NewMenuEntry->OptionNumber + 1);
    IfrOptionList[Index].OptionString = NULL;
    CallbackData->BmmFakeNvData->OptionOrder[Index] = (UINT8) (IfrOptionList[Index].Value);
  }

  if (OptionMenu->MenuNumber > 0) {
    CreateOrderedListOpCode (
      (UINT16) OPTION_ORDER_QUESTION_ID,
      (UINT8) 100,
      STRING_TOKEN (STR_CHANGE_ORDER),
      STRING_TOKEN (STR_CHANGE_ORDER),
      IfrOptionList,
      OptionMenu->MenuNumber,
      Location
      );

    for (Index = 0; Index < OptionMenu->MenuNumber + 2; Index++) {
      Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;
    }

    UpdateData->DataCount = (UINT16) (UpdateData->DataCount + OptionMenu->MenuNumber + 2);
  }

  SafeFreePool (IfrOptionList);

  UpdatePageEnd (CallbackData, Location);

  EfiCopyMem (
    CallbackData->BmmOldFakeNVData.OptionOrder,
    CallbackData->BmmFakeNvData->OptionOrder,
    100
    );
}

VOID
UpdateBootNextPage (
  IN BMM_CALLBACK_DATA                *CallbackData
  )
{
  UINT8           *Location;
  BM_MENU_ENTRY   *NewMenuEntry;
  BM_LOAD_CONTEXT *NewLoadContext;
  IFR_OPTION      *IfrOptionList;
  UINTN           NumberOfOptions;
  UINT16          Index;

  Location                      = (UINT8 *) &UpdateData->Data;
  IfrOptionList                 = NULL;
  NumberOfOptions               = BootOptionMenu.MenuNumber;
  CallbackData->BmmAskSaveOrNot = TRUE;

  UpdatePageStart (CallbackData, &Location);
  CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &BootOptionMenu);

  if (NumberOfOptions > 0) {
    UpdateData->DataCount = (UINT8) (UpdateData->DataCount + NumberOfOptions);
    IfrOptionList = EfiAllocateZeroPool ((NumberOfOptions + 1) * sizeof (IFR_OPTION));

    ASSERT (IfrOptionList);

    CallbackData->BmmFakeNvData->BootNext = (UINT16) (BootOptionMenu.MenuNumber);

    for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {
      NewMenuEntry    = BOpt_GetMenuEntry (&BootOptionMenu, Index);
      NewLoadContext  = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;
      if (NewLoadContext->IsBootNext) {
        IfrOptionList[Index].Flags            = EFI_IFR_FLAG_DEFAULT | EFI_IFR_FLAG_INTERACTIVE;
        CallbackData->BmmFakeNvData->BootNext = Index;
      } else {
        IfrOptionList[Index].Flags = EFI_IFR_FLAG_INTERACTIVE;
      }

      IfrOptionList[Index].Key          = (UINT16) KEY_VALUE_MAIN_BOOT_NEXT;
      IfrOptionList[Index].Value        = Index;
      IfrOptionList[Index].StringToken  = NewMenuEntry->DisplayStringToken;
      IfrOptionList[Index].OptionString = NULL;
    }

    IfrOptionList[Index].Key          = (UINT16) KEY_VALUE_MAIN_BOOT_NEXT;
    IfrOptionList[Index].Value        = Index;
    IfrOptionList[Index].StringToken  = STRING_TOKEN (STR_NONE);
    IfrOptionList[Index].Flags        = EFI_IFR_FLAG_INTERACTIVE;
    if (CallbackData->BmmFakeNvData->BootNext == Index) {
      IfrOptionList[Index].Flags |= EFI_IFR_FLAG_DEFAULT;
    }

    IfrOptionList[Index].OptionString = NULL;

    CreateOneOfOpCode (
      (UINT16) BOOT_NEXT_QUESTION_ID,
      (UINT8) 2,
      STRING_TOKEN (STR_BOOT_NEXT),
      STRING_TOKEN (STR_BOOT_NEXT_HELP),
      IfrOptionList,
      (UINTN) (NumberOfOptions + 1),
      Location
      );
    Location  = Location + (NumberOfOptions + 2) * ((EFI_IFR_OP_HEADER *) Location)->Length;
    Location  = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;

    UpdateData->DataCount += 3;
    SafeFreePool (IfrOptionList);
    IfrOptionList = NULL;
  }

  UpdatePageEnd (CallbackData, Location);
}

VOID
UpdateTimeOutPage (
  IN BMM_CALLBACK_DATA                *CallbackData
  )
{
  UINT8   *Location;
  UINT16  BootTimeOut;

  Location                      = (UINT8 *) &UpdateData->Data;
  CallbackData->BmmAskSaveOrNot = TRUE;

  UpdatePageStart (CallbackData, &Location);

  BootTimeOut = BdsLibGetTimeout ();

  CreateNumericOpCode (
    (UINT16) BOOT_TIME_OUT_QUESTION_ID,
    (UINT8) 2,
    STRING_TOKEN (STR_NUM_AUTO_BOOT),
    STRING_TOKEN (STR_HLP_AUTO_BOOT),
    0,
    65535,
    0,
    10,
    0,
    0,
    Location
    );

  CallbackData->BmmFakeNvData->BootTimeOut = (UINT16) BootTimeOut;
  UpdateData->DataCount++;
  Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;

  UpdatePageEnd (CallbackData, Location);
}

VOID
UpdateTerminalPage (
  IN BMM_CALLBACK_DATA                *CallbackData
  )
{
  UINT16              Index;
  UINT8               *Location;
  UINT8               CheckFlags;
  IFR_OPTION          *IfrOptionList;
  BM_MENU_ENTRY       *NewMenuEntry;
  BM_TERMINAL_CONTEXT *NewTerminalContext;

  EfiZeroMem (UpdateData, UPDATE_DATA_SIZE);
  Location = (UINT8 *) &UpdateData->Data;
  UpdatePageStart (CallbackData, &Location);

  NewMenuEntry = BOpt_GetMenuEntry (
                  &TerminalMenu,
                  CallbackData->CurrentTerminal
                  );

  if (!NewMenuEntry) {
    return ;
  }

  NewTerminalContext  = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;

  IfrOptionList       = EfiAllocateZeroPool (sizeof (IFR_OPTION) * 19);
  if (!IfrOptionList) {
    return ;
  }

  for (Index = 0; Index < 19; Index++) {
    CheckFlags = EFI_IFR_FLAG_INTERACTIVE;
    if (NewTerminalContext->BaudRate == (UINT64) (BaudRateList[Index].Value)) {
      CheckFlags |= EFI_IFR_FLAG_DEFAULT;
      NewTerminalContext->BaudRateIndex         = (UINT8) Index;
      CallbackData->BmmFakeNvData->COMBaudRate  = NewTerminalContext->BaudRateIndex;
    }

    IfrOptionList[Index].Flags        = CheckFlags;
    IfrOptionList[Index].Key          = KEY_VALUE_COM_SET_BAUD_RATE;
    IfrOptionList[Index].StringToken  = BaudRateList[Index].StringToken;
    IfrOptionList[Index].Value        = Index;
  }

  CreateOneOfOpCode (
    (UINT16) COM_BAUD_RATE_QUESTION_ID,
    (UINT8) 1,
    STRING_TOKEN (STR_COM_BAUD_RATE),
    STRING_TOKEN (STR_COM_BAUD_RATE),
    IfrOptionList,
    19,
    Location
    );

  Location              = Location + (Index + 1) * ((EFI_IFR_OP_HEADER *) Location)->Length;
  Location              = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;
  UpdateData->DataCount = (UINT8) (UpdateData->DataCount + Index);
  UpdateData->DataCount += 2;

  SafeFreePool (IfrOptionList);

  IfrOptionList = EfiAllocateZeroPool (sizeof (IFR_OPTION) * 4);
  if (!IfrOptionList) {
    return ;
  }

  for (Index = 0; Index < 4; Index++) {
    CheckFlags = EFI_IFR_FLAG_INTERACTIVE;

    if (NewTerminalContext->DataBits == DataBitsList[Index].Value) {
      NewTerminalContext->DataBitsIndex         = (UINT8) Index;
      CallbackData->BmmFakeNvData->COMDataRate  = NewTerminalContext->DataBitsIndex;
      CheckFlags |= EFI_IFR_FLAG_DEFAULT;
    }

    IfrOptionList[Index].Flags        = CheckFlags;
    IfrOptionList[Index].Key          = KEY_VALUE_COM_SET_DATA_BITS;
    IfrOptionList[Index].StringToken  = DataBitsList[Index].StringToken;
    IfrOptionList[Index].Value        = Index;
  }

  CreateOneOfOpCode (
    (UINT16) COM_DATA_RATE_QUESTION_ID,
    (UINT8) 1,
    STRING_TOKEN (STR_COM_DATA_BITS),
    STRING_TOKEN (STR_COM_DATA_BITS),
    IfrOptionList,
    4,
    Location
    );

  Location              = Location + (Index + 1) * ((EFI_IFR_OP_HEADER *) Location)->Length;
  Location              = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;
  UpdateData->DataCount = (UINT8) (UpdateData->DataCount + Index);
  UpdateData->DataCount += 2;

  SafeFreePool (IfrOptionList);

  IfrOptionList = EfiAllocateZeroPool (sizeof (IFR_OPTION) * 5);
  if (!IfrOptionList) {
    return ;
  }

  for (Index = 0; Index < 5; Index++) {
    CheckFlags = EFI_IFR_FLAG_INTERACTIVE;
    if (NewTerminalContext->Parity == ParityList[Index].Value) {
      CheckFlags |= EFI_IFR_FLAG_DEFAULT;
      NewTerminalContext->ParityIndex         = (UINT8) Index;
      CallbackData->BmmFakeNvData->COMParity  = NewTerminalContext->ParityIndex;
    }

    IfrOptionList[Index].Flags        = CheckFlags;
    IfrOptionList[Index].Key          = KEY_VALUE_COM_SET_PARITY;
    IfrOptionList[Index].StringToken  = ParityList[Index].StringToken;
    IfrOptionList[Index].Value        = Index;
  }

  CreateOneOfOpCode (
    (UINT16) COM_PARITY_QUESTION_ID,
    (UINT8) 1,
    STRING_TOKEN (STR_COM_PARITY),
    STRING_TOKEN (STR_COM_PARITY),
    IfrOptionList,
    5,
    Location
    );

  Location              = Location + (Index + 1) * ((EFI_IFR_OP_HEADER *) Location)->Length;
  Location              = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;
  UpdateData->DataCount = (UINT8) (UpdateData->DataCount + Index);
  UpdateData->DataCount += 2;

  SafeFreePool (IfrOptionList);

  IfrOptionList = EfiAllocateZeroPool (sizeof (IFR_OPTION) * 3);
  if (!IfrOptionList) {
    return ;
  }

  for (Index = 0; Index < 3; Index++) {
    CheckFlags = EFI_IFR_FLAG_INTERACTIVE;
    if (NewTerminalContext->StopBits == StopBitsList[Index].Value) {
      CheckFlags |= EFI_IFR_FLAG_DEFAULT;
      NewTerminalContext->StopBitsIndex         = (UINT8) Index;
      CallbackData->BmmFakeNvData->COMStopBits  = NewTerminalContext->StopBitsIndex;
    }

    IfrOptionList[Index].Flags        = CheckFlags;
    IfrOptionList[Index].Key          = KEY_VALUE_COM_SET_STOP_BITS;
    IfrOptionList[Index].StringToken  = StopBitsList[Index].StringToken;
    IfrOptionList[Index].Value        = Index;
  }

  CreateOneOfOpCode (
    (UINT16) COM_STOP_BITS_QUESTION_ID,
    (UINT8) 1,
    STRING_TOKEN (STR_COM_STOP_BITS),
    STRING_TOKEN (STR_COM_STOP_BITS),
    IfrOptionList,
    3,
    Location
    );

  Location              = Location + (Index + 1) * ((EFI_IFR_OP_HEADER *) Location)->Length;
  Location              = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;
  UpdateData->DataCount = (UINT8) (UpdateData->DataCount + Index);
  UpdateData->DataCount += 2;

  SafeFreePool (IfrOptionList);

  IfrOptionList = EfiAllocateZeroPool (sizeof (IFR_OPTION) * 4);
  if (!IfrOptionList) {
    return ;
  }

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?