2 * COPYRIGHT: See COPYING.ARM in the top level directory
3 * PROJECT: ReactOS UEFI Boot Library
4 * FILE: boot/environ/include/bl.h
5 * PURPOSE: Main Boot Library Header
6 * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org)
12 /* INCLUDES ******************************************************************/
27 #include <DevicePath.h>
28 #include <LoadedImage.h>
29 #include <GraphicsOutput.h>
33 /* Registry Headers */
37 /* DEFINES *******************************************************************/
39 #define BL_APPLICATION_FLAG_CONVERTED_FROM_EFI 0x01
41 #define BL_APP_ENTRY_SIGNATURE "BTAPENT"
43 #define BOOT_APPLICATION_SIGNATURE_1 'TOOB'
44 #define BOOT_APPLICATION_SIGNATURE_2 ' PPA'
46 #define BOOT_MEMORY_TRANSLATION_TYPE_PHYSICAL 0
47 #define BOOT_MEMORY_TRANSLATION_TYPE_VIRTUAL 1
49 #define BOOT_APPLICATION_VERSION 2
50 #define BL_MEMORY_DATA_VERSION 1
51 #define BL_RETURN_ARGUMENTS_VERSION 1
52 #define BL_FIRMWARE_DESCRIPTOR_VERSION 2
54 #define BL_APPLICATION_ENTRY_FLAG_NO_GUID 0x01
55 #define BL_APPLICATION_ENTRY_REBOOT_ON_ERROR 0x20
57 #define BL_CONTEXT_PAGING_ON 1
58 #define BL_CONTEXT_INTERRUPTS_ON 2
60 #define BL_MM_FLAG_USE_FIRMWARE_FOR_MEMORY_MAP_BUFFERS 0x01
61 #define BL_MM_FLAG_REQUEST_COALESCING 0x02
63 #define BL_MM_ADD_DESCRIPTOR_COALESCE_FLAG 0x01
64 #define BL_MM_ADD_DESCRIPTOR_TRUNCATE_FLAG 0x02
65 #define BL_MM_ADD_DESCRIPTOR_NEVER_COALESCE_FLAG 0x10
66 #define BL_MM_ADD_DESCRIPTOR_NEVER_TRUNCATE_FLAG 0x20
67 #define BL_MM_ADD_DESCRIPTOR_UPDATE_LIST_POINTER_FLAG 0x2000
69 #define BL_MM_REQUEST_DEFAULT_TYPE 1
70 #define BL_MM_REQUEST_TOP_DOWN_TYPE 2
72 #define BL_MM_REMOVE_VIRTUAL_REGION_FLAG 0x80000000
74 #define BL_LIBRARY_FLAG_NO_DISPLAY 0x01
75 #define BL_LIBRARY_FLAG_REINITIALIZE 0x02
76 #define BL_LIBRARY_FLAG_REINITIALIZE_ALL 0x04
77 #define BL_LIBRARY_FLAG_ZERO_HEAP_ALLOCATIONS_ON_FREE 0x10
78 #define BL_LIBRARY_FLAG_INITIALIZATION_COMPLETED 0x20
79 #define BL_LIBRARY_FLAG_NO_GRAPHICS_CONSOLE 0x800
81 #define BL_DISPLAY_GRAPHICS_FORCED_VIDEO_MODE_FLAG 0x01
82 #define BL_DISPLAY_GRAPHICS_FORCED_HIGH_RES_MODE_FLAG 0x02
84 #define BL_HT_VALUE_IS_INLINE 0x01
86 #define BL_FS_REGISTER_AT_HEAD_FLAG 1
88 #define BL_BLOCK_DEVICE_REMOVABLE_FLAG 0x01
90 #define BL_MEMORY_CLASS_SHIFT 28
92 #define BL_FILE_READ_ACCESS 0x01
93 #define BL_FILE_WRITE_ACCESS 0x02
94 #define BL_DIRECTORY_ACCESS 0x04
95 #define BL_UNKNOWN_ACCESS 0x10
97 #define BL_DEVICE_READ_ACCESS 0x01
98 #define BL_DEVICE_WRITE_ACCESS 0x02
100 #define BL_DEVICE_ENTRY_OPENED 0x01
101 #define BL_DEVICE_ENTRY_READ_ACCESS 0x02
102 #define BL_DEVICE_ENTRY_WRITE_ACCESS 0x04
104 #define BL_FILE_ENTRY_OPENED 0x01
105 #define BL_FILE_ENTRY_READ_ACCESS 0x02
106 #define BL_FILE_ENTRY_WRITE_ACCESS 0x04
107 #define BL_FILE_ENTRY_UNKNOWN_ACCESS 0x10
109 #define BL_IMG_VALID_FILE 0x01
110 #define BL_IMG_MEMORY_FILE 0x02
111 #define BL_IMG_REMOTE_FILE 0x04
113 #define BL_LOAD_IMG_VIRTUAL_BUFFER 0x01
114 #define BL_LOAD_IMG_EXISTING_BUFFER 0x04
115 #define BL_LOAD_IMG_UNKNOWN_BUFFER_FLAG 0x08
116 #define BL_LOAD_IMG_COMPUTE_SIGNATURE 0x10
117 #define BL_LOAD_IMG_COMPUTE_HASH 0x40000
119 /* ENUMERATIONS **************************************************************/
121 typedef enum _BL_COLOR
139 } BL_COLOR
, *PBL_COLOR
;
141 typedef enum _BL_MEMORY_DESCRIPTOR_TYPE
145 } BL_MEMORY_DESCRIPTOR_TYPE
;
147 typedef enum _BL_TRANSLATION_TYPE
153 } BL_TRANSLATION_TYPE
;
155 typedef enum _BL_ARCH_MODE
164 typedef enum _BL_DEVICE_TYPE
167 LegacyPartitionDevice
= 2,
176 // Local Device Types
178 typedef enum _BL_LOCAL_DEVICE_TYPE
185 VirtualDiskDevice
= 6
186 } BL_LOCAL_DEVICE_TYPE
;
191 typedef enum _BL_PARTITION_TYPE
201 typedef enum _BL_PATH_TYPE
210 typedef enum _BL_MEMORY_CLASS
220 typedef enum _BL_MEMORY_TYPE
225 BlLoaderMemory
= 0xD0000002,
226 BlLoaderDeviceMemory
= 0xD0000004,
227 BlLoaderHeap
= 0xD0000005,
228 BlLoaderPageDirectory
= 0xD0000006,
229 BlLoaderReferencePage
= 0xD0000007,
230 BlLoaderRamDisk
= 0xD0000008,
231 BlLoaderData
= 0xD000000A,
232 BlLoaderRegistry
= 0xD000000B,
233 BlLoaderBlockMemory
= 0xD000000C,
234 BlLoaderSelfMap
= 0xD000000F,
237 // Application Memory
239 BlApplicationData
= 0xE0000004,
244 BlConventionalMemory
= 0xF0000001,
245 BlUnusableMemory
= 0xF0000002,
246 BlReservedMemory
= 0xF0000003,
247 BlEfiBootMemory
= 0xF0000004,
248 BlEfiRuntimeMemory
= 0xF0000006,
249 BlAcpiReclaimMemory
= 0xF0000008,
250 BlAcpiNvsMemory
= 0xF0000009,
251 BlDeviceIoMemory
= 0xF000000A,
252 BlDevicePortMemory
= 0xF000000B,
253 BlPalMemory
= 0xF000000C,
256 typedef enum _BL_MEMORY_ATTR
259 // Memory Caching Attributes
261 BlMemoryUncached
= 0x00000001,
262 BlMemoryWriteCombined
= 0x00000002,
263 BlMemoryWriteThrough
= 0x00000004,
264 BlMemoryWriteBack
= 0x00000008,
265 BlMemoryUncachedExported
= 0x00000010,
266 BlMemoryValidCacheAttributes
= BlMemoryUncached
| BlMemoryWriteCombined
| BlMemoryWriteThrough
| BlMemoryWriteBack
| BlMemoryUncachedExported
,
267 BlMemoryValidCacheAttributeMask
= 0x000000FF,
270 // Memory Protection Attributes
272 BlMemoryWriteProtected
= 0x00000100,
273 BlMemoryReadProtected
= 0x00000200,
274 BlMemoryExecuteProtected
= 0x00000400,
275 BlMemoryValidProtectionAttributes
= BlMemoryWriteProtected
| BlMemoryReadProtected
| BlMemoryExecuteProtected
,
276 BlMemoryValidProtectionAttributeMask
= 0x0000FF00,
279 // Memory Allocation Attributes
281 BlMemoryNonFixed
= 0x00020000,
282 BlMemoryFixed
= 0x00040000,
283 BlMemoryValidAllocationAttributes
= BlMemoryNonFixed
| BlMemoryFixed
,
284 BlMemoryValidAllocationAttributeMask
= 0x00FF0000,
287 // Memory Type Attributes
289 BlMemoryRuntime
= 0x01000000,
290 BlMemoryCoalesced
= 0x02000000,
291 BlMemoryUpdate
= 0x04000000,
292 BlMemoryNonFirmware
= 0x08000000,
293 BlMemorySpecial
= 0x20000000,
294 BlMemoryFirmware
= 0x80000000,
295 BlMemoryValidTypeAttributes
= BlMemoryRuntime
| BlMemoryCoalesced
| BlMemoryUpdate
| BlMemoryNonFirmware
| BlMemorySpecial
| BlMemoryFirmware
,
296 BlMemoryValidTypeAttributeMask
= 0xFF000000,
299 /* CALLBACKS *****************************************************************/
301 struct _BL_FILE_ENTRY
;
302 struct _BL_FILE_INFORMATION
;
306 _In_
struct _BL_FILE_ENTRY
* Directory
,
307 _In_ PWCHAR FileName
,
309 _Out_
struct _BL_FILE_ENTRY
** FileEntry
315 _In_
struct _BL_FILE_ENTRY
* FileEntry
321 _In_
struct _BL_FILE_ENTRY
* FileEntry
,
324 _Out_ PULONG BytesRead
335 (*PBL_FILE_GET_NEXT
) (
341 (*PBL_FILE_GET_INFO
) (
342 _In_
struct _BL_FILE_ENTRY
* FileEntry
,
343 _Out_
struct _BL_FILE_INFORMATION
* FileInfo
348 (*PBL_FILE_SET_INFO
) (
349 _In_
struct _BL_FILE_ENTRY
* FileEntry
,
350 _In_
struct _BL_FILE_INFORMATION
* FileInfo
355 (*PBL_FS_INIT_CALLBACK
) (
361 (*PBL_FS_DESTROY_CALLBACK
) (
367 (*PBL_FS_MOUNT_CALLBACK
) (
370 _Out_
struct _BL_FILE_ENTRY
** FileEntry
375 (*PBL_FS_PURGE_CALLBACK
) (
381 (*PBL_FILE_DESTROY_CALLBACK
) (
385 struct _BL_TEXT_CONSOLE
;
386 struct _BL_DISPLAY_STATE
;
389 (*PCONSOLE_DESTRUCT
) (
390 _In_
struct _BL_TEXT_CONSOLE
* Console
395 (*PCONSOLE_REINITIALIZE
) (
396 _In_
struct _BL_TEXT_CONSOLE
* Console
401 (*PCONSOLE_GET_TEXT_STATE
) (
402 _In_
struct _BL_TEXT_CONSOLE
* Console
,
403 _Out_
struct _BL_DISPLAY_STATE
* TextState
408 (*PCONSOLE_SET_TEXT_STATE
) (
409 _In_
struct _BL_TEXT_CONSOLE
* Console
,
411 _In_
struct _BL_DISPLAY_STATE
* TextState
416 (*PCONSOLE_GET_TEXT_RESOLUTION
) (
417 _In_
struct _BL_TEXT_CONSOLE
* Console
,
418 _Out_ PULONG TextResolution
423 (*PCONSOLE_SET_TEXT_RESOLUTION
) (
424 _In_
struct _BL_TEXT_CONSOLE
* Console
,
425 _In_ ULONG NewTextResolution
,
426 _Out_ PULONG OldTextResolution
431 (*PCONSOLE_CLEAR_TEXT
) (
432 _In_
struct _BL_TEXT_CONSOLE
* Console
,
438 (*PCONSOLE_WRITE_TEXT
) (
439 _In_
struct _BL_TEXT_CONSOLE
* Console
,
446 (*PBL_TBL_LOOKUP_ROUTINE
) (
448 _In_ PVOID Argument1
,
449 _In_ PVOID Argument2
,
450 _In_ PVOID Argument3
,
456 (*PBL_TBL_MAP_ROUTINE
) (
458 _In_ ULONG EntryIndex
463 (*PBL_TBL_SET_ROUTINE
) (
469 (*PBL_IO_DESTROY_ROUTINE
) (
473 struct _BL_HASH_ENTRY
;
476 (*PBL_HASH_TABLE_COMPARE_FUNCTION
) (
477 _In_
struct _BL_HASH_ENTRY
* Entry1
,
478 _In_
struct _BL_HASH_ENTRY
* Entry2
483 (*PBL_HASH_TABLE_HASH_FUNCTION
) (
484 _In_
struct _BL_HASH_ENTRY
* Entry
,
488 struct _BL_DEVICE_ENTRY
;
489 struct _BL_DEVICE_DESCRIPTOR
;
490 struct _BL_DEVICE_INFORMATION
;
494 (*PBL_DEVICE_ENUMERATE_DEVICE_CLASS
) (
501 _In_
struct _BL_DEVICE_DESCRIPTOR
* Device
,
502 _In_
struct _BL_DEVICE_ENTRY
* DeviceEntry
507 (*PBL_DEVICE_CLOSE
) (
508 _In_
struct _BL_DEVICE_ENTRY
* DeviceEntry
514 _In_
struct _BL_DEVICE_ENTRY
* DeviceEntry
,
517 _Out_ PULONG BytesRead
522 (*PBL_DEVICE_WRITE
) (
528 (*PBL_DEVICE_GET_INFORMATION
) (
529 _In_
struct _BL_DEVICE_ENTRY
* DeviceEntry
,
530 _Out_
struct _BL_DEVICE_INFORMATION
* DeviceInformation
535 (*PBL_DEVICE_SET_INFORMATION
) (
536 _In_
struct _BL_DEVICE_ENTRY
* DeviceEntry
,
537 _In_
struct _BL_DEVICE_INFORMATION
* DeviceInformation
542 (*PBL_DEVICE_RESET
) (
548 (*PBL_DEVICE_FLUSH
) (
554 (*PBL_DEVICE_CREATE
) (
559 /* DATA STRUCTURES ***********************************************************/
561 typedef struct _BL_LIBRARY_PARAMETERS
564 ULONG TranslationType
;
565 ULONG MinimumAllocationCount
;
566 ULONG MinimumHeapSize
;
567 ULONG HeapAllocationAttributes
;
568 PWCHAR ApplicationBaseDirectory
;
569 ULONG DescriptorCount
;
570 PWCHAR FontBaseDirectory
;
571 } BL_LIBRARY_PARAMETERS
, *PBL_LIBRARY_PARAMETERS
;
573 /* This should eventually go into a more public header */
574 typedef struct _BOOT_APPLICATION_PARAMETER_BLOCK
576 /* This header tells the library what image we're dealing with */
581 ULONG MemoryTranslationType
;
583 /* Where is the image located */
587 /* Offset to BL_MEMORY_DATA */
588 ULONG MemoryDataOffset
;
590 /* Offset to BL_APPLICATION_ENTRY */
591 ULONG AppEntryOffset
;
593 /* Offset to BL_DEVICE_DESCRPIPTOR */
594 ULONG BootDeviceOffset
;
596 /* Offset to BL_FIRMWARE_PARAMETERS */
597 ULONG FirmwareParametersOffset
;
599 /* Offset to BL_RETURN_ARGUMENTS */
600 ULONG ReturnArgumentsOffset
;
601 } BOOT_APPLICATION_PARAMETER_BLOCK
, *PBOOT_APPLICATION_PARAMETER_BLOCK
;
603 typedef struct _BL_MEMORY_DATA
607 ULONG DescriptorCount
;
608 ULONG DescriptorSize
;
609 ULONG DescriptorOffset
;
610 } BL_MEMORY_DATA
, *PBL_MEMORY_DATA
;
612 typedef struct _BL_FIRMWARE_DESCRIPTOR
616 EFI_HANDLE ImageHandle
;
617 EFI_SYSTEM_TABLE
*SystemTable
;
618 } BL_FIRMWARE_DESCRIPTOR
, *PBL_FIRMWARE_DESCRIPTOR
;
620 typedef struct _BL_RETURN_ARGUMENTS
624 ULONG ReturnArgumentData
[5];
625 } BL_RETURN_ARGUMENTS
, *PBL_RETURN_ARGUMENTS
;
627 typedef struct _BL_MEMORY_DESCRIPTOR
629 LIST_ENTRY ListEntry
;
635 ULONGLONG VirtualPage
;
639 ULONGLONG BaseAddress
;
640 ULONGLONG VirtualAddress
;
646 } BL_MEMORY_DESCRIPTOR
, *PBL_MEMORY_DESCRIPTOR
;
648 typedef struct _BL_BCD_OPTION
654 ULONG NextEntryOffset
;
656 } BL_BCD_OPTION
, *PBL_BCD_OPTION
;
658 typedef struct _BL_APPLICATION_ENTRY
664 BL_BCD_OPTION BcdData
;
665 } BL_APPLICATION_ENTRY
, *PBL_APPLICATION_ENTRY
;
667 typedef struct _BL_LOADED_APPLICATION_ENTRY
671 PBL_BCD_OPTION BcdData
;
672 } BL_LOADED_APPLICATION_ENTRY
, *PBL_LOADED_APPLICATION_ENTRY
;
674 typedef struct _BL_HARDDISK_DEVICE
681 ULONG PartitionSignature
;
686 GUID PartitionSignature
;
694 } BL_HARDDISK_DEVICE
;
696 typedef struct _BL_LOCAL_DEVICE
706 BL_HARDDISK_DEVICE HardDisk
;
710 PHYSICAL_ADDRESS ImageBase
;
711 LARGE_INTEGER ImageSize
;
717 typedef struct _BL_DEVICE_DESCRIPTOR
721 DEVICE_TYPE DeviceType
;
725 BL_LOCAL_DEVICE Local
;
736 ULONG PartitionNumber
;
744 BL_LOCAL_DEVICE Disk
;
747 } BL_DEVICE_DESCRIPTOR
, *PBL_DEVICE_DESCRIPTOR
;
749 typedef struct _BL_FILE_PATH_DESCRIPTOR
754 UCHAR Path
[ANYSIZE_ARRAY
];
755 } BL_FILE_PATH_DESCRIPTOR
, *PBL_FILE_PATH_DESCRIPTOR
;
757 typedef struct _BL_WINDOWS_LOAD_OPTIONS
763 WCHAR LoadOptions
[ANYSIZE_ARRAY
];
764 } BL_WINDOWS_LOAD_OPTIONS
, *PBL_WINDOWS_LOAD_OPTIONS
;
766 typedef struct _BL_ARCH_CONTEXT
769 BL_TRANSLATION_TYPE TranslationType
;
771 } BL_ARCH_CONTEXT
, *PBL_ARCH_CONTEXT
;
773 typedef struct _BL_MEMORY_DESCRIPTOR_LIST
779 } BL_MEMORY_DESCRIPTOR_LIST
, *PBL_MEMORY_DESCRIPTOR_LIST
;
781 typedef struct _BL_ADDRESS_RANGE
785 } BL_ADDRESS_RANGE
, *PBL_ADDRESS_RANGE
;
787 typedef struct _BL_FILE_INFORMATION
790 ULONGLONG CurrentOffset
;
791 } BL_FILE_INFORMATION
, *PBL_FILE_INFORMATION
;
793 typedef struct _BL_FILE_CALLBACKS
796 PBL_FILE_CLOSE Close
;
798 PBL_FILE_WRITE Write
;
799 PBL_FILE_GET_NEXT GetNext
;
800 PBL_FILE_GET_INFO GetInfo
;
801 PBL_FILE_SET_INFO SetInfo
;
802 } BL_FILE_CALLBACKS
, *PBL_FILE_CALLBACKS
;
804 typedef struct _BL_FILE_ENTRY
810 ULONG ReferenceCount
;
814 BL_FILE_CALLBACKS Callbacks
;
815 PVOID FsSpecificData
;
816 } BL_FILE_ENTRY
, *PBL_FILE_ENTRY
;
818 typedef struct _BL_FILE_SYSTEM_ENTRY
820 LIST_ENTRY ListEntry
;
821 PBL_FS_INIT_CALLBACK InitCallback
;
822 PBL_FS_DESTROY_CALLBACK DestroyCallback
;
823 PBL_FS_MOUNT_CALLBACK MountCallback
;
824 PBL_FS_PURGE_CALLBACK PurgeCallback
;
825 } BL_FILE_SYSTEM_ENTRY
, *PBL_FILE_SYSTEM_ENTRY
;
827 typedef struct _BL_FILE_SYSTEM_REGISTRATION_TABLE
829 PBL_FS_INIT_CALLBACK Init
;
830 PBL_FS_DESTROY_CALLBACK Destroy
;
831 PBL_FS_MOUNT_CALLBACK Mount
;
832 PBL_FS_PURGE_CALLBACK Purge
;
833 } BL_FILE_SYSTEM_REGISTRATION_TABLE
;
835 typedef struct _BL_DISPLAY_STATE
842 } BL_DISPLAY_STATE
, *PBL_DISPLAY_STATE
;
844 typedef struct _BL_DISPLAY_MODE
849 } BL_DISPLAY_MODE
, *PBL_DISPLAY_MODE
;
851 typedef struct _BL_TEXT_CONSOLE_VTABLE
853 PCONSOLE_DESTRUCT Destruct
;
854 PCONSOLE_REINITIALIZE Reinitialize
;
855 PCONSOLE_GET_TEXT_STATE GetTextState
;
856 PCONSOLE_SET_TEXT_STATE SetTextState
;
857 PCONSOLE_GET_TEXT_RESOLUTION GetTextResolution
;
858 PCONSOLE_SET_TEXT_RESOLUTION SetTextResolution
;
859 PCONSOLE_CLEAR_TEXT ClearText
;
860 PCONSOLE_WRITE_TEXT WriteText
;
861 } BL_TEXT_CONSOLE_VTABLE
, *PBL_TEXT_CONSOLE_VTABLE
;
863 typedef struct _BL_GRAPHICS_CONSOLE_VTABLE
865 BL_TEXT_CONSOLE_VTABLE Text
;
866 /// more for graphics ///
867 } BL_GRAPHICS_CONSOLE_VTABLE
, *PBL_GRAPHICS_CONSOLE_VTABLE
;
869 typedef struct _BL_TEXT_CONSOLE
871 PBL_TEXT_CONSOLE_VTABLE Callbacks
;
872 BL_DISPLAY_STATE State
;
873 BL_DISPLAY_MODE DisplayMode
;
875 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
* Protocol
;
877 EFI_SIMPLE_TEXT_OUTPUT_MODE OldMode
;
878 } BL_TEXT_CONSOLE
, *PBL_TEXT_CONSOLE
;
880 typedef enum _BL_GRAPHICS_CONSOLE_TYPE
884 } BL_GRAPHICS_CONSOLE_TYPE
;
886 typedef struct _BL_GRAPHICS_CONSOLE
888 BL_TEXT_CONSOLE TextConsole
;
889 BL_DISPLAY_MODE DisplayMode
;
893 BL_DISPLAY_MODE OldDisplayMode
;
896 BL_GRAPHICS_CONSOLE_TYPE Type
;
897 EFI_GRAPHICS_OUTPUT_PROTOCOL
* Protocol
;
899 ULONG FrameBufferSize
;
900 ULONG PixelsPerScanLine
;
903 } BL_GRAPHICS_CONSOLE
, *PBL_GRAPHICS_CONSOLE
;
905 typedef struct _BL_REMOTE_CONSOLE
907 BL_TEXT_CONSOLE TextConsole
;
908 } BL_REMOTE_CONSOLE
, *PBL_REMOTE_CONSOLE
;
910 typedef struct _BL_HASH_TABLE
912 PLIST_ENTRY HashLinks
;
914 PBL_HASH_TABLE_COMPARE_FUNCTION CompareFunction
;
915 PBL_HASH_TABLE_HASH_FUNCTION HashFunction
;
916 } BL_HASH_TABLE
, *PBL_HASH_TABLE
;
918 typedef struct _BL_HASH_ENTRY
923 } BL_HASH_ENTRY
, *PBL_HASH_ENTRY
;
925 typedef struct _BL_HASH_VALUE
929 } BL_HASH_VALUE
, *PBL_HASH_VALUE
;
931 typedef struct _BL_HASH_NODE
933 LIST_ENTRY ListEntry
;
936 } BL_HASH_NODE
, *PBL_HASH_NODE
;
938 typedef struct _BL_BLOCK_DEVICE_INFORMATION
940 BL_LOCAL_DEVICE_TYPE Type
;
943 BL_PARTITION_TYPE PartitionType
;
963 } BL_BLOCK_DEVICE_INFORMATION
, *PBL_BLOCK_DEVICE_INFORMATION
;
965 typedef struct _BL_DEVICE_INFORMATION
967 BL_DEVICE_TYPE DeviceType
;
970 BL_BLOCK_DEVICE_INFORMATION BlockDeviceInfo
;
972 } BL_DEVICE_INFORMATION
, *PBL_DEVICE_INFORMATION
;
974 typedef struct _BL_BLOCK_DEVICE
976 BL_BLOCK_DEVICE_INFORMATION
;
977 ULONGLONG StartOffset
;
978 EFI_BLOCK_IO
* Protocol
;
980 } BL_BLOCK_DEVICE
, *PBL_BLOCK_DEVICE
;
982 typedef struct _BL_PROTOCOL_HANDLE
986 } BL_PROTOCOL_HANDLE
, *PBL_PROTOCOL_HANDLE
;
988 typedef struct _BL_DEVICE_CALLBACKS
990 PBL_DEVICE_ENUMERATE_DEVICE_CLASS EnumerateDeviceClass
;
991 PBL_DEVICE_OPEN Open
;
992 PBL_DEVICE_CLOSE Close
;
993 PBL_DEVICE_READ Read
;
994 PBL_DEVICE_WRITE Write
;
995 PBL_DEVICE_GET_INFORMATION GetInformation
;
996 PBL_DEVICE_SET_INFORMATION SetInformation
;
997 PBL_DEVICE_RESET Reset
;
998 PBL_DEVICE_FLUSH Flush
;
999 PBL_DEVICE_CREATE Create
;
1000 } BL_DEVICE_CALLBACKS
, *PBL_DEVICE_CALLBACKS
;
1002 typedef struct _BL_DEVICE_ENTRY
1007 ULONG ReferenceCount
;
1008 BL_DEVICE_CALLBACKS Callbacks
;
1009 PVOID DeviceSpecificData
;
1010 PBL_DEVICE_DESCRIPTOR DeviceDescriptor
;
1011 } BL_DEVICE_ENTRY
, *PBL_DEVICE_ENTRY
;
1013 typedef struct _BL_IMG_FILE
1023 } BL_IMG_FILE
, *PBL_IMG_FILE
;
1025 /* INLINE ROUTINES ***********************************************************/
1029 BlSetupDefaultParameters (
1030 _Out_ PBL_LIBRARY_PARAMETERS LibraryParameters
1033 BL_LIBRARY_PARAMETERS DefaultParameters
=
1045 /* Copy the defaults */
1046 RtlCopyMemory(LibraryParameters
, &DefaultParameters
, sizeof(*LibraryParameters
));
1051 MmMdInitializeListHead (
1052 _In_ PBL_MEMORY_DESCRIPTOR_LIST List
1055 /* Initialize the list */
1056 InitializeListHead(&List
->ListHead
);
1057 List
->First
= &List
->ListHead
;
1061 /* INITIALIZATION ROUTINES ***************************************************/
1064 BlInitializeLibrary(
1065 _In_ PBOOT_APPLICATION_PARAMETER_BLOCK BootAppParameters
,
1066 _In_ PBL_LIBRARY_PARAMETERS LibraryParameters
1077 _In_ PBL_FIRMWARE_DESCRIPTOR FirmwareParameters
1082 _In_ PBL_MEMORY_DATA MemoryData
,
1083 _In_ BL_TRANSLATION_TYPE TranslationType
,
1084 _In_ PBL_LIBRARY_PARAMETERS LibraryParameters
1094 _In_ PBL_MEMORY_DATA MemoryData
,
1095 _In_ ULONG MinimumPages
1101 _In_ PBL_MEMORY_DATA MemoryData
,
1102 _In_ BL_TRANSLATION_TYPE TranslationType
,
1103 _In_ BL_TRANSLATION_TYPE LibraryTranslationType
1108 _In_ ULONG HeapSize
,
1109 _In_ ULONG HeapAttributes
1115 _In_ PBL_LIBRARY_PARAMETERS LibraryParameters
1119 BlpDeviceInitialize (
1134 BlpDisplayInitialize (
1148 /* FIRMWARE ROUTINES *********************************************************/
1160 _Inout_ EFI_PHYSICAL_ADDRESS
* Memory
1165 _In_ ULONG StallTime
1169 EfiConOutQueryMode (
1170 _In_ SIMPLE_TEXT_OUTPUT_INTERFACE
*TextInterface
,
1172 _In_ UINTN
* Columns
,
1178 _In_ SIMPLE_TEXT_OUTPUT_INTERFACE
*TextInterface
,
1183 EfiConOutReadCurrentMode (
1184 _In_ SIMPLE_TEXT_OUTPUT_INTERFACE
*TextInterface
,
1185 _Out_ EFI_SIMPLE_TEXT_OUTPUT_MODE
* Mode
1189 EfiConOutSetAttribute (
1190 _In_ SIMPLE_TEXT_OUTPUT_INTERFACE
*TextInterface
,
1191 _In_ ULONG Attribute
1195 EfiConOutSetCursorPosition (
1196 _In_ SIMPLE_TEXT_OUTPUT_INTERFACE
*TextInterface
,
1202 EfiConOutEnableCursor (
1203 _In_ SIMPLE_TEXT_OUTPUT_INTERFACE
*TextInterface
,
1204 _In_ BOOLEAN Visible
1208 EfiLocateHandleBuffer (
1209 _In_ EFI_LOCATE_SEARCH_TYPE SearchType
,
1210 _In_ EFI_GUID
*Protocol
,
1211 _Inout_ PULONG HandleCount
,
1212 _Inout_ EFI_HANDLE
** Buffer
1217 _In_ EFI_HANDLE Handle
,
1218 _In_ EFI_GUID
*Protocol
,
1219 _Out_ PVOID
* Interface
1224 _In_ EFI_HANDLE Handle
,
1225 _In_ EFI_GUID
*Protocol
1229 EfiGopGetCurrentMode (
1230 _In_ EFI_GRAPHICS_OUTPUT_PROTOCOL
*GopInterface
,
1232 _Out_ EFI_GRAPHICS_OUTPUT_MODE_INFORMATION
*Information
1237 _In_ EFI_GRAPHICS_OUTPUT_PROTOCOL
*GopInterface
,
1242 EfiGopGetFrameBuffer (
1243 _In_ EFI_GRAPHICS_OUTPUT_PROTOCOL
*GopInterface
,
1244 _Out_ PHYSICAL_ADDRESS
* FrameBuffer
,
1245 _Out_ UINTN
*FrameBufferSize
1250 _In_ EFI_RESET_TYPE ResetType
1255 _In_ EFI_DEVICE_PATH
*DevicePath
1259 EfiIsDevicePathParent (
1260 _In_ EFI_DEVICE_PATH
*DevicePath1
,
1261 _In_ EFI_DEVICE_PATH
*DevicePath2
1264 /* PLATFORM TIMER ROUTINES ***************************************************/
1267 BlpTimeCalibratePerformanceCounter (
1271 /* FILESYSTEM ROUTINES *******************************************************/
1280 _In_ ULONG DeviceId
,
1282 _Out_ PBL_FILE_ENTRY
* FileEntry
1292 _In_ ULONG DeviceId
,
1294 _Out_ PBL_FILE_ENTRY
* FileEntry
1297 /* DEBUG ROUTINES ************************************************************/
1301 BlBdDebuggerEnabled (
1306 BlBdPullRemoteFile (
1307 _In_ PWCHAR FilePath
,
1308 _Out_ PVOID BaseAddress
,
1309 _Out_ PULONGLONG FileSize
1320 _In_ ULONG ErrorCode
,
1321 _In_ ULONG Parameter1
,
1322 _In_ ULONG_PTR Parameter2
,
1323 _In_ ULONG_PTR Parameter3
,
1324 _In_ ULONG_PTR Parameter4
1327 /* UTILITY ROUTINES **********************************************************/
1330 BlUtlUpdateProgress (
1331 _In_ ULONG Percentage
,
1332 _Out_opt_ PBOOLEAN Completed
1336 EfiGetEfiStatusCode(
1337 _In_ NTSTATUS Status
1341 EfiGetNtStatusCode (
1342 _In_ EFI_STATUS EfiStatus
1356 BlGetApplicationIdentifier (
1361 BlResourceFindMessage (
1365 /* TABLE ROUTINES ************************************************************/
1371 _In_ PBL_TBL_MAP_ROUTINE MapCallback
1378 _Out_ PULONG EntryIndex
,
1379 _In_ PBL_TBL_LOOKUP_ROUTINE Callback
,
1380 _In_ PVOID Argument1
,
1381 _In_ PVOID Argument2
,
1382 _In_ PVOID Argument3
,
1383 _In_ PVOID Argument4
1388 _Inout_ PVOID
** Table
,
1389 _Inout_ PULONG Count
,
1391 _Out_ PULONG EntryIndex
,
1392 _In_ PBL_TBL_SET_ROUTINE Callback
1396 TblDoNotPurgeEntry (
1400 /* HASH TABLE ROUTINES *******************************************************/
1405 _In_ PBL_HASH_ENTRY Entry
,
1413 _In_ PBL_HASH_ENTRY Entry
,
1414 _Out_ PBL_HASH_VALUE
*Value
1420 _In_ PBL_HASH_TABLE_HASH_FUNCTION HashFunction
,
1421 _In_ PBL_HASH_TABLE_COMPARE_FUNCTION CompareFunction
,
1425 /* BCD ROUTINES **************************************************************/
1428 BlGetBootOptionSize (
1429 _In_ PBL_BCD_OPTION BcdOption
1433 BlGetBootOptionString (
1434 _In_ PBL_BCD_OPTION List
,
1440 BlGetBootOptionInteger (
1441 _In_ PBL_BCD_OPTION List
,
1443 _Out_ PULONGLONG Value
1447 BlGetBootOptionBoolean (
1448 _In_ PBL_BCD_OPTION List
,
1450 _Out_ PBOOLEAN Value
1454 BlGetBootOptionDevice (
1455 _In_ PBL_BCD_OPTION List
,
1457 _Out_ PBL_DEVICE_DESCRIPTOR
* Value
,
1458 _In_opt_ PBL_BCD_OPTION
* ExtraOptions
1461 /* CONTEXT ROUTINES **********************************************************/
1464 BlpArchSwitchContext (
1465 _In_ BL_ARCH_MODE NewMode
1468 /* MEMORY DESCRIPTOR ROUTINES ************************************************/
1472 _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList
1475 PBL_MEMORY_DESCRIPTOR
1476 MmMdInitByteGranularDescriptor (
1478 _In_ BL_MEMORY_TYPE Type
,
1479 _In_ ULONGLONG BasePage
,
1480 _In_ ULONGLONG VirtualPage
,
1481 _In_ ULONGLONG PageCount
1485 MmMdFreeGlobalDescriptors (
1490 MmMdAddDescriptorToList (
1491 _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList
,
1492 _In_ PBL_MEMORY_DESCRIPTOR MemoryDescriptor
,
1497 MmMdRemoveDescriptorFromList (
1498 _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList
,
1499 _In_ PBL_MEMORY_DESCRIPTOR Entry
1503 MmMdFindSatisfyingRegion (
1504 _In_ PBL_MEMORY_DESCRIPTOR Descriptor
,
1505 _Out_ PBL_MEMORY_DESCRIPTOR NewDescriptor
,
1506 _In_ ULONGLONG Pages
,
1507 _In_ PBL_ADDRESS_RANGE BaseRange
,
1508 _In_ PBL_ADDRESS_RANGE VirtualRange
,
1509 _In_ BOOLEAN TopDown
,
1510 _In_ BL_MEMORY_TYPE MemoryType
,
1512 _In_ ULONG Alignment
1516 MmMdRemoveRegionFromMdlEx (
1517 __in PBL_MEMORY_DESCRIPTOR_LIST MdList
,
1519 __in ULONGLONG BasePage
,
1520 __in ULONGLONG PageCount
,
1521 __in PBL_MEMORY_DESCRIPTOR_LIST NewMdList
1525 MmMdFreeDescriptor (
1526 _In_ PBL_MEMORY_DESCRIPTOR MemoryDescriptor
1529 /* PAGE ALLOCATOR ROUTINES ***************************************************/
1532 BlMmAllocatePhysicalPages(
1533 _Inout_ PPHYSICAL_ADDRESS Address
,
1534 _In_ BL_MEMORY_TYPE MemoryType
,
1535 _In_ ULONGLONG PageCount
,
1536 _In_ ULONG Attributes
,
1537 _In_ ULONG Alignment
1541 BlMmFreePhysicalPages (
1542 _In_ PHYSICAL_ADDRESS Address
1546 MmPapAllocatePagesInRange (
1547 _Inout_ PVOID
* PhysicalAddress
,
1548 _In_ BL_MEMORY_TYPE MemoryType
,
1549 _In_ ULONGLONG Pages
,
1550 _In_ ULONG Attributes
,
1551 _In_ ULONG Alignment
,
1552 _In_opt_ PBL_ADDRESS_RANGE Range
,
1558 _Out_ PBL_MEMORY_DESCRIPTOR_LIST MemoryMap
,
1562 /* VIRTUAL MEMORY ROUTINES ***************************************************/
1565 BlMmMapPhysicalAddressEx (
1566 _In_ PVOID
* VirtualAddress
,
1567 _In_ ULONG Attributes
,
1568 _In_ ULONGLONG Size
,
1569 _In_ PHYSICAL_ADDRESS PhysicalAddress
1573 BlMmUnmapVirtualAddressEx (
1574 _In_ PVOID VirtualAddress
,
1578 /* BLOCK ALLOCATOR ROUTINES **************************************************/
1581 BlpMmCreateBlockAllocator (
1585 /* HEAP ALLOCATOR ROUTINES ***************************************************/
1597 /* DISPLAY ROUTINES **********************************************************/
1600 BlDisplayGetTextCellResolution (
1601 _Out_ PULONG TextWidth
,
1602 _Out_ PULONG TextHeight
1605 /* I/O ROUTINES **************************************************************/
1608 BlpIoRegisterDestroyRoutine (
1609 _In_ PBL_IO_DESTROY_ROUTINE DestroyRoutine
1619 _In_ PBL_DEVICE_DESCRIPTOR Device
,
1622 _Out_ PULONG DeviceId
1626 BlDeviceGetInformation (
1627 _In_ ULONG DeviceId
,
1628 _Out_ PBL_DEVICE_INFORMATION DeviceInformation
1632 BlDeviceSetInformation (
1633 _In_ ULONG DeviceId
,
1634 _In_ PBL_DEVICE_INFORMATION DeviceInformation
1638 BlDeviceReadAtOffset (
1639 _In_ ULONG DeviceId
,
1641 _In_ ULONGLONG Offset
,
1643 _Out_ PULONG BytesRead
1646 /* IMAGE ROUTINES ************************************************************/
1649 BlImgLoadImageWithProgress2 (
1650 _In_ ULONG DeviceId
,
1651 _In_ BL_MEMORY_TYPE MemoryType
,
1652 _In_ PWCHAR FileName
,
1653 _Inout_ PVOID
* MappedBase
,
1654 _Inout_ PULONG MappedSize
,
1655 _In_ ULONG ImageFlags
,
1656 _In_ BOOLEAN ShowProgress
,
1657 _Out_opt_ PUCHAR
* HashBuffer
,
1658 _Out_opt_ PULONG HashSize
1661 /* FILE I/O ROUTINES *********************************************************/
1669 BlFileReadAtOffsetEx (
1672 _In_ ULONGLONG ByteOffset
,
1674 _Out_ PULONG BytesReturned
,
1679 BlFileGetInformation (
1681 _In_ PBL_FILE_INFORMATION FileInfo
1686 _In_ ULONG DeviceId
,
1687 _In_ PWCHAR FileName
,
1692 /* TEXT CONSOLE ROUTINES *****************************************************/
1695 ConsoleTextLocalDestruct (
1696 _In_
struct _BL_TEXT_CONSOLE
* Console
1700 ConsoleTextLocalReinitialize (
1701 _In_
struct _BL_TEXT_CONSOLE
* Console
1705 ConsoleTextBaseGetTextState (
1706 _In_
struct _BL_TEXT_CONSOLE
* Console
,
1707 _Out_ PBL_DISPLAY_STATE TextState
1711 ConsoleTextLocalSetTextState (
1712 _In_
struct _BL_TEXT_CONSOLE
* Console
,
1714 _In_ PBL_DISPLAY_STATE TextState
1718 ConsoleTextBaseGetTextResolution (
1719 _In_
struct _BL_TEXT_CONSOLE
* Console
,
1720 _Out_ PULONG TextResolution
1724 ConsoleTextLocalSetTextResolution (
1725 _In_
struct _BL_TEXT_CONSOLE
* Console
,
1726 _In_ ULONG NewTextResolution
,
1727 _Out_ PULONG OldTextResolution
1731 ConsoleTextLocalClearText (
1732 _In_
struct _BL_TEXT_CONSOLE
* Console
,
1733 _In_ ULONG Attribute
1737 ConsoleTextLocalWriteText (
1738 _In_
struct _BL_TEXT_CONSOLE
* Console
,
1740 _In_ ULONG Attribute
1744 ConsoleTextLocalConstruct (
1745 _In_ PBL_TEXT_CONSOLE TextConsole
,
1746 _In_ BOOLEAN Activate
1750 ConsolepFindResolution (
1751 _In_ PBL_DISPLAY_MODE Mode
,
1752 _In_ PBL_DISPLAY_MODE List
,
1757 ConsoleFirmwareTextClose (
1758 _In_ PBL_TEXT_CONSOLE TextConsole
1762 ConsoleFirmwareTextOpen (
1763 _In_ PBL_TEXT_CONSOLE TextConsole
1767 ConsoleFirmwareTextSetState (
1768 _In_ PBL_TEXT_CONSOLE TextConsole
,
1770 _In_ PBL_DISPLAY_STATE State
1774 ConsoleGraphicalConstruct (
1775 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
1779 ConsoleCreateRemoteConsole (
1780 _In_ PBL_TEXT_CONSOLE
* TextConsole
1784 ConsoleEfiGraphicalOpenProtocol (
1785 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
,
1786 _In_ BL_GRAPHICS_CONSOLE_TYPE Type
1790 ConsoleFirmwareGraphicalClose (
1791 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
1795 ConsoleFirmwareGraphicalEnable (
1796 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
1801 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
1805 ConsoleEfiUgaClose (
1806 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
1810 ConsoleEfiGopClose (
1811 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
1816 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
1820 ConsoleEfiGopEnable (
1821 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
1825 ConsoleEfiUgaSetResolution (
1826 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
,
1827 _In_ PBL_DISPLAY_MODE DisplayMode
,
1828 _In_ ULONG DisplayModeCount
1831 extern ULONG MmDescriptorCallTreeCount
;
1832 extern ULONG BlpApplicationFlags
;
1833 extern BL_LIBRARY_PARAMETERS BlpLibraryParameters
;
1834 extern BL_TRANSLATION_TYPE MmTranslationType
;
1835 extern PBL_ARCH_CONTEXT CurrentExecutionContext
;
1836 extern PBL_DEVICE_DESCRIPTOR BlpBootDevice
;
1837 extern BL_LOADED_APPLICATION_ENTRY BlpApplicationEntry
;
1838 extern SIMPLE_TEXT_OUTPUT_INTERFACE
*EfiConOut
;
1839 extern EFI_GUID EfiGraphicsOutputProtocol
;
1840 extern EFI_GUID EfiUgaDrawProtocol
;
1841 extern EFI_GUID EfiLoadedImageProtocol
;
1842 extern EFI_GUID EfiDevicePathProtocol
;
1843 extern EFI_GUID EfiBlockIoProtocol
;
1844 extern EFI_GUID EfiSimpleTextInputExProtocol
;
1845 extern ULONG ConsoleGraphicalResolutionListFlags
;
1846 extern BL_DISPLAY_MODE ConsoleGraphicalResolutionList
[];
1847 extern BL_DISPLAY_MODE ConsoleTextResolutionList
[];
1848 extern ULONG ConsoleGraphicalResolutionListSize
;
1849 extern PVOID DspRemoteInputConsole
;
1850 extern WCHAR BlScratchBuffer
[8192];