-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathfilesystem.h
59 lines (48 loc) · 1.82 KB
/
filesystem.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <efi.h>
#include <efilib.h>
// #include "memory.h"
UINT64 FileSize(EFI_FILE_HANDLE FileHandle)
{
UINT64 ret;
EFI_FILE_INFO *FileInfo; /* file information structure */
/* get the file's size */
FileInfo = LibFileInfo(FileHandle);
ret = FileInfo->FileSize;
FreePool(FileInfo);
return ret;
}
EFI_FILE_HANDLE GetVolume(EFI_HANDLE image)
{
EFI_LOADED_IMAGE *loaded_image = NULL; /* image interface */
EFI_GUID lipGuid = EFI_LOADED_IMAGE_PROTOCOL_GUID; /* image interface GUID */
EFI_FILE_IO_INTERFACE *IOVolume; /* file system interface */
EFI_GUID fsGuid = EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID; /* file system interface GUID */
EFI_FILE_HANDLE Volume; /* the volume's interface */
/* get the loaded image protocol interface for our "image" */
uefi_call_wrapper(BS->HandleProtocol, 3, image, &lipGuid, (void **)&loaded_image);
/* get the volume handle */
uefi_call_wrapper(BS->HandleProtocol, 3, loaded_image->DeviceHandle, &fsGuid, (VOID *)&IOVolume);
uefi_call_wrapper(IOVolume->OpenVolume, 2, IOVolume, &Volume);
return Volume;
}
void *ReadFileTooBuffer(CHAR16 *FileName, EFI_FILE_HANDLE Volume)
{
EFI_FILE_HANDLE FileHandle;
/* open the file */
uefi_call_wrapper(Volume->Open, 5, Volume, &FileHandle, FileName, EFI_FILE_MODE_READ, EFI_FILE_READ_ONLY | EFI_FILE_HIDDEN | EFI_FILE_SYSTEM);
UINT64 ReadSize = FileSize(FileHandle);
UINT8 *Buffer = uefi_malloc(ReadSize);
uefi_call_wrapper(FileHandle->Read, 3, FileHandle, &ReadSize, Buffer);
/* close the file */
uefi_call_wrapper(FileHandle->Close, 1, FileHandle);
return Buffer;
}
BOOLEAN FileExists(CHAR16 *FileName, EFI_FILE_HANDLE Volume)
{
char *buffer = ReadFileTooBuffer(FileName, Volume);
if (buffer[0] == '\0') {
return 1;
} else {
return 0;
}
}