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
,
46 // generate_path() from shim by Matthew J. Garrett
49 generate_path(CHAR16
* name
, EFI_LOADED_IMAGE
*li
, EFI_DEVICE_PATH
**path
, CHAR16
**PathName
)
52 EFI_STATUS efi_status
= EFI_SUCCESS
;
53 CHAR16
*devpathstr
= DevicePathToStr(li
->FilePath
),
57 for (i
= 0; i
< StrLen(devpathstr
); i
++) {
58 if (devpathstr
[i
] == '/')
60 if (devpathstr
[i
] == '\\')
61 found
= &devpathstr
[i
];
66 while (*(found
- 1) == '\\')
69 pathlen
= StrLen(devpathstr
);
75 *PathName
= AllocatePool((pathlen
+ 1 + StrLen(name
))*sizeof(CHAR16
));
78 Print(L
"Failed to allocate path buffer\n");
79 efi_status
= EFI_OUT_OF_RESOURCES
;
83 StrCpy(*PathName
, devpathstr
);
86 StrCat(*PathName
, L
"\\");
87 StrCat(*PathName
, name
);
89 *path
= FileDevicePath(li
->DeviceHandle
, *PathName
);
98 simple_file_open(EFI_HANDLE image
, CHAR16
*name
, EFI_FILE
**file
, UINT64 mode
)
100 EFI_STATUS efi_status
;
102 EFI_LOADED_IMAGE
*li
;
103 EFI_DEVICE_PATH
*loadpath
= NULL
;
104 CHAR16
*PathName
= NULL
;
106 efi_status
= uefi_call_wrapper(BS
->HandleProtocol
, 3, image
,
107 &IMAGE_PROTOCOL
, (VOID
**) &li
);
109 if (efi_status
!= EFI_SUCCESS
)
110 return simple_file_open_by_handle(image
, name
, file
, mode
);
112 efi_status
= generate_path(name
, li
, &loadpath
, &PathName
);
114 if (efi_status
!= EFI_SUCCESS
) {
115 Print(L
"Unable to generate load path for %s\n", name
);
119 device
= li
->DeviceHandle
;
121 efi_status
= simple_file_open_by_handle(device
, PathName
, file
, mode
);
130 simple_file_read_all(EFI_FILE
*file
, UINTN
*size
, void **buffer
)
132 EFI_STATUS efi_status
;
140 efi_status
= uefi_call_wrapper(file
->GetInfo
, 4, file
, &FILE_INFO
,
142 if (efi_status
!= EFI_SUCCESS
) {
143 Print(L
"Failed to get file info\n");
147 *size
= fi
->FileSize
;
149 *buffer
= AllocatePool(*size
);
151 Print(L
"Failed to allocate buffer of size %d\n", *size
);
152 return EFI_OUT_OF_RESOURCES
;
154 efi_status
= uefi_call_wrapper(file
->Read
, 3, file
, size
, *buffer
);
160 simple_file_close(EFI_FILE
*file
)
162 uefi_call_wrapper(file
->Close
, 1, file
);