-/**\r
- Emuerate all possible bootable medias in the following order:\r
- 1. Removable BlockIo - The boot option only points to the removable media\r
- device, like USB key, DVD, Floppy etc.\r
- 2. Fixed BlockIo - The boot option only points to a Fixed blockIo device,\r
- like HardDisk.\r
- 3. Non-BlockIo SimpleFileSystem - The boot option points to a device supporting\r
- SimpleFileSystem Protocol, but not supporting BlockIo\r
- protocol.\r
- 4. LoadFile - The boot option points to the media supporting \r
- LoadFile protocol.\r
- Reference: UEFI Spec chapter 3.3 Boot Option Variables Default Boot Behavior\r
-\r
- @param BootOptionCount Return the boot option count which has been found.\r
-\r
- @retval Pointer to the boot option array.\r
-**/\r
-EFI_BOOT_MANAGER_LOAD_OPTION *\r
-BdsEnumerateBootOptions (\r
- UINTN *BootOptionCount\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_BOOT_MANAGER_LOAD_OPTION *BootOptions;\r
- UINTN HandleCount;\r
- EFI_HANDLE *Handles;\r
- EFI_BLOCK_IO_PROTOCOL *BlkIo;\r
- UINTN Removable;\r
- UINTN Index;\r
-\r
- ASSERT (BootOptionCount != NULL);\r
-\r
- *BootOptionCount = 0;\r
- BootOptions = NULL;\r
-\r
- //\r
- // Parse removable block io followed by fixed block io\r
- //\r
- gBS->LocateHandleBuffer (\r
- ByProtocol,\r
- &gEfiBlockIoProtocolGuid,\r
- NULL,\r
- &HandleCount,\r
- &Handles\r
- );\r
-\r
- for (Removable = 0; Removable < 2; Removable++) {\r
- for (Index = 0; Index < HandleCount; Index++) {\r
- Status = gBS->HandleProtocol (\r
- Handles[Index],\r
- &gEfiBlockIoProtocolGuid,\r
- (VOID **) &BlkIo\r
- );\r
- if (EFI_ERROR (Status)) {\r
- continue;\r
- }\r
-\r
- //\r
- // Skip the logical partitions\r
- //\r
- if (BlkIo->Media->LogicalPartition) {\r
- continue;\r
- }\r
-\r
- //\r
- // Skip the fixed block io then the removable block io\r
- //\r
- if (BlkIo->Media->RemovableMedia == ((Removable == 0) ? FALSE : TRUE)) {\r
- continue;\r
- }\r
-\r
- BootOptions = ReallocatePool (\r
- sizeof (EFI_BOOT_MANAGER_LOAD_OPTION) * (*BootOptionCount),\r
- sizeof (EFI_BOOT_MANAGER_LOAD_OPTION) * (*BootOptionCount + 1),\r
- BootOptions\r
- );\r
- ASSERT (BootOptions != NULL);\r
-\r
- Status = EfiBootManagerInitializeLoadOption (\r
- &BootOptions[(*BootOptionCount)++],\r
- LoadOptionNumberUnassigned,\r
- LoadOptionTypeBoot,\r
- LOAD_OPTION_ACTIVE,\r
- mRecoveryBoot,\r
- DevicePathFromHandle (Handles[Index]),\r
- NULL,\r
- 0\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
- }\r
- }\r
-\r
- if (HandleCount != 0) {\r
- FreePool (Handles);\r
- }\r
-\r
- //\r
- // Parse simple file system not based on block io\r
- //\r
- gBS->LocateHandleBuffer (\r
- ByProtocol,\r
- &gEfiSimpleFileSystemProtocolGuid,\r
- NULL,\r
- &HandleCount,\r
- &Handles\r
- );\r
- for (Index = 0; Index < HandleCount; Index++) {\r
- Status = gBS->HandleProtocol (\r
- Handles[Index],\r
- &gEfiBlockIoProtocolGuid,\r
- (VOID **) &BlkIo\r
- );\r
- if (!EFI_ERROR (Status)) {\r
- //\r
- // Skip if the file system handle supports a BlkIo protocol, which we've handled in above\r
- //\r
- continue;\r
- }\r
- BootOptions = ReallocatePool (\r
- sizeof (EFI_BOOT_MANAGER_LOAD_OPTION) * (*BootOptionCount),\r
- sizeof (EFI_BOOT_MANAGER_LOAD_OPTION) * (*BootOptionCount + 1),\r
- BootOptions\r
- );\r
- ASSERT (BootOptions != NULL);\r
-\r
- Status = EfiBootManagerInitializeLoadOption (\r
- &BootOptions[(*BootOptionCount)++],\r
- LoadOptionNumberUnassigned,\r
- LoadOptionTypeBoot,\r
- LOAD_OPTION_ACTIVE,\r
- mRecoveryBoot,\r
- DevicePathFromHandle (Handles[Index]),\r
- NULL,\r
- 0\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
- }\r
-\r
- if (HandleCount != 0) {\r
- FreePool (Handles);\r
- }\r
-\r
- //\r
- // Parse load file, assuming UEFI Network boot option\r
- //\r
- gBS->LocateHandleBuffer (\r
- ByProtocol,\r
- &gEfiLoadFileProtocolGuid,\r
- NULL,\r
- &HandleCount,\r
- &Handles\r
- );\r
- for (Index = 0; Index < HandleCount; Index++) {\r
-\r
- BootOptions = ReallocatePool (\r
- sizeof (EFI_BOOT_MANAGER_LOAD_OPTION) * (*BootOptionCount),\r
- sizeof (EFI_BOOT_MANAGER_LOAD_OPTION) * (*BootOptionCount + 1),\r
- BootOptions\r
- );\r
- ASSERT (BootOptions != NULL);\r
-\r
- Status = EfiBootManagerInitializeLoadOption (\r
- &BootOptions[(*BootOptionCount)++],\r
- LoadOptionNumberUnassigned,\r
- LoadOptionTypeBoot,\r
- LOAD_OPTION_ACTIVE,\r
- mRecoveryBoot,\r
- DevicePathFromHandle (Handles[Index]),\r
- NULL,\r
- 0\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
- }\r
-\r
- if (HandleCount != 0) {\r
- FreePool (Handles);\r
- }\r
-\r
- return BootOptions;\r
-}\r
-\r