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_ENTRY_OPENED 0x01
98 #define BL_DEVICE_ENTRY_READ_ACCESS 0x02
99 #define BL_DEVICE_ENTRY_WRITE_ACCESS 0x04
101 #define BL_FILE_ENTRY_OPENED 0x01
102 #define BL_FILE_ENTRY_READ_ACCESS 0x02
103 #define BL_FILE_ENTRY_WRITE_ACCESS 0x04
104 #define BL_FILE_ENTRY_UNKNOWN_ACCESS 0x10
106 #define BL_IMG_VALID_FILE 0x01
107 #define BL_IMG_MEMORY_FILE 0x02
108 #define BL_IMG_REMOTE_FILE 0x04
110 #define BL_LOAD_IMG_VIRTUAL_BUFFER 0x01
111 #define BL_LOAD_IMG_EXISTING_BUFFER 0x04
112 #define BL_LOAD_IMG_UNKNOWN_BUFFER_FLAG 0x08
113 #define BL_LOAD_IMG_COMPUTE_SIGNATURE 0x10
114 #define BL_LOAD_IMG_COMPUTE_HASH 0x40000
116 /* ENUMERATIONS **************************************************************/
118 typedef enum _BL_COLOR
136 } BL_COLOR
, *PBL_COLOR
;
138 typedef enum _BL_MEMORY_DESCRIPTOR_TYPE
142 } BL_MEMORY_DESCRIPTOR_TYPE
;
144 typedef enum _BL_TRANSLATION_TYPE
150 } BL_TRANSLATION_TYPE
;
152 typedef enum _BL_ARCH_MODE
161 typedef enum _BL_DEVICE_TYPE
164 LegacyPartitionDevice
= 2,
173 // Local Device Types
175 typedef enum _BL_LOCAL_DEVICE_TYPE
182 VirtualDiskDevice
= 6
183 } BL_LOCAL_DEVICE_TYPE
;
188 typedef enum _BL_PARTITION_TYPE
198 typedef enum _BL_PATH_TYPE
207 typedef enum _BL_MEMORY_CLASS
217 typedef enum _BL_MEMORY_TYPE
222 BlLoaderMemory
= 0xD0000002,
223 BlLoaderDeviceMemory
= 0xD0000004,
224 BlLoaderHeap
= 0xD0000005,
225 BlLoaderPageDirectory
= 0xD0000006,
226 BlLoaderReferencePage
= 0xD0000007,
227 BlLoaderRamDisk
= 0xD0000008,
228 BlLoaderData
= 0xD000000A,
229 BlLoaderBlockMemory
= 0xD000000C,
230 BlLoaderSelfMap
= 0xD000000F,
233 // Application Memory
235 BlApplicationData
= 0xE0000004,
240 BlConventionalMemory
= 0xF0000001,
241 BlUnusableMemory
= 0xF0000002,
242 BlReservedMemory
= 0xF0000003,
243 BlEfiBootMemory
= 0xF0000004,
244 BlEfiRuntimeMemory
= 0xF0000006,
245 BlAcpiReclaimMemory
= 0xF0000008,
246 BlAcpiNvsMemory
= 0xF0000009,
247 BlDeviceIoMemory
= 0xF000000A,
248 BlDevicePortMemory
= 0xF000000B,
249 BlPalMemory
= 0xF000000C,
252 typedef enum _BL_MEMORY_ATTR
255 // Memory Caching Attributes
257 BlMemoryUncached
= 0x00000001,
258 BlMemoryWriteCombined
= 0x00000002,
259 BlMemoryWriteThrough
= 0x00000004,
260 BlMemoryWriteBack
= 0x00000008,
261 BlMemoryUncachedExported
= 0x00000010,
262 BlMemoryValidCacheAttributes
= BlMemoryUncached
| BlMemoryWriteCombined
| BlMemoryWriteThrough
| BlMemoryWriteBack
| BlMemoryUncachedExported
,
263 BlMemoryValidCacheAttributeMask
= 0x000000FF,
266 // Memory Protection Attributes
268 BlMemoryWriteProtected
= 0x00000100,
269 BlMemoryReadProtected
= 0x00000200,
270 BlMemoryExecuteProtected
= 0x00000400,
271 BlMemoryValidProtectionAttributes
= BlMemoryWriteProtected
| BlMemoryReadProtected
| BlMemoryExecuteProtected
,
272 BlMemoryValidProtectionAttributeMask
= 0x0000FF00,
275 // Memory Allocation Attributes
277 BlMemoryNonFixed
= 0x00020000,
278 BlMemoryFixed
= 0x00040000,
279 BlMemoryValidAllocationAttributes
= BlMemoryNonFixed
| BlMemoryFixed
,
280 BlMemoryValidAllocationAttributeMask
= 0x00FF0000,
283 // Memory Type Attributes
285 BlMemoryRuntime
= 0x01000000,
286 BlMemoryCoalesced
= 0x02000000,
287 BlMemoryUpdate
= 0x04000000,
288 BlMemoryNonFirmware
= 0x08000000,
289 BlMemorySpecial
= 0x20000000,
290 BlMemoryFirmware
= 0x80000000,
291 BlMemoryValidTypeAttributes
= BlMemoryRuntime
| BlMemoryCoalesced
| BlMemoryUpdate
| BlMemoryNonFirmware
| BlMemorySpecial
| BlMemoryFirmware
,
292 BlMemoryValidTypeAttributeMask
= 0xFF000000,
295 /* CALLBACKS *****************************************************************/
297 struct _BL_FILE_ENTRY
;
298 struct _BL_FILE_INFORMATION
;
302 _In_
struct _BL_FILE_ENTRY
* Directory
,
303 _In_ PWCHAR FileName
,
305 _Out_
struct _BL_FILE_ENTRY
** FileEntry
311 _In_
struct _BL_FILE_ENTRY
* FileEntry
317 _In_
struct _BL_FILE_ENTRY
* FileEntry
,
320 _Out_ PULONG BytesRead
331 (*PBL_FILE_GET_NEXT
) (
337 (*PBL_FILE_GET_INFO
) (
338 _In_
struct _BL_FILE_ENTRY
* FileEntry
,
339 _Out_
struct _BL_FILE_INFORMATION
* FileInfo
344 (*PBL_FILE_SET_INFO
) (
345 _In_
struct _BL_FILE_ENTRY
* FileEntry
,
346 _In_
struct _BL_FILE_INFORMATION
* FileInfo
351 (*PBL_FS_INIT_CALLBACK
) (
357 (*PBL_FS_DESTROY_CALLBACK
) (
363 (*PBL_FS_MOUNT_CALLBACK
) (
366 _Out_
struct _BL_FILE_ENTRY
** FileEntry
371 (*PBL_FS_PURGE_CALLBACK
) (
377 (*PBL_FILE_DESTROY_CALLBACK
) (
381 struct _BL_TEXT_CONSOLE
;
382 struct _BL_DISPLAY_STATE
;
385 (*PCONSOLE_DESTRUCT
) (
386 _In_
struct _BL_TEXT_CONSOLE
* Console
391 (*PCONSOLE_REINITIALIZE
) (
392 _In_
struct _BL_TEXT_CONSOLE
* Console
397 (*PCONSOLE_GET_TEXT_STATE
) (
398 _In_
struct _BL_TEXT_CONSOLE
* Console
,
399 _Out_
struct _BL_DISPLAY_STATE
* TextState
404 (*PCONSOLE_SET_TEXT_STATE
) (
405 _In_
struct _BL_TEXT_CONSOLE
* Console
,
407 _In_
struct _BL_DISPLAY_STATE
* TextState
412 (*PCONSOLE_GET_TEXT_RESOLUTION
) (
413 _In_
struct _BL_TEXT_CONSOLE
* Console
,
414 _Out_ PULONG TextResolution
419 (*PCONSOLE_SET_TEXT_RESOLUTION
) (
420 _In_
struct _BL_TEXT_CONSOLE
* Console
,
421 _In_ ULONG NewTextResolution
,
422 _Out_ PULONG OldTextResolution
427 (*PCONSOLE_CLEAR_TEXT
) (
428 _In_
struct _BL_TEXT_CONSOLE
* Console
,
434 (*PCONSOLE_WRITE_TEXT
) (
435 _In_
struct _BL_TEXT_CONSOLE
* Console
,
442 (*PBL_TBL_LOOKUP_ROUTINE
) (
444 _In_ PVOID Argument1
,
445 _In_ PVOID Argument2
,
446 _In_ PVOID Argument3
,
452 (*PBL_TBL_MAP_ROUTINE
) (
454 _In_ ULONG EntryIndex
459 (*PBL_TBL_SET_ROUTINE
) (
465 (*PBL_IO_DESTROY_ROUTINE
) (
469 struct _BL_HASH_ENTRY
;
472 (*PBL_HASH_TABLE_COMPARE_FUNCTION
) (
473 _In_
struct _BL_HASH_ENTRY
* Entry1
,
474 _In_
struct _BL_HASH_ENTRY
* Entry2
479 (*PBL_HASH_TABLE_HASH_FUNCTION
) (
480 _In_
struct _BL_HASH_ENTRY
* Entry
,
484 struct _BL_DEVICE_ENTRY
;
485 struct _BL_DEVICE_DESCRIPTOR
;
486 struct _BL_DEVICE_INFORMATION
;
490 (*PBL_DEVICE_ENUMERATE_DEVICE_CLASS
) (
497 _In_
struct _BL_DEVICE_DESCRIPTOR
* Device
,
498 _In_
struct _BL_DEVICE_ENTRY
* DeviceEntry
503 (*PBL_DEVICE_CLOSE
) (
504 _In_
struct _BL_DEVICE_ENTRY
* DeviceEntry
510 _In_
struct _BL_DEVICE_ENTRY
* DeviceEntry
,
513 _Out_ PULONG BytesRead
518 (*PBL_DEVICE_WRITE
) (
524 (*PBL_DEVICE_GET_INFORMATION
) (
525 _In_
struct _BL_DEVICE_ENTRY
* DeviceEntry
,
526 _Out_
struct _BL_DEVICE_INFORMATION
* DeviceInformation
531 (*PBL_DEVICE_SET_INFORMATION
) (
532 _In_
struct _BL_DEVICE_ENTRY
* DeviceEntry
,
533 _In_
struct _BL_DEVICE_INFORMATION
* DeviceInformation
538 (*PBL_DEVICE_RESET
) (
544 (*PBL_DEVICE_FLUSH
) (
550 (*PBL_DEVICE_CREATE
) (
555 /* DATA STRUCTURES ***********************************************************/
557 typedef struct _BL_LIBRARY_PARAMETERS
560 ULONG TranslationType
;
561 ULONG MinimumAllocationCount
;
562 ULONG MinimumHeapSize
;
563 ULONG HeapAllocationAttributes
;
564 PWCHAR ApplicationBaseDirectory
;
565 ULONG DescriptorCount
;
566 PWCHAR FontBaseDirectory
;
567 } BL_LIBRARY_PARAMETERS
, *PBL_LIBRARY_PARAMETERS
;
569 /* This should eventually go into a more public header */
570 typedef struct _BOOT_APPLICATION_PARAMETER_BLOCK
572 /* This header tells the library what image we're dealing with */
577 ULONG MemoryTranslationType
;
579 /* Where is the image located */
583 /* Offset to BL_MEMORY_DATA */
584 ULONG MemoryDataOffset
;
586 /* Offset to BL_APPLICATION_ENTRY */
587 ULONG AppEntryOffset
;
589 /* Offset to BL_DEVICE_DESCRPIPTOR */
590 ULONG BootDeviceOffset
;
592 /* Offset to BL_FIRMWARE_PARAMETERS */
593 ULONG FirmwareParametersOffset
;
595 /* Offset to BL_RETURN_ARGUMENTS */
596 ULONG ReturnArgumentsOffset
;
597 } BOOT_APPLICATION_PARAMETER_BLOCK
, *PBOOT_APPLICATION_PARAMETER_BLOCK
;
599 typedef struct _BL_MEMORY_DATA
603 ULONG DescriptorCount
;
604 ULONG DescriptorSize
;
605 ULONG DescriptorOffset
;
606 } BL_MEMORY_DATA
, *PBL_MEMORY_DATA
;
608 typedef struct _BL_FIRMWARE_DESCRIPTOR
612 EFI_HANDLE ImageHandle
;
613 EFI_SYSTEM_TABLE
*SystemTable
;
614 } BL_FIRMWARE_DESCRIPTOR
, *PBL_FIRMWARE_DESCRIPTOR
;
616 typedef struct _BL_RETURN_ARGUMENTS
620 ULONG ReturnArgumentData
[5];
621 } BL_RETURN_ARGUMENTS
, *PBL_RETURN_ARGUMENTS
;
623 typedef struct _BL_MEMORY_DESCRIPTOR
625 LIST_ENTRY ListEntry
;
631 ULONGLONG VirtualPage
;
635 ULONGLONG BaseAddress
;
636 ULONGLONG VirtualAddress
;
642 } BL_MEMORY_DESCRIPTOR
, *PBL_MEMORY_DESCRIPTOR
;
644 typedef struct _BL_BCD_OPTION
650 ULONG NextEntryOffset
;
652 } BL_BCD_OPTION
, *PBL_BCD_OPTION
;
654 typedef struct _BL_APPLICATION_ENTRY
660 BL_BCD_OPTION BcdData
;
661 } BL_APPLICATION_ENTRY
, *PBL_APPLICATION_ENTRY
;
663 typedef struct _BL_LOADED_APPLICATION_ENTRY
667 PBL_BCD_OPTION BcdData
;
668 } BL_LOADED_APPLICATION_ENTRY
, *PBL_LOADED_APPLICATION_ENTRY
;
670 typedef struct _BL_HARDDISK_DEVICE
677 ULONG PartitionSignature
;
682 GUID PartitionSignature
;
690 } BL_HARDDISK_DEVICE
;
692 typedef struct _BL_LOCAL_DEVICE
702 BL_HARDDISK_DEVICE HardDisk
;
706 PHYSICAL_ADDRESS ImageBase
;
707 LARGE_INTEGER ImageSize
;
713 typedef struct _BL_DEVICE_DESCRIPTOR
717 DEVICE_TYPE DeviceType
;
721 BL_LOCAL_DEVICE Local
;
732 ULONG PartitionNumber
;
740 BL_LOCAL_DEVICE Disk
;
743 } BL_DEVICE_DESCRIPTOR
, *PBL_DEVICE_DESCRIPTOR
;
745 typedef struct _BL_FILE_PATH_DESCRIPTOR
750 UCHAR Path
[ANYSIZE_ARRAY
];
751 } BL_FILE_PATH_DESCRIPTOR
, *PBL_FILE_PATH_DESCRIPTOR
;
753 typedef struct _BL_WINDOWS_LOAD_OPTIONS
759 WCHAR LoadOptions
[ANYSIZE_ARRAY
];
760 } BL_WINDOWS_LOAD_OPTIONS
, *PBL_WINDOWS_LOAD_OPTIONS
;
762 typedef struct _BL_ARCH_CONTEXT
765 BL_TRANSLATION_TYPE TranslationType
;
767 } BL_ARCH_CONTEXT
, *PBL_ARCH_CONTEXT
;
769 typedef struct _BL_MEMORY_DESCRIPTOR_LIST
775 } BL_MEMORY_DESCRIPTOR_LIST
, *PBL_MEMORY_DESCRIPTOR_LIST
;
777 typedef struct _BL_ADDRESS_RANGE
781 } BL_ADDRESS_RANGE
, *PBL_ADDRESS_RANGE
;
783 typedef struct _BL_FILE_INFORMATION
786 ULONGLONG CurrentOffset
;
787 } BL_FILE_INFORMATION
, *PBL_FILE_INFORMATION
;
789 typedef struct _BL_FILE_CALLBACKS
792 PBL_FILE_CLOSE Close
;
794 PBL_FILE_WRITE Write
;
795 PBL_FILE_GET_NEXT GetNext
;
796 PBL_FILE_GET_INFO GetInfo
;
797 PBL_FILE_SET_INFO SetInfo
;
798 } BL_FILE_CALLBACKS
, *PBL_FILE_CALLBACKS
;
800 typedef struct _BL_FILE_ENTRY
806 ULONG ReferenceCount
;
810 BL_FILE_CALLBACKS Callbacks
;
811 PVOID FsSpecificData
;
812 } BL_FILE_ENTRY
, *PBL_FILE_ENTRY
;
814 typedef struct _BL_FILE_SYSTEM_ENTRY
816 LIST_ENTRY ListEntry
;
817 PBL_FS_INIT_CALLBACK InitCallback
;
818 PBL_FS_DESTROY_CALLBACK DestroyCallback
;
819 PBL_FS_MOUNT_CALLBACK MountCallback
;
820 PBL_FS_PURGE_CALLBACK PurgeCallback
;
821 } BL_FILE_SYSTEM_ENTRY
, *PBL_FILE_SYSTEM_ENTRY
;
823 typedef struct _BL_FILE_SYSTEM_REGISTRATION_TABLE
825 PBL_FS_INIT_CALLBACK Init
;
826 PBL_FS_DESTROY_CALLBACK Destroy
;
827 PBL_FS_MOUNT_CALLBACK Mount
;
828 PBL_FS_PURGE_CALLBACK Purge
;
829 } BL_FILE_SYSTEM_REGISTRATION_TABLE
;
831 typedef struct _BL_DISPLAY_STATE
838 } BL_DISPLAY_STATE
, *PBL_DISPLAY_STATE
;
840 typedef struct _BL_DISPLAY_MODE
845 } BL_DISPLAY_MODE
, *PBL_DISPLAY_MODE
;
847 typedef struct _BL_TEXT_CONSOLE_VTABLE
849 PCONSOLE_DESTRUCT Destruct
;
850 PCONSOLE_REINITIALIZE Reinitialize
;
851 PCONSOLE_GET_TEXT_STATE GetTextState
;
852 PCONSOLE_SET_TEXT_STATE SetTextState
;
853 PCONSOLE_GET_TEXT_RESOLUTION GetTextResolution
;
854 PCONSOLE_SET_TEXT_RESOLUTION SetTextResolution
;
855 PCONSOLE_CLEAR_TEXT ClearText
;
856 PCONSOLE_WRITE_TEXT WriteText
;
857 } BL_TEXT_CONSOLE_VTABLE
, *PBL_TEXT_CONSOLE_VTABLE
;
859 typedef struct _BL_GRAPHICS_CONSOLE_VTABLE
861 BL_TEXT_CONSOLE_VTABLE Text
;
862 /// more for graphics ///
863 } BL_GRAPHICS_CONSOLE_VTABLE
, *PBL_GRAPHICS_CONSOLE_VTABLE
;
865 typedef struct _BL_TEXT_CONSOLE
867 PBL_TEXT_CONSOLE_VTABLE Callbacks
;
868 BL_DISPLAY_STATE State
;
869 BL_DISPLAY_MODE DisplayMode
;
871 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
* Protocol
;
873 EFI_SIMPLE_TEXT_OUTPUT_MODE OldMode
;
874 } BL_TEXT_CONSOLE
, *PBL_TEXT_CONSOLE
;
876 typedef enum _BL_GRAPHICS_CONSOLE_TYPE
880 } BL_GRAPHICS_CONSOLE_TYPE
;
882 typedef struct _BL_GRAPHICS_CONSOLE
884 BL_TEXT_CONSOLE TextConsole
;
885 BL_DISPLAY_MODE DisplayMode
;
889 BL_DISPLAY_MODE OldDisplayMode
;
892 BL_GRAPHICS_CONSOLE_TYPE Type
;
893 EFI_GRAPHICS_OUTPUT_PROTOCOL
* Protocol
;
895 ULONG FrameBufferSize
;
896 ULONG PixelsPerScanLine
;
899 } BL_GRAPHICS_CONSOLE
, *PBL_GRAPHICS_CONSOLE
;
901 typedef struct _BL_REMOTE_CONSOLE
903 BL_TEXT_CONSOLE TextConsole
;
904 } BL_REMOTE_CONSOLE
, *PBL_REMOTE_CONSOLE
;
906 typedef struct _BL_HASH_TABLE
908 PLIST_ENTRY HashLinks
;
910 PBL_HASH_TABLE_COMPARE_FUNCTION CompareFunction
;
911 PBL_HASH_TABLE_HASH_FUNCTION HashFunction
;
912 } BL_HASH_TABLE
, *PBL_HASH_TABLE
;
914 typedef struct _BL_HASH_ENTRY
919 } BL_HASH_ENTRY
, *PBL_HASH_ENTRY
;
921 typedef struct _BL_HASH_VALUE
925 } BL_HASH_VALUE
, *PBL_HASH_VALUE
;
927 typedef struct _BL_HASH_NODE
929 LIST_ENTRY ListEntry
;
932 } BL_HASH_NODE
, *PBL_HASH_NODE
;
934 typedef struct _BL_BLOCK_DEVICE_INFORMATION
936 BL_LOCAL_DEVICE_TYPE Type
;
939 BL_PARTITION_TYPE PartitionType
;
959 } BL_BLOCK_DEVICE_INFORMATION
, *PBL_BLOCK_DEVICE_INFORMATION
;
961 typedef struct _BL_DEVICE_INFORMATION
963 BL_DEVICE_TYPE DeviceType
;
966 BL_BLOCK_DEVICE_INFORMATION BlockDeviceInfo
;
968 } BL_DEVICE_INFORMATION
, *PBL_DEVICE_INFORMATION
;
970 typedef struct _BL_BLOCK_DEVICE
972 BL_BLOCK_DEVICE_INFORMATION
;
973 ULONGLONG StartOffset
;
974 EFI_BLOCK_IO
* Protocol
;
976 } BL_BLOCK_DEVICE
, *PBL_BLOCK_DEVICE
;
978 typedef struct _BL_PROTOCOL_HANDLE
982 } BL_PROTOCOL_HANDLE
, *PBL_PROTOCOL_HANDLE
;
984 typedef struct _BL_DEVICE_CALLBACKS
986 PBL_DEVICE_ENUMERATE_DEVICE_CLASS EnumerateDeviceClass
;
987 PBL_DEVICE_OPEN Open
;
988 PBL_DEVICE_CLOSE Close
;
989 PBL_DEVICE_READ Read
;
990 PBL_DEVICE_WRITE Write
;
991 PBL_DEVICE_GET_INFORMATION GetInformation
;
992 PBL_DEVICE_SET_INFORMATION SetInformation
;
993 PBL_DEVICE_RESET Reset
;
994 PBL_DEVICE_FLUSH Flush
;
995 PBL_DEVICE_CREATE Create
;
996 } BL_DEVICE_CALLBACKS
, *PBL_DEVICE_CALLBACKS
;
998 typedef struct _BL_DEVICE_ENTRY
1003 ULONG ReferenceCount
;
1004 BL_DEVICE_CALLBACKS Callbacks
;
1005 PVOID DeviceSpecificData
;
1006 PBL_DEVICE_DESCRIPTOR DeviceDescriptor
;
1007 } BL_DEVICE_ENTRY
, *PBL_DEVICE_ENTRY
;
1009 typedef struct _BL_IMG_FILE
1019 } BL_IMG_FILE
, *PBL_IMG_FILE
;
1021 /* INLINE ROUTINES ***********************************************************/
1025 BlSetupDefaultParameters (
1026 _Out_ PBL_LIBRARY_PARAMETERS LibraryParameters
1029 BL_LIBRARY_PARAMETERS DefaultParameters
=
1041 /* Copy the defaults */
1042 RtlCopyMemory(LibraryParameters
, &DefaultParameters
, sizeof(*LibraryParameters
));
1047 MmMdInitializeListHead (
1048 _In_ PBL_MEMORY_DESCRIPTOR_LIST List
1051 /* Initialize the list */
1052 InitializeListHead(&List
->ListHead
);
1053 List
->First
= &List
->ListHead
;
1057 /* INITIALIZATION ROUTINES ***************************************************/
1060 BlInitializeLibrary(
1061 _In_ PBOOT_APPLICATION_PARAMETER_BLOCK BootAppParameters
,
1062 _In_ PBL_LIBRARY_PARAMETERS LibraryParameters
1073 _In_ PBL_FIRMWARE_DESCRIPTOR FirmwareParameters
1078 _In_ PBL_MEMORY_DATA MemoryData
,
1079 _In_ BL_TRANSLATION_TYPE TranslationType
,
1080 _In_ PBL_LIBRARY_PARAMETERS LibraryParameters
1090 _In_ PBL_MEMORY_DATA MemoryData
,
1091 _In_ ULONG MinimumPages
1097 _In_ PBL_MEMORY_DATA MemoryData
,
1098 _In_ BL_TRANSLATION_TYPE TranslationType
,
1099 _In_ BL_TRANSLATION_TYPE LibraryTranslationType
1104 _In_ ULONG HeapSize
,
1105 _In_ ULONG HeapAttributes
1111 _In_ PBL_LIBRARY_PARAMETERS LibraryParameters
1115 BlpDeviceInitialize (
1130 BlpDisplayInitialize (
1144 /* FIRMWARE ROUTINES *********************************************************/
1156 _Inout_ EFI_PHYSICAL_ADDRESS
* Memory
1161 _In_ ULONG StallTime
1165 EfiConOutQueryMode (
1166 _In_ SIMPLE_TEXT_OUTPUT_INTERFACE
*TextInterface
,
1168 _In_ UINTN
* Columns
,
1174 _In_ SIMPLE_TEXT_OUTPUT_INTERFACE
*TextInterface
,
1179 EfiConOutReadCurrentMode (
1180 _In_ SIMPLE_TEXT_OUTPUT_INTERFACE
*TextInterface
,
1181 _Out_ EFI_SIMPLE_TEXT_OUTPUT_MODE
* Mode
1185 EfiConOutSetAttribute (
1186 _In_ SIMPLE_TEXT_OUTPUT_INTERFACE
*TextInterface
,
1187 _In_ ULONG Attribute
1191 EfiConOutSetCursorPosition (
1192 _In_ SIMPLE_TEXT_OUTPUT_INTERFACE
*TextInterface
,
1198 EfiConOutEnableCursor (
1199 _In_ SIMPLE_TEXT_OUTPUT_INTERFACE
*TextInterface
,
1200 _In_ BOOLEAN Visible
1204 EfiLocateHandleBuffer (
1205 _In_ EFI_LOCATE_SEARCH_TYPE SearchType
,
1206 _In_ EFI_GUID
*Protocol
,
1207 _Inout_ PULONG HandleCount
,
1208 _Inout_ EFI_HANDLE
** Buffer
1213 _In_ EFI_HANDLE Handle
,
1214 _In_ EFI_GUID
*Protocol
,
1215 _Out_ PVOID
* Interface
1220 _In_ EFI_HANDLE Handle
,
1221 _In_ EFI_GUID
*Protocol
1225 EfiGopGetCurrentMode (
1226 _In_ EFI_GRAPHICS_OUTPUT_PROTOCOL
*GopInterface
,
1228 _Out_ EFI_GRAPHICS_OUTPUT_MODE_INFORMATION
*Information
1233 _In_ EFI_GRAPHICS_OUTPUT_PROTOCOL
*GopInterface
,
1238 EfiGopGetFrameBuffer (
1239 _In_ EFI_GRAPHICS_OUTPUT_PROTOCOL
*GopInterface
,
1240 _Out_ PHYSICAL_ADDRESS
* FrameBuffer
,
1241 _Out_ UINTN
*FrameBufferSize
1246 _In_ EFI_RESET_TYPE ResetType
1251 _In_ EFI_DEVICE_PATH
*DevicePath
1255 EfiIsDevicePathParent (
1256 _In_ EFI_DEVICE_PATH
*DevicePath1
,
1257 _In_ EFI_DEVICE_PATH
*DevicePath2
1260 /* PLATFORM TIMER ROUTINES ***************************************************/
1263 BlpTimeCalibratePerformanceCounter (
1267 /* FILESYSTEM ROUTINES *******************************************************/
1276 _In_ ULONG DeviceId
,
1278 _Out_ PBL_FILE_ENTRY
* FileEntry
1288 _In_ ULONG DeviceId
,
1290 _Out_ PBL_FILE_ENTRY
* FileEntry
1293 /* DEBUG ROUTINES ************************************************************/
1297 BlBdDebuggerEnabled (
1302 BlBdPullRemoteFile (
1303 _In_ PWCHAR FilePath
,
1304 _Out_ PVOID BaseAddress
,
1305 _Out_ PULONGLONG FileSize
1316 _In_ ULONG ErrorCode
,
1317 _In_ ULONG Parameter1
,
1318 _In_ ULONG_PTR Parameter2
,
1319 _In_ ULONG_PTR Parameter3
,
1320 _In_ ULONG_PTR Parameter4
1323 /* UTILITY ROUTINES **********************************************************/
1326 BlUtlUpdateProgress (
1327 _In_ ULONG Percentage
,
1328 _Out_opt_ PBOOLEAN Completed
1332 EfiGetEfiStatusCode(
1333 _In_ NTSTATUS Status
1337 EfiGetNtStatusCode (
1338 _In_ EFI_STATUS EfiStatus
1352 BlGetApplicationIdentifier (
1357 BlResourceFindMessage (
1361 /* TABLE ROUTINES ************************************************************/
1367 _In_ PBL_TBL_MAP_ROUTINE MapCallback
1374 _Out_ PULONG EntryIndex
,
1375 _In_ PBL_TBL_LOOKUP_ROUTINE Callback
,
1376 _In_ PVOID Argument1
,
1377 _In_ PVOID Argument2
,
1378 _In_ PVOID Argument3
,
1379 _In_ PVOID Argument4
1384 _Inout_ PVOID
** Table
,
1385 _Inout_ PULONG Count
,
1387 _Out_ PULONG EntryIndex
,
1388 _In_ PBL_TBL_SET_ROUTINE Callback
1392 TblDoNotPurgeEntry (
1396 /* HASH TABLE ROUTINES *******************************************************/
1401 _In_ PBL_HASH_ENTRY Entry
,
1409 _In_ PBL_HASH_ENTRY Entry
,
1410 _Out_ PBL_HASH_VALUE
*Value
1416 _In_ PBL_HASH_TABLE_HASH_FUNCTION HashFunction
,
1417 _In_ PBL_HASH_TABLE_COMPARE_FUNCTION CompareFunction
,
1421 /* BCD ROUTINES **************************************************************/
1424 BlGetBootOptionSize (
1425 _In_ PBL_BCD_OPTION BcdOption
1429 BlGetBootOptionString (
1430 _In_ PBL_BCD_OPTION List
,
1436 BlGetBootOptionInteger (
1437 _In_ PBL_BCD_OPTION List
,
1439 _Out_ PULONGLONG Value
1443 BlGetBootOptionBoolean (
1444 _In_ PBL_BCD_OPTION List
,
1446 _Out_ PBOOLEAN Value
1450 BlGetBootOptionDevice (
1451 _In_ PBL_BCD_OPTION List
,
1453 _Out_ PBL_DEVICE_DESCRIPTOR
* Value
,
1454 _In_opt_ PBL_BCD_OPTION
* ExtraOptions
1457 /* CONTEXT ROUTINES **********************************************************/
1460 BlpArchSwitchContext (
1461 _In_ BL_ARCH_MODE NewMode
1464 /* MEMORY DESCRIPTOR ROUTINES ************************************************/
1468 _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList
1471 PBL_MEMORY_DESCRIPTOR
1472 MmMdInitByteGranularDescriptor (
1474 _In_ BL_MEMORY_TYPE Type
,
1475 _In_ ULONGLONG BasePage
,
1476 _In_ ULONGLONG VirtualPage
,
1477 _In_ ULONGLONG PageCount
1481 MmMdFreeGlobalDescriptors (
1486 MmMdAddDescriptorToList (
1487 _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList
,
1488 _In_ PBL_MEMORY_DESCRIPTOR MemoryDescriptor
,
1493 MmMdRemoveDescriptorFromList (
1494 _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList
,
1495 _In_ PBL_MEMORY_DESCRIPTOR Entry
1499 MmMdFindSatisfyingRegion (
1500 _In_ PBL_MEMORY_DESCRIPTOR Descriptor
,
1501 _Out_ PBL_MEMORY_DESCRIPTOR NewDescriptor
,
1502 _In_ ULONGLONG Pages
,
1503 _In_ PBL_ADDRESS_RANGE BaseRange
,
1504 _In_ PBL_ADDRESS_RANGE VirtualRange
,
1505 _In_ BOOLEAN TopDown
,
1506 _In_ BL_MEMORY_TYPE MemoryType
,
1508 _In_ ULONG Alignment
1512 MmMdRemoveRegionFromMdlEx (
1513 __in PBL_MEMORY_DESCRIPTOR_LIST MdList
,
1515 __in ULONGLONG BasePage
,
1516 __in ULONGLONG PageCount
,
1517 __in PBL_MEMORY_DESCRIPTOR_LIST NewMdList
1521 MmMdFreeDescriptor (
1522 _In_ PBL_MEMORY_DESCRIPTOR MemoryDescriptor
1525 /* PAGE ALLOCATOR ROUTINES ***************************************************/
1528 BlMmAllocatePhysicalPages(
1529 _Inout_ PPHYSICAL_ADDRESS Address
,
1530 _In_ BL_MEMORY_TYPE MemoryType
,
1531 _In_ ULONGLONG PageCount
,
1532 _In_ ULONG Attributes
,
1533 _In_ ULONG Alignment
1537 BlMmFreePhysicalPages (
1538 _In_ PHYSICAL_ADDRESS Address
1542 MmPapAllocatePagesInRange (
1543 _Inout_ PVOID
* PhysicalAddress
,
1544 _In_ BL_MEMORY_TYPE MemoryType
,
1545 _In_ ULONGLONG Pages
,
1546 _In_ ULONG Attributes
,
1547 _In_ ULONG Alignment
,
1548 _In_opt_ PBL_ADDRESS_RANGE Range
,
1554 _Out_ PBL_MEMORY_DESCRIPTOR_LIST MemoryMap
,
1558 /* VIRTUAL MEMORY ROUTINES ***************************************************/
1561 BlMmMapPhysicalAddressEx (
1562 _In_ PVOID
* VirtualAddress
,
1563 _In_ ULONG Attributes
,
1564 _In_ ULONGLONG Size
,
1565 _In_ PHYSICAL_ADDRESS PhysicalAddress
1569 BlMmUnmapVirtualAddressEx (
1570 _In_ PVOID VirtualAddress
,
1574 /* BLOCK ALLOCATOR ROUTINES **************************************************/
1577 BlpMmCreateBlockAllocator (
1581 /* HEAP ALLOCATOR ROUTINES ***************************************************/
1593 /* DISPLAY ROUTINES **********************************************************/
1596 BlDisplayGetTextCellResolution (
1597 _Out_ PULONG TextWidth
,
1598 _Out_ PULONG TextHeight
1601 /* I/O ROUTINES **************************************************************/
1604 BlpIoRegisterDestroyRoutine (
1605 _In_ PBL_IO_DESTROY_ROUTINE DestroyRoutine
1615 _In_ PBL_DEVICE_DESCRIPTOR Device
,
1618 _Out_ PULONG DeviceId
1622 BlDeviceGetInformation (
1623 _In_ ULONG DeviceId
,
1624 _Out_ PBL_DEVICE_INFORMATION DeviceInformation
1628 BlDeviceSetInformation (
1629 _In_ ULONG DeviceId
,
1630 _In_ PBL_DEVICE_INFORMATION DeviceInformation
1634 BlDeviceReadAtOffset (
1635 _In_ ULONG DeviceId
,
1637 _In_ ULONGLONG Offset
,
1639 _Out_ PULONG BytesRead
1642 /* FILE I/O ROUTINES *********************************************************/
1650 BlFileReadAtOffsetEx (
1653 _In_ ULONGLONG ByteOffset
,
1655 _Out_ PULONG BytesReturned
,
1660 BlFileGetInformation (
1662 _In_ PBL_FILE_INFORMATION FileInfo
1667 _In_ ULONG DeviceId
,
1668 _In_ PWCHAR FileName
,
1673 /* TEXT CONSOLE ROUTINES *****************************************************/
1676 ConsoleTextLocalDestruct (
1677 _In_
struct _BL_TEXT_CONSOLE
* Console
1681 ConsoleTextLocalReinitialize (
1682 _In_
struct _BL_TEXT_CONSOLE
* Console
1686 ConsoleTextBaseGetTextState (
1687 _In_
struct _BL_TEXT_CONSOLE
* Console
,
1688 _Out_ PBL_DISPLAY_STATE TextState
1692 ConsoleTextLocalSetTextState (
1693 _In_
struct _BL_TEXT_CONSOLE
* Console
,
1695 _In_ PBL_DISPLAY_STATE TextState
1699 ConsoleTextBaseGetTextResolution (
1700 _In_
struct _BL_TEXT_CONSOLE
* Console
,
1701 _Out_ PULONG TextResolution
1705 ConsoleTextLocalSetTextResolution (
1706 _In_
struct _BL_TEXT_CONSOLE
* Console
,
1707 _In_ ULONG NewTextResolution
,
1708 _Out_ PULONG OldTextResolution
1712 ConsoleTextLocalClearText (
1713 _In_
struct _BL_TEXT_CONSOLE
* Console
,
1714 _In_ ULONG Attribute
1718 ConsoleTextLocalWriteText (
1719 _In_
struct _BL_TEXT_CONSOLE
* Console
,
1721 _In_ ULONG Attribute
1725 ConsoleTextLocalConstruct (
1726 _In_ PBL_TEXT_CONSOLE TextConsole
,
1727 _In_ BOOLEAN Activate
1731 ConsolepFindResolution (
1732 _In_ PBL_DISPLAY_MODE Mode
,
1733 _In_ PBL_DISPLAY_MODE List
,
1738 ConsoleFirmwareTextClose (
1739 _In_ PBL_TEXT_CONSOLE TextConsole
1743 ConsoleFirmwareTextOpen (
1744 _In_ PBL_TEXT_CONSOLE TextConsole
1748 ConsoleFirmwareTextSetState (
1749 _In_ PBL_TEXT_CONSOLE TextConsole
,
1751 _In_ PBL_DISPLAY_STATE State
1755 ConsoleGraphicalConstruct (
1756 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
1760 ConsoleCreateRemoteConsole (
1761 _In_ PBL_TEXT_CONSOLE
* TextConsole
1765 ConsoleEfiGraphicalOpenProtocol (
1766 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
,
1767 _In_ BL_GRAPHICS_CONSOLE_TYPE Type
1771 ConsoleFirmwareGraphicalClose (
1772 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
1776 ConsoleFirmwareGraphicalEnable (
1777 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
1782 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
1786 ConsoleEfiUgaClose (
1787 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
1791 ConsoleEfiGopClose (
1792 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
1797 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
1801 ConsoleEfiGopEnable (
1802 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
1806 ConsoleEfiUgaSetResolution (
1807 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
,
1808 _In_ PBL_DISPLAY_MODE DisplayMode
,
1809 _In_ ULONG DisplayModeCount
1812 extern ULONG MmDescriptorCallTreeCount
;
1813 extern ULONG BlpApplicationFlags
;
1814 extern BL_LIBRARY_PARAMETERS BlpLibraryParameters
;
1815 extern BL_TRANSLATION_TYPE MmTranslationType
;
1816 extern PBL_ARCH_CONTEXT CurrentExecutionContext
;
1817 extern PBL_DEVICE_DESCRIPTOR BlpBootDevice
;
1818 extern BL_LOADED_APPLICATION_ENTRY BlpApplicationEntry
;
1819 extern SIMPLE_TEXT_OUTPUT_INTERFACE
*EfiConOut
;
1820 extern EFI_GUID EfiGraphicsOutputProtocol
;
1821 extern EFI_GUID EfiUgaDrawProtocol
;
1822 extern EFI_GUID EfiLoadedImageProtocol
;
1823 extern EFI_GUID EfiDevicePathProtocol
;
1824 extern EFI_GUID EfiBlockIoProtocol
;
1825 extern EFI_GUID EfiSimpleTextInputExProtocol
;
1826 extern ULONG ConsoleGraphicalResolutionListFlags
;
1827 extern BL_DISPLAY_MODE ConsoleGraphicalResolutionList
[];
1828 extern BL_DISPLAY_MODE ConsoleTextResolutionList
[];
1829 extern ULONG ConsoleGraphicalResolutionListSize
;
1830 extern PVOID DspRemoteInputConsole
;
1831 extern WCHAR BlScratchBuffer
[8192];