OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
OpenLegacyBoot.c
Go to the documentation of this file.
1
9
11
12STATIC EFI_HANDLE mImageHandle;
14
16
17//
18// Fallback PIWG firmware media device path for Apple legacy interface.
19// MemoryMapped(0xB,0xFFE00000,0xFFF9FFFF)/FvFile(2B0585EB-D8B8-49A9-8B8C-E21B01AEF2B7)
20//
22 0x01, 0x03, 0x18, 0x00, 0x0B, 0x00, 0x00, 0x00,
23 0x00, 0x00, 0xE0, 0xFF, 0x00, 0x00, 0x00, 0x00,
24 0xFF, 0xFF, 0xF9, 0xFF, 0x00, 0x00, 0x00, 0x00,
25 0x04, 0x06, 0x14, 0x00, 0xEB, 0x85, 0x05, 0x2B,
26 0xB8, 0xD8, 0xA9, 0x49, 0x8B, 0x8C, 0xE2, 0x1B,
27 0x01, 0xAE, 0xF2, 0xB7, 0x7F, 0xFF, 0x04, 0x00
28};
29STATIC CONST EFI_DEVICE_PATH_PROTOCOL *AppleLegacyInterfaceFallbackDevicePathPath = (EFI_DEVICE_PATH_PROTOCOL *)AppleLegacyInterfaceFallbackDevicePathData;
30
31STATIC
32CHAR8 *
34 OC_LEGACY_OS_TYPE LegacyOsType
35 )
36{
37 return AllocateCopyPool (L_STR_SIZE ("Windows (legacy)"), "Windows (legacy)");
38}
39
40STATIC
41CHAR8 *
43 OC_LEGACY_OS_TYPE LegacyOsType
44 )
45{
46 return AllocateCopyPool (L_STR_SIZE (OC_FLAVOUR_WINDOWS), OC_FLAVOUR_WINDOWS);
47}
48
49STATIC
50CHAR8 *
52 IN OUT OC_PICKER_CONTEXT *PickerContext,
53 IN EFI_HANDLE DiskHandle
54 )
55{
56 EFI_STATUS Status;
57 CHAR8 *DiskLabel;
58 EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *FileSystem;
59
60 DiskLabel = NULL;
61 if ((PickerContext->PickerAttributes & OC_ATTR_USE_DISK_LABEL_FILE) != 0) {
62 Status = gBS->HandleProtocol (
63 DiskHandle,
65 (VOID **)&FileSystem
66 );
67 if (EFI_ERROR (Status)) {
68 return NULL;
69 }
70
71 DiskLabel = OcReadFile (FileSystem, L".contentDetails", NULL, 0);
72 if (DiskLabel == NULL) {
73 DiskLabel = OcReadFile (FileSystem, L".disk_label.contentDetails", NULL, 0);
74 }
75
76 if (DiskLabel == NULL) {
77 DEBUG ((DEBUG_INFO, "OLB: %s %s not present\n", L".contentDetails", L".disk_label.contentDetails"));
78 } else {
79 DEBUG ((DEBUG_INFO, "OLB: Found disk label '%a'\n", DiskLabel));
80 }
81 }
82
83 return DiskLabel;
84}
85
86STATIC
87VOID
89 IN OC_PICKER_ENTRY *Entry
90 )
91{
92 ASSERT (Entry != NULL);
93
94 if (Entry == NULL) {
95 return;
96 }
97
98 if (Entry->Id != NULL) {
99 FreePool ((CHAR8 *)Entry->Id);
100 }
101
102 if (Entry->Name != NULL) {
103 FreePool ((CHAR8 *)Entry->Name);
104 }
105
106 if (Entry->Flavour != NULL) {
107 FreePool ((CHAR8 *)Entry->Flavour);
108 }
109}
110
111STATIC
112EFI_STATUS
114 IN OUT OC_PICKER_CONTEXT *PickerContext,
115 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath
116 )
117{
118 EFI_STATUS Status;
119 EFI_HANDLE DiskHandle;
120 EFI_HANDLE LoadedImageHandle;
121 EFI_DEVICE_PATH_PROTOCOL *LoadedImageDevicePath;
122 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
123 BOOLEAN IsExternal;
124 CONST CHAR8 *AppleBootArg;
125
126 //
127 // Set BootCampHD to desired disk Device Path for non-CD devices.
128 //
129 if (!OcIsDiskCdRom (DevicePath)) {
130 Status = InternalSetBootCampHDPath (DevicePath);
131 if (EFI_ERROR (Status)) {
132 DEBUG ((DEBUG_INFO, "OLB: Failure while setting BootCampHD variable - %r\n", Status));
133 return Status;
134 }
135 }
136
137 //
138 // Load and start legacy OS.
139 //
140 // On Macs, use the Apple legacy interface.
141 // On other systems, use the Legacy8259 protocol.
142 //
143 DebugPrintDevicePath (DEBUG_INFO, "OLB: Legacy device path", DevicePath);
145 DiskHandle = OcPartitionGetPartitionHandle (DevicePath);
146 if (DiskHandle == NULL) {
147 return EFI_INVALID_PARAMETER;
148 }
149
152 &LoadedImageDevicePath,
153 &LoadedImageHandle
154 );
155 if (EFI_ERROR (Status)) {
156 DEBUG ((DEBUG_INFO, "OLB: Failure while loading Apple legacy interface - %r\n", Status));
157 return Status;
158 }
159
160 //
161 // Specify boot device type argument on loaded image.
162 //
163 Status = gBS->HandleProtocol (
164 LoadedImageHandle,
166 (VOID **)&LoadedImage
167 );
168 if (EFI_ERROR (Status)) {
169 DEBUG ((DEBUG_INFO, "OLB: Failure while loading Apple legacy interface - %r\n", Status));
170 gBS->UnloadImage (LoadedImageHandle);
171 return Status;
172 }
173
174 LoadedImage->LoadOptionsSize = 0;
175 LoadedImage->LoadOptions = NULL;
176
177 OcGetDevicePolicyType (DiskHandle, &IsExternal);
178
179 if (OcIsDiskCdRom (DevicePath)) {
180 AppleBootArg = "CD";
181 } else if (IsExternal) {
182 AppleBootArg = "USB";
183 } else {
184 AppleBootArg = "HD";
185 }
186
188 LoadedImage,
189 &AppleBootArg,
190 1,
191 TRUE
192 );
193 DEBUG ((DEBUG_INFO, "OLB: Apple legacy interface args <%s>\n", LoadedImage->LoadOptions));
194
195 Status = gBS->StartImage (LoadedImageHandle, NULL, NULL);
196 if (EFI_ERROR (Status)) {
197 DEBUG ((DEBUG_INFO, "OLB: Failure while starting Apple legacy interface - %r\n", Status));
198 gBS->UnloadImage (LoadedImageHandle);
199 return Status;
200 }
201 } else {
202 Status = InternalLoadLegacyPbr (DevicePath);
203 if (EFI_ERROR (Status)) {
204 DEBUG ((DEBUG_INFO, "OLB: Failure while starting legacy PBR interface - %r\n", Status));
205 return Status;
206 }
207 }
208
209 return EFI_SUCCESS;
210}
211
212STATIC
213EFI_STATUS
215 IN OUT OC_PICKER_CONTEXT *PickerContext,
216 IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
217 )
218{
219 EFI_STATUS Status;
220 EFI_HANDLE LoadedImageHandle;
221 EFI_DEVICE_PATH_PROTOCOL *LoadedImageDevicePath;
222 EFI_DEVICE_PATH_PROTOCOL *AppleLoaderDevicePath;
223
224 //
225 // Set BootCampHD to desired disk Device Path for non-CD devices.
226 //
227 if (!OcIsDiskCdRom (*DevicePath)) {
228 Status = InternalSetBootCampHDPath (*DevicePath);
229 if (EFI_ERROR (Status)) {
230 DEBUG ((DEBUG_INFO, "OLB: Failure while setting BootCampHD variable - %r\n", Status));
231 return Status;
232 }
233 }
234
235 //
236 // Locate Apple legacy interface loader.
237 //
238 // On Macs, use the Apple legacy interface and set BootCampHD.
239 // On other systems, use a default placeholder path.
240 //
241 DebugPrintDevicePath (DEBUG_INFO, "OLB: Legacy device path", *DevicePath);
245 &LoadedImageDevicePath,
246 &LoadedImageHandle
247 );
248 if (EFI_ERROR (Status)) {
249 DEBUG ((DEBUG_INFO, "OLB: Failure while loading Apple legacy interface - %r\n", Status));
250 return Status;
251 }
252
253 gBS->UnloadImage (LoadedImageHandle);
254
255 AppleLoaderDevicePath = DuplicateDevicePath (LoadedImageDevicePath);
256 } else {
257 AppleLoaderDevicePath = DuplicateDevicePath (AppleLegacyInterfaceFallbackDevicePathPath);
258 }
259
260 if (AppleLoaderDevicePath == NULL) {
261 return EFI_OUT_OF_RESOURCES;
262 }
263
264 *DevicePath = AppleLoaderDevicePath;
265 return EFI_SUCCESS;
266}
267
268STATIC
269EFI_STATUS
270EFIAPI
272 IN OUT OC_PICKER_CONTEXT *PickerContext,
273 IN CONST EFI_HANDLE Device OPTIONAL,
274 OUT OC_PICKER_ENTRY **Entries,
275 OUT UINTN *NumEntries
276 )
277{
278 EFI_STATUS Status;
279 UINTN NoHandles;
280 EFI_HANDLE *Handles;
281 UINTN HandleIndex;
282 UINTN DevicePathIndex;
283 BOOLEAN SkipHiddenDevice;
284 UINT32 ScanPolicy;
285 BOOLEAN IsExternal;
286
287 CHAR16 *UnicodeDevicePath;
288 CHAR8 *AsciiDevicePath;
289 UINTN AsciiDevicePathSize;
290 CHAR16 **HiddenUnicodeDevicePath;
291
292 EFI_HANDLE BlockDeviceHandle;
293 EFI_DEVICE_PATH_PROTOCOL *BlockDevicePath;
294 OC_LEGACY_OS_TYPE LegacyOsType;
295 OC_FLEX_ARRAY *FlexPickerEntries;
296 OC_PICKER_ENTRY *PickerEntry;
297
298 ASSERT (PickerContext != NULL);
299 ASSERT (Entries != NULL);
300 ASSERT (NumEntries != NULL);
301
302 //
303 // Custom entries only.
304 //
305 if (Device != NULL) {
306 return EFI_NOT_FOUND;
307 }
308
310 if (FlexPickerEntries == NULL) {
311 return EFI_OUT_OF_RESOURCES;
312 }
313
314 //
315 // Get all Block I/O handles.
316 //
317 Status = gBS->LocateHandleBuffer (
318 ByProtocol,
320 NULL,
321 &NoHandles,
322 &Handles
323 );
324 if (EFI_ERROR (Status)) {
325 DEBUG ((DEBUG_INFO, "OLB: Failed to get Block I/O handles - %r\n", Status));
326 OcFlexArrayFree (&FlexPickerEntries);
327 return Status;
328 }
329
330 for (HandleIndex = 0; HandleIndex < NoHandles; HandleIndex++) {
331 BlockDeviceHandle = Handles[HandleIndex];
332
333 //
334 // If device type locking is set and this device is not allowed,
335 // skip device.
336 //
337 ScanPolicy = OcGetDevicePolicyType (BlockDeviceHandle, &IsExternal);
338 if (((PickerContext->ScanPolicy & OC_SCAN_DEVICE_LOCK) != 0) && ((ScanPolicy & PickerContext->ScanPolicy) == 0)) {
339 continue;
340 }
341
342 BlockDevicePath = DevicePathFromHandle (BlockDeviceHandle);
343 if (BlockDevicePath == NULL) {
344 DEBUG ((DEBUG_INFO, "OLB: Could not find Device Path for block device\n"));
345 continue;
346 }
347
348 //
349 // Device Path will be used as ID and is required for default entry matching.
350 //
351 UnicodeDevicePath = ConvertDevicePathToText (BlockDevicePath, FALSE, FALSE);
352 if (UnicodeDevicePath == NULL) {
353 OcFlexArrayFree (&FlexPickerEntries);
354 return EFI_OUT_OF_RESOURCES;
355 }
356
357 //
358 // Skip device if on hidden list.
359 //
360 if (mHiddenDevicePaths != NULL) {
361 SkipHiddenDevice = FALSE;
362 for (DevicePathIndex = 0; DevicePathIndex < mHiddenDevicePaths->Count; DevicePathIndex++) {
363 HiddenUnicodeDevicePath = (CHAR16 **)OcFlexArrayItemAt (mHiddenDevicePaths, DevicePathIndex);
364 ASSERT (HiddenUnicodeDevicePath != NULL);
365
366 if (StrCmp (UnicodeDevicePath, *HiddenUnicodeDevicePath) == 0) {
367 DEBUG ((DEBUG_INFO, "OLB: Skipping hidden device %s\n", *HiddenUnicodeDevicePath));
368 SkipHiddenDevice = TRUE;
369 break;
370 }
371 }
372
373 if (SkipHiddenDevice) {
374 FreePool (UnicodeDevicePath);
375 continue;
376 }
377 }
378
379 //
380 // Detect legacy OS type.
381 //
382 LegacyOsType = InternalGetPartitionLegacyOsType (BlockDeviceHandle, mIsAppleInterfaceSupported);
383 if (LegacyOsType == OcLegacyOsTypeNone) {
384 FreePool (UnicodeDevicePath);
385 continue;
386 }
387
388 //
389 // Create and add picker entry to entries.
390 //
391 PickerEntry = OcFlexArrayAddItem (FlexPickerEntries);
392 if (PickerEntry == NULL) {
393 FreePool (UnicodeDevicePath);
394 OcFlexArrayFree (&FlexPickerEntries);
395 return EFI_OUT_OF_RESOURCES;
396 }
397
398 AsciiDevicePathSize = (StrLen (UnicodeDevicePath) + 1) * sizeof (CHAR8);
399 AsciiDevicePath = AllocatePool (AsciiDevicePathSize);
400 if (AsciiDevicePath == NULL) {
401 FreePool (UnicodeDevicePath);
402 OcFlexArrayFree (&FlexPickerEntries);
403 return EFI_OUT_OF_RESOURCES;
404 }
405
406 Status = UnicodeStrToAsciiStrS (UnicodeDevicePath, AsciiDevicePath, AsciiDevicePathSize);
407 FreePool (UnicodeDevicePath);
408 if (EFI_ERROR (Status)) {
409 FreePool (AsciiDevicePath);
410 OcFlexArrayFree (&FlexPickerEntries);
411 return Status;
412 }
413
414 PickerEntry->Name = LoadAppleDiskLabel (PickerContext, BlockDeviceHandle);
415 if (PickerEntry->Name == NULL) {
416 PickerEntry->Name = GetLegacyEntryName (LegacyOsType);
417 }
418
419 PickerEntry->Id = AsciiDevicePath;
420 PickerEntry->Path = NULL;
421 PickerEntry->Arguments = NULL;
422 PickerEntry->Flavour = GetLegacyEntryFlavour (LegacyOsType);
423 PickerEntry->Tool = FALSE;
424 PickerEntry->TextMode = FALSE;
425 PickerEntry->RealPath = FALSE;
426 PickerEntry->External = IsExternal;
429 PickerEntry->UnmanagedDevicePath = BlockDevicePath;
430
431 if ((PickerEntry->Name == NULL) || (PickerEntry->Flavour == NULL)) {
432 OcFlexArrayFree (&FlexPickerEntries);
433 return EFI_OUT_OF_RESOURCES;
434 }
435 }
436
437 OcFlexArrayFreeContainer (&FlexPickerEntries, (VOID **)Entries, NumEntries);
438
439 return EFI_SUCCESS;
440}
441
442STATIC
443VOID
444EFIAPI
446 IN OC_PICKER_ENTRY **Entries,
447 IN UINTN NumEntries
448 )
449{
450 UINTN Index;
451
452 ASSERT (Entries != NULL);
453 ASSERT (*Entries != NULL);
454 if ((Entries == NULL) || (*Entries == NULL)) {
455 return;
456 }
457
458 for (Index = 0; Index < NumEntries; Index++) {
459 FreePickerEntry (&(*Entries)[Index]);
460 }
461
462 FreePool (*Entries);
463 *Entries = NULL;
464}
465
466STATIC
474
475EFI_STATUS
476EFIAPI
478 IN EFI_HANDLE ImageHandle,
479 IN EFI_SYSTEM_TABLE *SystemTable
480 )
481{
482 EFI_STATUS Status;
483 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
484 CHAR16 *DevicePathNames;
485 OC_FLEX_ARRAY *ParsedLoadOptions;
486
487 Status = gBS->HandleProtocol (
488 ImageHandle,
490 (VOID **)&LoadedImage
491 );
492 if (EFI_ERROR (Status)) {
493 return Status;
494 }
495
496 mImageHandle = ImageHandle;
497 mHiddenDevicePaths = NULL;
498
499 Status = OcParseLoadOptions (LoadedImage, &ParsedLoadOptions);
500 if (!EFI_ERROR (Status)) {
501 OcParsedVarsGetUnicodeStr (ParsedLoadOptions, L"--hide-devices", &DevicePathNames);
502 if (DevicePathNames != NULL) {
503 mHiddenDevicePaths = OcStringSplit (DevicePathNames, L';', OcStringFormatUnicode);
504 if (mHiddenDevicePaths == NULL) {
505 return EFI_OUT_OF_RESOURCES;
506 }
507 }
508 } else {
509 if (Status != EFI_NOT_FOUND) {
510 return Status;
511 }
512 }
513
515 if (EFI_ERROR (Status)) {
516 DEBUG ((DEBUG_WARN, "OLB: Legacy boot interface is supported on this system\n"));
517 return Status;
518 }
519
520 DEBUG ((DEBUG_INFO, "OLB: Apple legacy interface: %d\n", mIsAppleInterfaceSupported));
521
522 Status = gBS->InstallMultipleProtocolInterfaces (
523 &ImageHandle,
526 NULL
527 );
528
529 ASSERT_EFI_ERROR (Status);
530 if (EFI_ERROR (Status)) {
531 return Status;
532 }
533
534 return EFI_SUCCESS;
535}
EFI_STATUS InternalLoadAppleLegacyInterface(IN EFI_HANDLE ParentImageHandle, OUT EFI_DEVICE_PATH_PROTOCOL **ImageDevicePath, OUT EFI_HANDLE *ImageHandle)
@ OcLegacyOsTypeNone
OC_LEGACY_OS_TYPE InternalGetPartitionLegacyOsType(IN EFI_HANDLE PartitionHandle, IN BOOLEAN IsCdRomSupported)
EFI_STATUS InternalSetBootCampHDPath(IN EFI_DEVICE_PATH_PROTOCOL *HdDevicePath)
EFI_STATUS InternalLoadLegacyPbr(IN EFI_DEVICE_PATH_PROTOCOL *PartitionPath)
EFI_STATUS InternalIsLegacyInterfaceSupported(OUT BOOLEAN *IsAppleInterfaceSupported)
enum OC_LEGACY_OS_TYPE_ OC_LEGACY_OS_TYPE
EFI_GUID gOcBootEntryProtocolGuid
#define OC_BOOT_ENTRY_PROTOCOL_REVISION
Definition OcBootEntry.h:31
#define OC_FLAVOUR_WINDOWS
#define OC_ATTR_USE_DISK_LABEL_FILE
#define OC_SCAN_DEVICE_LOCK
EFI_STATUS OcParseLoadOptions(IN CONST EFI_LOADED_IMAGE_PROTOCOL *LoadedImage, OUT OC_FLEX_ARRAY **ParsedVars)
UINT32 OcGetDevicePolicyType(IN EFI_HANDLE Handle, OUT BOOLEAN *External OPTIONAL)
BOOLEAN OcParsedVarsGetUnicodeStr(IN CONST OC_FLEX_ARRAY *ParsedVars, IN CONST CHAR16 *Name, OUT CHAR16 **StrValue)
BOOLEAN OcAppendArgumentsToLoadedImage(IN OUT EFI_LOADED_IMAGE_PROTOCOL *LoadedImage, IN CONST CHAR8 **Arguments, IN UINT32 ArgumentCount, IN BOOLEAN Replace)
EFI_BOOT_SERVICES * gBS
VOID DebugPrintDevicePath(IN UINTN ErrorLevel, IN CONST CHAR8 *Message, IN EFI_DEVICE_PATH_PROTOCOL *DevicePath OPTIONAL)
EFI_HANDLE OcPartitionGetPartitionHandle(IN EFI_DEVICE_PATH_PROTOCOL *HdDevicePath)
Definition DiskMisc.c:353
BOOLEAN OcIsDiskCdRom(IN EFI_DEVICE_PATH_PROTOCOL *DiskDevicePath)
Definition DiskMisc.c:369
VOID * OcReadFile(IN CONST EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *FileSystem, IN CONST CHAR16 *FilePath, OUT UINT32 *FileSize OPTIONAL, IN CONST UINT32 MaxFileSize OPTIONAL)
Definition ReadFile.c:33
VOID OcFlexArrayFree(IN OUT OC_FLEX_ARRAY **FlexArray)
OC_FLEX_ARRAY * OcFlexArrayInit(IN CONST UINTN ItemSize, IN CONST OC_FLEX_ARRAY_FREE_ITEM FreeItem OPTIONAL)
Definition FlexArray.c:31
VOID(* OC_FLEX_ARRAY_FREE_ITEM)(IN VOID *Item)
VOID OcFlexArrayFreeContainer(IN OUT OC_FLEX_ARRAY **FlexArray, IN OUT VOID **Items, IN OUT UINTN *Count)
VOID * OcFlexArrayAddItem(IN OUT OC_FLEX_ARRAY *FlexArray)
Definition FlexArray.c:136
VOID * OcFlexArrayItemAt(IN CONST OC_FLEX_ARRAY *FlexArray, IN CONST UINTN Index)
Definition FlexArray.c:189
OC_FLEX_ARRAY * OcStringSplit(IN CONST VOID *String, IN CONST CHAR16 Delim, IN CONST OC_STRING_FORMAT StringFormat)
Definition FlexString.c:15
#define L_STR_SIZE(String)
Definition OcStringLib.h:35
@ OcStringFormatUnicode
Definition OcStringLib.h:51
STATIC VOID FreePickerEntry(IN OC_PICKER_ENTRY *Entry)
STATIC CONST UINT8 AppleLegacyInterfaceFallbackDevicePathData[]
STATIC BOOLEAN mIsAppleInterfaceSupported
STATIC EFI_HANDLE mImageHandle
EFI_STATUS EFIAPI UefiMain(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
STATIC EFI_STATUS EFIAPI OcGetLegacyBootEntries(IN OUT OC_PICKER_CONTEXT *PickerContext, IN CONST EFI_HANDLE Device OPTIONAL, OUT OC_PICKER_ENTRY **Entries, OUT UINTN *NumEntries)
STATIC OC_FLEX_ARRAY * mHiddenDevicePaths
STATIC VOID EFIAPI OcFreeLegacyBootEntries(IN OC_PICKER_ENTRY **Entries, IN UINTN NumEntries)
STATIC EFI_STATUS UnmanagedBootGetFinalDevicePath(IN OUT OC_PICKER_CONTEXT *PickerContext, IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath)
STATIC CONST EFI_DEVICE_PATH_PROTOCOL * AppleLegacyInterfaceFallbackDevicePathPath
STATIC CHAR8 * GetLegacyEntryName(OC_LEGACY_OS_TYPE LegacyOsType)
STATIC CHAR8 * GetLegacyEntryFlavour(OC_LEGACY_OS_TYPE LegacyOsType)
STATIC EFI_STATUS UnmanagedBootActionDoLegacyBoot(IN OUT OC_PICKER_CONTEXT *PickerContext, IN EFI_DEVICE_PATH_PROTOCOL *DevicePath)
STATIC OC_BOOT_ENTRY_PROTOCOL mLegacyBootEntryProtocol
STATIC CHAR8 * LoadAppleDiskLabel(IN OUT OC_PICKER_CONTEXT *PickerContext, IN EFI_HANDLE DiskHandle)
EFI_GUID gEfiSimpleFileSystemProtocolGuid
EFI_GUID gEfiBlockIoProtocolGuid
EFI_GUID gEfiLoadedImageProtocolGuid
EFI_DEVICE_PATH_PROTOCOL *EFIAPI DevicePathFromHandle(IN EFI_HANDLE Handle)
Definition UserMisc.c:680
#define ASSERT(x)
Definition coder.h:55
struct DiskLabel_ DiskLabel
OC_BOOT_UNMANAGED_ACTION UnmanagedBootAction
OC_BOOT_UNMANAGED_GET_FINAL_DP UnmanagedBootGetFinalDevicePath
CONST CHAR8 * Arguments
EFI_DEVICE_PATH_PROTOCOL * UnmanagedDevicePath