driversample.c

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

C
648
字号
    //
    Private->Hii->UpdateForm (
                    Private->Hii,
                    Private->RegisteredHandle,
                    (EFI_FORM_LABEL) 0x1234,  // Label 0x1234
                    FALSE,                    // Remove Op-codes (will never remove form/endform)
                    UpdateData                // Significant value is UpdateData->DataCount
                    );

    UpdateData->FormSetUpdate       = FALSE;
    UpdateData->FormCallbackHandle  = 0;
    UpdateData->FormUpdate          = FALSE;
    UpdateData->FormTitle           = 0;
    UpdateData->DataCount           = 1;

    CreateGotoOpCode (
      1,
      STR_GOTO_FORM1,                         // Token value for the Prompt
      0,                                      // Goto Help
      0,                                      // Flags
      0,                                      // Key
      &UpdateData->Data                       // Buffer location to place op-codes
      );

    Private->Hii->UpdateForm (
                    Private->Hii,
                    Private->RegisteredHandle,
                    (EFI_FORM_LABEL) 0x1234,
                    TRUE,
                    UpdateData
                    );

    gBS->FreePool (UpdateData);
    break;

  case 0x1236:
    //
    // If I hit the checkbox, I enter this case statement...
    //
    //
    // Since I am returning an error (for test purposes) I need to pass in the string for the error
    // I will allocate space for the return value.  If an error occurs (which is the case) I can simply return
    // an error and fill in the string parameter, otherwise, I will return information in the DataArray structure.
    // The browser will free this packet structure
    //
    Status = gBS->AllocatePool (
                    EfiBootServicesData,
                    sizeof (EFI_HII_CALLBACK_PACKET) + sizeof (SAMPLE_STRING) + 2,
                    Packet
                    );
    ASSERT_EFI_ERROR (Status);

                    
    EfiZeroMem (*Packet, sizeof (EFI_HII_CALLBACK_PACKET) + sizeof (SAMPLE_STRING) + 2);

    //
    // Assign the buffer address to DataPacket
    //
    DataPacket = *Packet;

    EfiStrCpy (DataPacket->String, SAMPLE_STRING);
    return EFI_DEVICE_ERROR;

  case 0x1237:

    Status = gBS->AllocatePool (
                    EfiBootServicesData,
                    sizeof (EFI_HII_CALLBACK_PACKET) + 2,
                    Packet
                    );
    ASSERT_EFI_ERROR (Status);

    EfiZeroMem (*Packet, sizeof (EFI_HII_CALLBACK_PACKET) + 2);

    //
    // Assign the buffer address to DataPacket
    //
    DataPacket                        = *Packet;

    DataPacket->DataArray.EntryCount  = 1;
    DataPacket->DataArray.NvRamMap    = NULL;
    DataPacket->DataArray.Data->Flags = EXIT_REQUIRED;
    break;

  case 0x1555:
    Value = 0x0001;
    SPrint (VariableName, 0x80, L"%d", VAR_EQ_TEST_NAME);

    Status = gRT->SetVariable (
                    VariableName,
                    &FormSetGuid,
                    EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
                    2,
                    (VOID *) &Value
                    );
    break;

  case 0x1556:
    Value = 0x1000;
    SPrint (VariableName, 0x80, L"%d", VAR_EQ_TEST_NAME);

    Status = gRT->SetVariable (
                    VariableName,
                    &FormSetGuid,
                    EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
                    2,
                    (VOID *) &Value
                    );
    break;

  case 0x1557:
    Value = 0x0000;
    SPrint (VariableName, 0x80, L"%d", VAR_EQ_TEST_NAME);

    Status = gRT->SetVariable (
                    VariableName,
                    &FormSetGuid,
                    EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
                    2,
                    (VOID *) &Value
                    );
    break;

  default:
    break;
  }

  return EFI_SUCCESS;
}

