Beispiel #1
0
Datei: Dh.c Projekt: pmj/edk2
  DriverName = NULL;

  //
  // See if Handle is a device handle and display its details.
  //
  DriverBindingHandleBuffer = NULL;
  Status = PARSE_HANDLE_DATABASE_UEFI_DRIVERS (
            Handle,
            &DriverBindingHandleCount,
            &DriverBindingHandleBuffer
            );

  ParentControllerHandleBuffer = NULL;
  Status = PARSE_HANDLE_DATABASE_PARENTS (
            Handle,
            &ParentControllerHandleCount,
            &ParentControllerHandleBuffer
            );

  ChildControllerHandleBuffer = NULL;
  Status = ParseHandleDatabaseForChildControllers (
            Handle,
            &ChildControllerHandleCount,
            &ChildControllerHandleBuffer
            );

  DiagnosticsStatus = FALSE;
  ConfigurationStatus = FALSE;

  if (!EFI_ERROR(gBS->OpenProtocol(Handle, &gEfiDriverConfigurationProtocolGuid, NULL, NULL, gImageHandle, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {
    ConfigurationStatus = TRUE;
Beispiel #2
0
/**
  Get lots of info about a device from its handle.

  @param[in] TheHandle       The device handle to get info on.
  @param[in, out] Type       On successful return R, B, or D (root, bus, or 
                             device) will be placed in this buffer.
  @param[in, out] Cfg        On successful return this buffer will be 
                             TRUE if the handle has configuration, FALSE
                             otherwise.
  @param[in, out] Diag       On successful return this buffer will be 
                             TRUE if the handle has disgnostics, FALSE
                             otherwise.
  @param[in, out] Parents    On successful return this buffer will be 
                             contain the number of parent handles.
  @param[in, out] Devices    On successful return this buffer will be 
                             contain the number of devices controlled.
  @param[in, out] Children   On successful return this buffer will be 
                             contain the number of child handles.
  @param[out] Name           The pointer to a buffer that will be allocated
                             and contain the string name of the handle.
                             The caller must free this memory.
  @param[in] Language        The language code as defined by the UEFI spec.

  @retval EFI_SUCCESS           The info is there.
  @retval EFI_INVALID_PARAMETER A parameter was invalid.
**/
EFI_STATUS
GetDeviceHandleInfo (
  IN EFI_HANDLE   TheHandle,
  IN OUT CHAR16   *Type,
  IN OUT BOOLEAN  *Cfg,
  IN OUT BOOLEAN  *Diag,
  IN OUT UINTN    *Parents,
  IN OUT UINTN    *Devices,
  IN OUT UINTN    *Children,
  OUT CHAR16      **Name,
  IN CONST CHAR8  *Language
  )
{
  EFI_STATUS    Status;
  EFI_HANDLE    *HandleBuffer;
  UINTN         Count;

  if (TheHandle == NULL 
    || Type == NULL
    || Cfg == NULL
    || Diag == NULL
    || Parents == NULL
    || Devices == NULL
    || Children == NULL
    || Name == NULL ) {
    return (EFI_INVALID_PARAMETER);
  }

  *Cfg          = FALSE;
  *Diag         = FALSE;
  *Children     = 0;
  *Parents      = 0;
  *Devices      = 0;
  *Type         = L' ';
  *Name         = CHAR_NULL;
  HandleBuffer  = NULL;
  Status        = EFI_SUCCESS;

  gEfiShellProtocol->GetDeviceName(TheHandle, EFI_DEVICE_NAME_USE_COMPONENT_NAME|EFI_DEVICE_NAME_USE_DEVICE_PATH, (CHAR8*)Language, Name);

  Status = ParseHandleDatabaseForChildControllers(TheHandle, Children, NULL);
//  if (!EFI_ERROR(Status)) {
    Status = PARSE_HANDLE_DATABASE_PARENTS(TheHandle, Parents, NULL);
    if (/*!EFI_ERROR(Status) && */Parents != NULL && Children != NULL) {
      if (*Parents == 0) {
        *Type = L'R';
      } else if (*Children > 0) {
        *Type = L'B';
      } else {
        *Type = L'D';
      }
    }
//  }
  Status = PARSE_HANDLE_DATABASE_UEFI_DRIVERS(TheHandle, Devices, &HandleBuffer);
  if (!EFI_ERROR(Status) && Devices != NULL && HandleBuffer != NULL) {
    for (Count = 0 ; Count < *Devices ; Count++) {
      if (!EFI_ERROR(gBS->OpenProtocol(HandleBuffer[Count], &gEfiDriverConfigurationProtocolGuid, NULL, NULL, gImageHandle, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {
        *Cfg = TRUE;
      }
      if (!EFI_ERROR(gBS->OpenProtocol(HandleBuffer[Count], &gEfiDriverDiagnosticsProtocolGuid, NULL, NULL, gImageHandle, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {
        *Diag = TRUE;
      }
      if (!EFI_ERROR(gBS->OpenProtocol(HandleBuffer[Count], &gEfiDriverDiagnostics2ProtocolGuid, NULL, NULL, gImageHandle, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {
        *Diag = TRUE;
      }
    }
    SHELL_FREE_NON_NULL(HandleBuffer);
  }

  return (Status);
}