]> code.delx.au - refind/blob - mok/simple_file.c
Minor code cleanup
[refind] / mok / simple_file.c
1 /*
2 * Copyright 2012 <James.Bottomley@HansenPartnership.com>
3 *
4 * see COPYING file
5 */
6
7 #include <global.h>
8 #include "../include/refit_call_wrapper.h"
9
10 #include "simple_file.h"
11 #include "execute.h" /* for generate_path() */
12
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;
16
17 EFI_STATUS
18 simple_file_open_by_handle(EFI_HANDLE device, CHAR16 *name, EFI_FILE **file, UINT64 mode)
19 {
20 EFI_STATUS efi_status;
21 EFI_FILE_IO_INTERFACE *drive;
22 EFI_FILE *root;
23
24 efi_status = uefi_call_wrapper(BS->HandleProtocol, 3, device,
25 &SIMPLE_FS_PROTOCOL, (VOID**) &drive);
26
27 if (efi_status != EFI_SUCCESS) {
28 Print(L"Unable to find simple file protocol\n");
29 goto error;
30 }
31
32 efi_status = uefi_call_wrapper(drive->OpenVolume, 2, drive, &root);
33
34 if (efi_status != EFI_SUCCESS) {
35 Print(L"Failed to open drive volume\n");
36 goto error;
37 }
38
39 efi_status = uefi_call_wrapper(root->Open, 5, root, file, name,
40 mode, 0);
41
42 error:
43 return efi_status;
44 }
45
46 EFI_STATUS
47 simple_file_open(EFI_HANDLE image, CHAR16 *name, EFI_FILE **file, UINT64 mode)
48 {
49 EFI_STATUS efi_status;
50 EFI_HANDLE device;
51 EFI_LOADED_IMAGE *li;
52 EFI_DEVICE_PATH *loadpath = NULL;
53 CHAR16 *PathName = NULL;
54
55 efi_status = uefi_call_wrapper(BS->HandleProtocol, 3, image,
56 &IMAGE_PROTOCOL, (VOID**) &li);
57
58 if (efi_status != EFI_SUCCESS)
59 return simple_file_open_by_handle(image, name, file, mode);
60
61 efi_status = generate_path(name, li, &loadpath, &PathName);
62
63 if (efi_status != EFI_SUCCESS) {
64 Print(L"Unable to generate load path for %s\n", name);
65 return efi_status;
66 }
67
68 device = li->DeviceHandle;
69
70 efi_status = simple_file_open_by_handle(device, PathName, file, mode);
71
72 FreePool(PathName);
73 FreePool(loadpath);
74
75 return efi_status;
76 }
77
78 EFI_STATUS
79 simple_file_read_all(EFI_FILE *file, UINTN *size, void **buffer)
80 {
81 EFI_STATUS efi_status;
82 EFI_FILE_INFO *fi;
83 char buf[1024];
84
85 *size = sizeof(buf);
86 fi = (void *)buf;
87
88
89 efi_status = uefi_call_wrapper(file->GetInfo, 4, file, &FILE_INFO,
90 size, fi);
91 if (efi_status != EFI_SUCCESS) {
92 Print(L"Failed to get file info\n");
93 return efi_status;
94 }
95
96 *size = fi->FileSize;
97
98 *buffer = AllocatePool(*size);
99 if (!*buffer) {
100 Print(L"Failed to allocate buffer of size %d\n", *size);
101 return EFI_OUT_OF_RESOURCES;
102 }
103 efi_status = uefi_call_wrapper(file->Read, 3, file, size, *buffer);
104
105 return efi_status;
106 }
107
108 void
109 simple_file_close(EFI_FILE *file)
110 {
111 uefi_call_wrapper(file->Close, 1, file);
112 }