EFI_STATUS
EFIAPI
DriverSampleInit (
  IN EFI_HANDLE                   ImageHandle,
  IN EFI_SYSTEM_TABLE             *SystemTable
  )
{
  EFI_STATUS          Status;
  EFI_HII_PROTOCOL    *Hii;
  //
  //  EFI_FORM_BROWSER_PROTOCOL       *FormConfig;
  //
  EFI_HII_PACKAGES    *PackageList;
  EFI_HII_HANDLE      HiiHandle;
  STRING_REF          TokenToUpdate;
  STRING_REF          TokenToUpdate2;
  STRING_REF          TokenToUpdate3;
  CHAR16              *NewString;
  EFI_HII_UPDATE_DATA *UpdateData;
  EFI_CALLBACK_INFO   *CallbackInfo;
  EFI_HANDLE          Handle;
  SCREEN_DESCRIPTOR   Screen;
  EFI_GUID            StringPackGuid = STRING_PACK_GUID; 

  //
  // Initialize the library and our protocol.
  //
  EfiInitializeDriverLib (ImageHandle, SystemTable);

  EfiZeroMem (&Screen, sizeof (SCREEN_DESCRIPTOR));

  gST->ConOut->QueryMode (gST->ConOut, gST->ConOut->Mode->Mode, &Screen.RightColumn, &Screen.BottomRow);

  //
  // Remove 3 characters from top and bottom
  //
  Screen.TopRow     = 3;
  Screen.BottomRow  = Screen.BottomRow - 3;

  //
  // There should only be one HII protocol
  //
  Status = gBS->LocateProtocol (
                  &gEfiHiiProtocolGuid,
                  NULL,
                  &Hii
                  );
  if (EFI_ERROR (Status)) {
    return Status;;
  }

  /*
  //
  // There should only be one Form Configuration protocol
  //
  Status = gBS->LocateProtocol (
                 &gEfiFormBrowserProtocolGuid, 
                 NULL, 
                 &FormConfig
                 );
  if (EFI_ERROR (Status)) {
    return Status;;
  }
*/
  Status = gBS->AllocatePool (
                  EfiBootServicesData,
                  sizeof (EFI_CALLBACK_INFO),
                  &CallbackInfo
                  );
  if (EFI_ERROR (Status)) {
    return Status;
  }

  CallbackInfo->Signature = EFI_CALLBACK_INFO_SIGNATURE;
  CallbackInfo->Hii       = Hii;

  //
  // This example does not implement worker functions for the NV accessor functions.  Only a callback evaluator
  //
  CallbackInfo->DriverCallback.NvRead   = NULL;
  CallbackInfo->DriverCallback.NvWrite  = NULL;
  CallbackInfo->DriverCallback.Callback = DriverCallback;

  //
  // Install protocol interface
  //
  Handle = NULL;
  Status = gBS->InstallProtocolInterface (
                  &Handle,
                  &gEfiFormCallbackProtocolGuid,
                  EFI_NATIVE_INTERFACE,
                  &CallbackInfo->DriverCallback
                  );

  ASSERT_EFI_ERROR (Status);

  CallbackInfo->CallbackHandle  = Handle;

  PackageList                   = PreparePackages (1, &StringPackGuid, DriverSampleStrings);
  Status                        = Hii->NewPack (Hii, PackageList, &HiiHandle);
  gBS->FreePool (PackageList);

  PackageList = PreparePackages (1, &StringPackGuid, InventoryBin);
  Status      = Hii->NewPack (Hii, PackageList, &HiiHandle);
  gBS->FreePool (PackageList);

  PackageList = PreparePackages (1, &StringPackGuid, VfrBin);
  Status      = Hii->NewPack (Hii, PackageList, &HiiHandle);
  gBS->FreePool (PackageList);

  CallbackInfo->RegisteredHandle = HiiHandle;

  //
  // Very simple example of how one would update a string that is already
  // in the HII database
  //
  TokenToUpdate = (STRING_REF) STR_CPU_STRING2;
  NewString     = L"700 Mhz";

  Hii->NewString (Hii, NULL, HiiHandle, &TokenToUpdate, NewString);

  //
  // Add a string - if 0 will be updated with new Token number
  //
  TokenToUpdate = (STRING_REF) 0;

  //
  // Add a string - if 0 will be updated with new Token number
  //
  TokenToUpdate2 = (STRING_REF) 0;

  //
  // Add a string - if 0 will be updated with new Token number
  //
  TokenToUpdate3 = (STRING_REF) 0;

  Hii->NewString (Hii, NULL, HiiHandle, &TokenToUpdate, L"Desired Speed");
  Hii->NewString (Hii, NULL, HiiHandle, &TokenToUpdate2, L"5 Thz");
  Hii->NewString (Hii, NULL, HiiHandle, &TokenToUpdate3, L"This is next year's desired speed - right?");

  //
  // Allocate space for creation of Buffer
  //
  Status = gBS->AllocatePool (
                  EfiBootServicesData,
                  0x1000,
                  &UpdateData
                  );
  ASSERT_EFI_ERROR (Status);

  EfiZeroMem (UpdateData, 0x1000);

  //
  // Flag update pending in FormSet
  //
  UpdateData->FormSetUpdate = TRUE;
  //
  // Register CallbackHandle data for FormSet
  //
  UpdateData->FormCallbackHandle = (EFI_PHYSICAL_ADDRESS) (UINTN) CallbackInfo->CallbackHandle;
  UpdateData->FormUpdate  = FALSE;
  UpdateData->FormTitle   = 0;
  UpdateData->DataCount   = 1;

  CreateTextOpCode (TokenToUpdate, TokenToUpdate2, TokenToUpdate3, 0, 0, &UpdateData->Data);

  Hii->UpdateForm (Hii, HiiHandle, (EFI_FORM_LABEL) 100, TRUE, UpdateData);

  gBS->FreePool (UpdateData);

  //
  // Example of how to display only the item we sent to HII
  //
  if (DISPLAY_ONLY_MY_ITEM == 0x0001) {
    //
    // Have the browser pull out our copy of the data, and only display our data
    //
    //    Status = FormConfig->SendForm (FormConfig, TRUE, HiiHandle, NULL, NULL, NULL, &Screen, NULL);
    //
  } else {
    //
    // Have the browser pull out all the data in the HII Database and display it.
    //
    //    Status = FormConfig->SendForm (FormConfig, TRUE, 0, NULL, NULL, NULL, NULL, NULL);
    //
  }

  if (EFI_ERROR (Status)) {
    return Status;
  }

  return EFI_SUCCESS;
}

⌨️ 快捷键说明

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