2 * Copyright 2012 <James.Bottomley@HansenPartnership.com>
8 #include "../include/refit_call_wrapper.h"
11 #include "simple_file.h"
12 //#include "efiauthenticated.h"
13 #include "execute.h" /* for generate_path() */
15 static EFI_GUID IMAGE_PROTOCOL
= LOADED_IMAGE_PROTOCOL
;
16 static EFI_GUID SIMPLE_FS_PROTOCOL
= SIMPLE_FILE_SYSTEM_PROTOCOL
;
17 static EFI_GUID FILE_INFO
= EFI_FILE_INFO_ID
;
20 simple_file_open_by_handle(EFI_HANDLE device
, CHAR16
*name
, EFI_FILE
**file
, UINT64 mode
)
22 EFI_STATUS efi_status
;
23 EFI_FILE_IO_INTERFACE
*drive
;
26 efi_status
= uefi_call_wrapper(BS
->HandleProtocol
, 3, device
,
27 &SIMPLE_FS_PROTOCOL
, (VOID
**) &drive
);
29 if (efi_status
!= EFI_SUCCESS
) {
30 Print(L
"Unable to find simple file protocol\n");
34 efi_status
= uefi_call_wrapper(drive
->OpenVolume
, 2, drive
, &root
);
36 if (efi_status
!= EFI_SUCCESS
) {
37 Print(L
"Failed to open drive volume\n");
41 efi_status
= uefi_call_wrapper(root
->Open
, 5, root
, file
, name
,
49 simple_file_open(EFI_HANDLE image
, CHAR16
*name
, EFI_FILE
**file
, UINT64 mode
)
51 EFI_STATUS efi_status
;
54 EFI_DEVICE_PATH
*loadpath
= NULL
;
55 CHAR16
*PathName
= NULL
;
57 efi_status
= uefi_call_wrapper(BS
->HandleProtocol
, 3, image
,
58 &IMAGE_PROTOCOL
, (VOID
**) &li
);
60 if (efi_status
!= EFI_SUCCESS
)
61 return simple_file_open_by_handle(image
, name
, file
, mode
);
63 efi_status
= generate_path(name
, li
, &loadpath
, &PathName
);
65 if (efi_status
!= EFI_SUCCESS
) {
66 Print(L
"Unable to generate load path for %s\n", name
);
70 device
= li
->DeviceHandle
;
72 efi_status
= simple_file_open_by_handle(device
, PathName
, file
, mode
);
81 simple_file_read_all(EFI_FILE
*file
, UINTN
*size
, void **buffer
)
83 EFI_STATUS efi_status
;
91 efi_status
= uefi_call_wrapper(file
->GetInfo
, 4, file
, &FILE_INFO
,
93 if (efi_status
!= EFI_SUCCESS
) {
94 Print(L
"Failed to get file info\n");
100 *buffer
= AllocatePool(*size
);
102 Print(L
"Failed to allocate buffer of size %d\n", *size
);
103 return EFI_OUT_OF_RESOURCES
;
105 efi_status
= uefi_call_wrapper(file
->Read
, 3, file
, size
, *buffer
);
111 simple_file_close(EFI_FILE
*file
)
113 uefi_call_wrapper(file
->Close
, 1, file
);