diff options
Diffstat (limited to 'gnu-efi-3.0/apps/drv0_use.c')
-rw-r--r-- | gnu-efi-3.0/apps/drv0_use.c | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/gnu-efi-3.0/apps/drv0_use.c b/gnu-efi-3.0/apps/drv0_use.c new file mode 100644 index 0000000..f7c5869 --- /dev/null +++ b/gnu-efi-3.0/apps/drv0_use.c @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2013 David Decotigny <decot@googlers.com> + * + * See drv0.c for an example session. + */ + +#include <efi.h> +#include <efilib.h> +#include "drv0.h" + + +static EFI_GUID GnuEfiAppsDrv0ProtocolGuid + = GNU_EFI_APPS_DRV0_PROTOCOL_GUID; + + +static +EFI_STATUS +PlayWithGnuEfiAppsDrv0Protocol(IN EFI_HANDLE DrvHandle) { + EFI_STATUS Status; + GNU_EFI_APPS_DRV0_PROTOCOL *drv = NULL; + UINTN NumberOfHello = 0; + + Status = uefi_call_wrapper(BS->OpenProtocol, 6, + DrvHandle, + &GnuEfiAppsDrv0ProtocolGuid, + &drv, + DrvHandle, + NULL, + EFI_OPEN_PROTOCOL_GET_PROTOCOL); + if (EFI_ERROR(Status)) { + Print(L"Cannot open proto: %d\n", Status); + return Status; + } + + Status = uefi_call_wrapper(drv->SayHello, 2, drv, L"Sample UEFI Driver"); + if (EFI_ERROR(Status)) { + Print(L"Cannot call SayHello: %d\n", Status); + } + + Status = uefi_call_wrapper(drv->GetNumberOfHello, 2, drv, &NumberOfHello); + if (EFI_ERROR(Status)) { + Print(L"Cannot call GetNumberOfHello: %d\n", Status); + } else { + Print(L"Hello was called %d time(s).\n", NumberOfHello); + } + + return EFI_SUCCESS; +} + + +EFI_STATUS +efi_main (EFI_HANDLE Image, EFI_SYSTEM_TABLE *SysTab) +{ + EFI_STATUS Status; + EFI_HANDLE *Handles = NULL; + UINTN i, NoHandles = 0; + + InitializeLib(Image, SysTab); + + Status = LibLocateHandle(ByProtocol, &GnuEfiAppsDrv0ProtocolGuid, + NULL, &NoHandles, &Handles); + if (EFI_ERROR(Status)) { + Print(L"Error looking up handles for proto: %d\n", Status); + return Status; + } + + for (i = 0 ; i < NoHandles ; ++i) + { + Print(L"Playing with driver instance %d...\n", i); + Status = PlayWithGnuEfiAppsDrv0Protocol(Handles[i]); + if (EFI_ERROR(Status)) + Print(L"Error playing with instance %d, skipping\n", i); + } + + if (Handles) + FreePool(Handles); + + return EFI_SUCCESS; +} |