2 * Copyright 2012 <James.Bottomley@HansenPartnership.com>
8 #include "../include/refit_call_wrapper.h"
10 #include "simple_file.h"
11 #include "execute.h" /* for generate_path() */
13 static EFI_GUID IMAGE_PROTOCOL
= LOADED_IMAGE_PROTOCOL
;
14 static EFI_GUID SIMPLE_FS_PROTOCOL
= SIMPLE_FILE_SYSTEM_PROTOCOL
;
15 static EFI_GUID FILE_INFO
= EFI_FILE_INFO_ID
;
18 simple_file_open_by_handle(EFI_HANDLE device
, CHAR16
*name
, EFI_FILE
**file
, UINT64 mode
)
20 EFI_STATUS efi_status
;
21 EFI_FILE_IO_INTERFACE
*drive
;
24 efi_status
= uefi_call_wrapper(BS
->HandleProtocol
, 3, device
,
25 &SIMPLE_FS_PROTOCOL
, (VOID
**) &drive
);
27 if (efi_status
!= EFI_SUCCESS
) {
28 Print(L
"Unable to find simple file protocol\n");
32 efi_status
= uefi_call_wrapper(drive
->OpenVolume
, 2, drive
, &root
);
34 if (efi_status
!= EFI_SUCCESS
) {
35 Print(L
"Failed to open drive volume\n");
39 efi_status
= uefi_call_wrapper(root
->Open
, 5, root
, file
, name
,
47 simple_file_open(EFI_HANDLE image
, CHAR16
*name
, EFI_FILE
**file
, UINT64 mode
)
49 EFI_STATUS efi_status
;
52 EFI_DEVICE_PATH
*loadpath
= NULL
;
53 CHAR16
*PathName
= NULL
;
55 efi_status
= uefi_call_wrapper(BS
->HandleProtocol
, 3, image
,
56 &IMAGE_PROTOCOL
, (VOID
**) &li
);
58 if (efi_status
!= EFI_SUCCESS
)
59 return simple_file_open_by_handle(image
, name
, file
, mode
);
61 efi_status
= generate_path(name
, li
, &loadpath
, &PathName
);
63 if (efi_status
!= EFI_SUCCESS
) {
64 Print(L
"Unable to generate load path for %s\n", name
);
68 device
= li
->DeviceHandle
;
70 efi_status
= simple_file_open_by_handle(device
, PathName
, file
, mode
);
79 simple_file_read_all(EFI_FILE
*file
, UINTN
*size
, void **buffer
)
81 EFI_STATUS efi_status
;
89 efi_status
= uefi_call_wrapper(file
->GetInfo
, 4, file
, &FILE_INFO
,
91 if (efi_status
!= EFI_SUCCESS
) {
92 Print(L
"Failed to get file info\n");
98 *buffer
= AllocatePool(*size
);
100 Print(L
"Failed to allocate buffer of size %d\n", *size
);
101 return EFI_OUT_OF_RESOURCES
;
103 efi_status
= uefi_call_wrapper(file
->Read
, 3, file
, size
, *buffer
);
109 simple_file_close(EFI_FILE
*file
)
111 uefi_call_wrapper(file
->Close
, 1, file
);