OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
LocateFileSystem.c
Go to the documentation of this file.
1
15#include <Uefi.h>
16#include <Guid/FileInfo.h>
17#include <Protocol/SimpleFileSystem.h>
18
19#include <Library/BaseLib.h>
20#include <Library/BaseMemoryLib.h>
22#include <Library/MemoryAllocationLib.h>
23#include <Library/DevicePathLib.h>
25#include <Library/OcFileLib.h>
26#include <Library/UefiBootServicesTableLib.h>
27
28EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *
30 IN EFI_HANDLE DeviceHandle OPTIONAL,
31 IN EFI_DEVICE_PATH_PROTOCOL *FilePath OPTIONAL
32 )
33{
34 EFI_STATUS Status;
35 EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *FileSystem;
36
37 DEBUG_CODE_BEGIN ();
38 DEBUG ((DEBUG_INFO, "OCFS: Trying to locate filesystem on %p %p\n", DeviceHandle, FilePath));
39 if (FilePath != NULL) {
40 DebugPrintDevicePath (DEBUG_INFO, "OCFS: Filesystem DP", FilePath);
41 }
42
43 DEBUG_CODE_END ();
44
45 if (DeviceHandle == NULL) {
46 //
47 // Locate DeviceHandle if we have none (idea by dmazar).
48 //
49 if (FilePath == NULL) {
50 DEBUG ((DEBUG_WARN, "OCFS: No device handle or path to proceed\n"));
51 return NULL;
52 }
53
54 Status = gBS->LocateDevicePath (
56 &FilePath,
57 &DeviceHandle
58 );
59
60 if (EFI_ERROR (Status)) {
61 DEBUG ((DEBUG_WARN, "OCFS: Failed to locate device handle over path - %r\n", Status));
62 return NULL;
63 }
64 }
65
66 Status = gBS->HandleProtocol (
67 DeviceHandle,
69 (VOID **)&FileSystem
70 );
71
72 if (EFI_ERROR (Status)) {
73 DEBUG ((DEBUG_INFO, "OCFS: No filesystem on device handle %p\n", DeviceHandle));
74 return NULL;
75 }
76
77 return FileSystem;
78}
79
80EFI_FILE_PROTOCOL *
82 IN EFI_HANDLE DeviceHandle OPTIONAL,
83 IN EFI_DEVICE_PATH_PROTOCOL *FilePath OPTIONAL
84 )
85{
86 EFI_STATUS Status;
87 EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *FileSystem;
88 EFI_FILE_PROTOCOL *RootVolume;
89
90 FileSystem = OcLocateFileSystem (DeviceHandle, FilePath);
91 if (FileSystem == NULL) {
92 return NULL;
93 }
94
95 Status = FileSystem->OpenVolume (FileSystem, &RootVolume);
96 if (EFI_ERROR (Status)) {
97 return NULL;
98 }
99
100 return RootVolume;
101}
102
103EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *
105 IN CONST GUID *Guid
106 )
107{
108 EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SimpleFs;
109
110 EFI_STATUS Status;
111
112 UINTN NumHandles;
113 EFI_HANDLE *HandleBuffer;
114 UINTN Index;
115
116 EFI_DEVICE_PATH_PROTOCOL *DevicePath;
117 CONST HARDDRIVE_DEVICE_PATH *HardDrive;
118
119 ASSERT (Guid != NULL);
120
121 Status = gBS->LocateHandleBuffer (
122 ByProtocol,
124 NULL,
125 &NumHandles,
126 &HandleBuffer
127 );
128 if (EFI_ERROR (Status)) {
129 return NULL;
130 }
131
132 SimpleFs = NULL;
133
134 for (Index = 0; Index < NumHandles; ++Index) {
135 Status = gBS->HandleProtocol (
136 HandleBuffer[Index],
138 (VOID **)&DevicePath
139 );
140 if (EFI_ERROR (Status)) {
141 continue;
142 }
143
144 HardDrive = (HARDDRIVE_DEVICE_PATH *)(
146 DevicePath,
147 MEDIA_DEVICE_PATH,
148 MEDIA_HARDDRIVE_DP
149 )
150 );
151 if ((HardDrive == NULL) || (HardDrive->SignatureType != 0x02)) {
152 continue;
153 }
154
155 if (CompareGuid (Guid, (GUID *)HardDrive->Signature)) {
156 Status = gBS->HandleProtocol (
157 HandleBuffer[Index],
159 (VOID **)&SimpleFs
160 );
161 if (EFI_ERROR (Status)) {
162 SimpleFs = NULL;
163 }
164
165 break;
166 }
167 }
168
169 FreePool (HandleBuffer);
170 return SimpleFs;
171}
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL * OcLocateFileSystemByGuid(IN CONST GUID *Guid)
EFI_FILE_PROTOCOL * OcLocateRootVolume(IN EFI_HANDLE DeviceHandle OPTIONAL, IN EFI_DEVICE_PATH_PROTOCOL *FilePath OPTIONAL)
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL * OcLocateFileSystem(IN EFI_HANDLE DeviceHandle OPTIONAL, IN EFI_DEVICE_PATH_PROTOCOL *FilePath OPTIONAL)
DMG_FILEPATH_DEVICE_PATH FilePath
EFI_BOOT_SERVICES * gBS
VOID DebugPrintDevicePath(IN UINTN ErrorLevel, IN CONST CHAR8 *Message, IN EFI_DEVICE_PATH_PROTOCOL *DevicePath OPTIONAL)
EFI_DEVICE_PATH_PROTOCOL * FindDevicePathNodeWithType(IN EFI_DEVICE_PATH_PROTOCOL *DevicePath, IN UINT8 Type, IN UINT8 SubType OPTIONAL)
BOOLEAN EFIAPI CompareGuid(IN CONST GUID *Guid1, IN CONST GUID *Guid2)
EFI_GUID gEfiSimpleFileSystemProtocolGuid
EFI_GUID gEfiDevicePathProtocolGuid
#define ASSERT(x)
Definition coder.h:55