VOID EFIAPI SEnvBusSpecificDriverOverride ( IN EFI_HANDLE h, IN VOID *Interface ) /*++ Routine Description: Arguments: h - An EFI handle Interface - The interface Returns: --*/ { EFI_STATUS Status; EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL *BusSpecificDriverOverride; EFI_HANDLE ImageHandle; EFI_LOADED_IMAGE_PROTOCOL *Image; Print (L"\n"); BusSpecificDriverOverride = Interface; do { Status = BusSpecificDriverOverride->GetDriver ( BusSpecificDriverOverride, &ImageHandle ); if (!EFI_ERROR (Status)) { Status = BS->HandleProtocol ( ImageHandle, &gEfiLoadedImageProtocolGuid, (VOID **) &Image ); if (!EFI_ERROR (Status)) { PrintToken ( STRING_TOKEN (STR_SHELLENV_DPROT_DRV_FILE), HiiEnvHandle, SEnvHandleToNumber (ImageHandle), LibDevicePathToStr (Image->FilePath) ); } } } while (!EFI_ERROR (Status)); }
// // TDS 4.1.1 // EFI_STATUS BBTestGetDriverFunctionManualTest ( IN EFI_BB_TEST_PROTOCOL *This, IN VOID *ClientInterface, IN EFI_TEST_LEVEL TestLevel, IN EFI_HANDLE SupportHandle ) { EFI_STANDARD_TEST_LIBRARY_PROTOCOL *StandardLib; EFI_STATUS Status; EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL *BusOverride; EFI_TEST_ASSERTION AssertionType; EFI_HANDLE DriverImageHandle; EFI_HANDLE DriverImageHandleBack; EFI_DEVICE_PATH_PROTOCOL *DevicePath; CHAR16 *DevicePathStr; UINTN DriverCount; EFI_INPUT_KEY Key; // // Get the Standard Library Interface // Status = gtBS->HandleProtocol ( SupportHandle, &gEfiStandardTestLibraryGuid, &StandardLib ); if (EFI_ERROR(Status)) { StandardLib->RecordAssertion ( StandardLib, EFI_TEST_ASSERTION_FAILED, gTestGenericFailureGuid, L"BS.HandleProtocol - Handle standard test library", L"%a:%d:Status - %r", __FILE__, __LINE__, Status ); return Status; } BusOverride = (EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL *)ClientInterface; DriverCount = 0; DriverImageHandle = NULL; DriverImageHandleBack = NULL; // // Circularly call GetDriver() with DriverImageHandle // being the one retrieved by the last call of GetDriver(), // until EFI_NOT_FOUND returned. // do { Status = BusOverride->GetDriver ( BusOverride, &DriverImageHandle ); if (!EFI_ERROR (Status)) { AssertionType = EFI_TEST_ASSERTION_PASSED; StandardLib->RecordAssertion ( StandardLib, AssertionType, gBusSpecificDriverOverrideBBTestFunctionAssertionGuid001, L"EFI_BUS_SPECIFIC_DRIVER_OVERRIDE.GetDriver - Verification of GetDriver interface", L"%a:%d:ImangeHandle:0x%x", __FILE__, __LINE__, DriverImageHandle ); DriverCount++; // // Call the second time // Status = BusOverride->GetDriver ( BusOverride, &DriverImageHandleBack ); if (!EFI_ERROR (Status)) { AssertionType = EFI_TEST_ASSERTION_PASSED; } else { AssertionType = EFI_TEST_ASSERTION_FAILED; } StandardLib->RecordAssertion ( StandardLib, AssertionType, gBusSpecificDriverOverrideBBTestFunctionAssertionGuid002, L"EFI_BUS_SPECIFIC_DRIVER_OVERRIDE.GetDriver - Verification of GetDriver interface, the second times", L"%a:%d:ImangeHandle:0x%x", __FILE__, __LINE__, DriverImageHandleBack ); // // The handle returned two times should be the same // if (DriverImageHandle == DriverImageHandleBack) { AssertionType = EFI_TEST_ASSERTION_PASSED; } else { AssertionType = EFI_TEST_ASSERTION_FAILED; } StandardLib->RecordAssertion ( StandardLib, AssertionType, gBusSpecificDriverOverrideBBTestFunctionAssertionGuid003, L"EFI_BUS_SPECIFIC_DRIVER_OVERRIDE.GetDriver - Call the same image handle twice, the returned handle should be same", L"%a:%d:ImageHandle 1st : 0x%x, ImageHandle 2nd : 0x%x", __FILE__, __LINE__, DriverImageHandle, DriverImageHandleBack ); } } while (!EFI_ERROR (Status)); if (Status == EFI_NOT_FOUND) { AssertionType = EFI_TEST_ASSERTION_PASSED; } else { AssertionType = EFI_TEST_ASSERTION_FAILED; } StandardLib->RecordAssertion ( StandardLib, AssertionType, gBusSpecificDriverOverrideBBTestConformanceAssertionGuid001, L"EFI_BUS_SPECIFIC_DRIVER_OVERRIDE.GetDriver - Verification of GetDriver interface, last times", L"%a:%d:Status = %r, Expected = %r", __FILE__, __LINE__, Status, EFI_NOT_FOUND ); // // Output device path // Status = LocateDevicePathFromBusOverride (BusOverride,&DevicePath,StandardLib); if (EFI_ERROR(Status)) { return EFI_DEVICE_ERROR; } DevicePathStr = DevicePathToStr (DevicePath); if (DevicePathStr != NULL) { Print (L"\r\nCurrent Device: %s", DevicePathStr); gtBS->FreePool (DevicePathStr); DevicePathStr=NULL; Print (L"\r\nTotal %d EFI driver was found!", DriverCount); // // Ask, is it correct? // gtST->ConIn->ReadKeyStroke (gtST->ConIn, &Key); Print (L"Is it correct (Y/N)?"); do { Status = gtST->ConIn->ReadKeyStroke (gtST->ConIn, &Key); } while (EFI_ERROR(Status)); Print (L"%c\n", Key.UnicodeChar); AssertionType = EFI_TEST_ASSERTION_FAILED; if ((Key.UnicodeChar == 'Y') || (Key.UnicodeChar == 'y')) { AssertionType = EFI_TEST_ASSERTION_PASSED; } StandardLib->RecordAssertion ( StandardLib, AssertionType, gBusSpecificDriverOverrideBBTestFunctionAssertionGuid004, L"EFI_BUS_SPECIFIC_DRIVER_OVERRIDE.GetDriver - Verification of GetDriver interface, user's view", L"%a:%d", __FILE__, __LINE__ ); } return EFI_SUCCESS; }