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;
/** 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); }