[BOOTLIB]:
[reactos.git] / reactos / boot / environ / include / bl.h
1 /*b
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)
7 */
8
9 #ifndef _BL_H
10 #define _BL_H
11
12 /* INCLUDES ******************************************************************/
13
14 /* C Headers */
15 #include <stdlib.h>
16 #include <stdio.h>
17 #include <wchar.h>
18
19 /* NT Base Headers */
20 #include <ntifs.h>
21
22 /* NDK Headers */
23 #include <ntndk.h>
24
25 /* UEFI Headers */
26 #include <Uefi.h>
27 #include <DevicePath.h>
28 #include <LoadedImage.h>
29 #include <GraphicsOutput.h>
30 #include <UgaDraw.h>
31 #include <BlockIo.h>
32
33 /* Registry Headers */
34 #define __FREELDR_H
35 #include <cmlib.h>
36
37 /* DEFINES *******************************************************************/
38
39 #define BL_APPLICATION_FLAG_CONVERTED_FROM_EFI 0x01
40
41 #define BL_APP_ENTRY_SIGNATURE "BTAPENT"
42
43 #define BOOT_APPLICATION_SIGNATURE_1 'TOOB'
44 #define BOOT_APPLICATION_SIGNATURE_2 ' PPA'
45
46 #define BOOT_MEMORY_TRANSLATION_TYPE_PHYSICAL 0
47 #define BOOT_MEMORY_TRANSLATION_TYPE_VIRTUAL 1
48
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
53
54 #define BL_APPLICATION_ENTRY_FLAG_NO_GUID 0x01
55 #define BL_APPLICATION_ENTRY_REBOOT_ON_ERROR 0x20
56
57 #define BL_CONTEXT_PAGING_ON 1
58 #define BL_CONTEXT_INTERRUPTS_ON 2
59
60 #define BL_MM_FLAG_USE_FIRMWARE_FOR_MEMORY_MAP_BUFFERS 0x01
61 #define BL_MM_FLAG_REQUEST_COALESCING 0x02
62
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
68
69 #define BL_MM_REQUEST_DEFAULT_TYPE 1
70 #define BL_MM_REQUEST_TOP_DOWN_TYPE 2
71
72 #define BL_MM_REMOVE_VIRTUAL_REGION_FLAG 0x80000000
73
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
80
81 #define BL_DISPLAY_GRAPHICS_FORCED_VIDEO_MODE_FLAG 0x01
82 #define BL_DISPLAY_GRAPHICS_FORCED_HIGH_RES_MODE_FLAG 0x02
83
84 #define BL_HT_VALUE_IS_INLINE 0x01
85
86 #define BL_FS_REGISTER_AT_HEAD_FLAG 1
87
88 #define BL_BLOCK_DEVICE_REMOVABLE_FLAG 0x01
89
90 #define BL_MEMORY_CLASS_SHIFT 28
91
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
96
97 #define BL_DEVICE_READ_ACCESS 0x01
98 #define BL_DEVICE_WRITE_ACCESS 0x02
99
100 #define BL_DEVICE_ENTRY_OPENED 0x01
101 #define BL_DEVICE_ENTRY_READ_ACCESS 0x02
102 #define BL_DEVICE_ENTRY_WRITE_ACCESS 0x04
103
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
108
109 #define BL_IMG_VALID_FILE 0x01
110 #define BL_IMG_MEMORY_FILE 0x02
111 #define BL_IMG_REMOTE_FILE 0x04
112
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
118
119 /* ENUMERATIONS **************************************************************/
120
121 typedef enum _BL_COLOR
122 {
123 Black,
124 Blue,
125 Green,
126 Cyan,
127 Red,
128 Magenta,
129 Brown,
130 LtGray,
131 Gray,
132 LtBlue,
133 LtGreen,
134 LtCyan,
135 LtRed,
136 LtMagenta,
137 Yellow,
138 White
139 } BL_COLOR, *PBL_COLOR;
140
141 typedef enum _BL_MEMORY_DESCRIPTOR_TYPE
142 {
143 BlMdPhysical,
144 BlMdVirtual,
145 } BL_MEMORY_DESCRIPTOR_TYPE;
146
147 typedef enum _BL_TRANSLATION_TYPE
148 {
149 BlNone,
150 BlVirtual,
151 BlPae,
152 BlMax
153 } BL_TRANSLATION_TYPE;
154
155 typedef enum _BL_ARCH_MODE
156 {
157 BlProtectedMode,
158 BlRealMode
159 } BL_ARCH_MODE;
160
161 //
162 // Boot Device Types
163 //
164 typedef enum _BL_DEVICE_TYPE
165 {
166 DiskDevice = 0,
167 LegacyPartitionDevice = 2,
168 SerialDevice = 3,
169 UdpDevice = 4,
170 BootDevice = 5,
171 PartitionDevice = 6,
172 LocateDevice = 8,
173 } BL_DEVICE_TYPE;
174
175 //
176 // Local Device Types
177 //
178 typedef enum _BL_LOCAL_DEVICE_TYPE
179 {
180 LocalDevice = 0,
181 FloppyDevice = 1,
182 CdRomDevice = 2,
183 RamDiskDevice = 3,
184 FileDevice = 5,
185 VirtualDiskDevice = 6
186 } BL_LOCAL_DEVICE_TYPE;
187
188 //
189 // Partition types
190 //
191 typedef enum _BL_PARTITION_TYPE
192 {
193 GptPartition,
194 MbrPartition,
195 RawPartition,
196 } BL_PARTITION_TYPE;
197
198 //
199 // File Path Types
200 //
201 typedef enum _BL_PATH_TYPE
202 {
203 InternalPath = 3,
204 EfiPath = 4
205 } BL_PATH_TYPE;
206
207 //
208 // Classes of Memory
209 //
210 typedef enum _BL_MEMORY_CLASS
211 {
212 BlLoaderClass = 0xD,
213 BlApplicationClass,
214 BlSystemClass
215 } BL_MEMORY_CLASS;
216
217 //
218 // Types of Memory
219 //
220 typedef enum _BL_MEMORY_TYPE
221 {
222 //
223 // Loader Memory
224 //
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,
235
236 //
237 // Application Memory
238 //
239 BlApplicationData = 0xE0000004,
240
241 //
242 // System Memory
243 //
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,
254 } BL_MEMORY_TYPE;
255
256 typedef enum _BL_MEMORY_ATTR
257 {
258 //
259 // Memory Caching Attributes
260 //
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,
268
269 //
270 // Memory Protection Attributes
271 //
272 BlMemoryWriteProtected = 0x00000100,
273 BlMemoryReadProtected = 0x00000200,
274 BlMemoryExecuteProtected = 0x00000400,
275 BlMemoryValidProtectionAttributes = BlMemoryWriteProtected | BlMemoryReadProtected | BlMemoryExecuteProtected,
276 BlMemoryValidProtectionAttributeMask = 0x0000FF00,
277
278 //
279 // Memory Allocation Attributes
280 //
281 BlMemoryNonFixed = 0x00020000,
282 BlMemoryFixed = 0x00040000,
283 BlMemoryValidAllocationAttributes = BlMemoryNonFixed | BlMemoryFixed,
284 BlMemoryValidAllocationAttributeMask = 0x00FF0000,
285
286 //
287 // Memory Type Attributes
288 //
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,
297 } BL_MEMORY_ATTR;
298
299 /* CALLBACKS *****************************************************************/
300
301 struct _BL_FILE_ENTRY;
302 struct _BL_FILE_INFORMATION;
303 typedef
304 NTSTATUS
305 (*PBL_FILE_OPEN) (
306 _In_ struct _BL_FILE_ENTRY* Directory,
307 _In_ PWCHAR FileName,
308 _In_ ULONG Flags,
309 _Out_ struct _BL_FILE_ENTRY** FileEntry
310 );
311
312 typedef
313 NTSTATUS
314 (*PBL_FILE_CLOSE) (
315 _In_ struct _BL_FILE_ENTRY* FileEntry
316 );
317
318 typedef
319 NTSTATUS
320 (*PBL_FILE_READ) (
321 _In_ struct _BL_FILE_ENTRY* FileEntry,
322 _In_ PVOID Buffer,
323 _In_ ULONG Size,
324 _Out_ PULONG BytesRead
325 );
326
327 typedef
328 NTSTATUS
329 (*PBL_FILE_WRITE) (
330 VOID
331 );
332
333 typedef
334 NTSTATUS
335 (*PBL_FILE_GET_NEXT) (
336 VOID
337 );
338
339 typedef
340 NTSTATUS
341 (*PBL_FILE_GET_INFO) (
342 _In_ struct _BL_FILE_ENTRY* FileEntry,
343 _Out_ struct _BL_FILE_INFORMATION* FileInfo
344 );
345
346 typedef
347 NTSTATUS
348 (*PBL_FILE_SET_INFO) (
349 _In_ struct _BL_FILE_ENTRY* FileEntry,
350 _In_ struct _BL_FILE_INFORMATION* FileInfo
351 );
352
353 typedef
354 NTSTATUS
355 (*PBL_FS_INIT_CALLBACK) (
356 VOID
357 );
358
359 typedef
360 NTSTATUS
361 (*PBL_FS_DESTROY_CALLBACK) (
362 VOID
363 );
364
365 typedef
366 NTSTATUS
367 (*PBL_FS_MOUNT_CALLBACK) (
368 _In_ ULONG DeviceId,
369 _In_ ULONG Unknown,
370 _Out_ struct _BL_FILE_ENTRY** FileEntry
371 );
372
373 typedef
374 NTSTATUS
375 (*PBL_FS_PURGE_CALLBACK) (
376 VOID
377 );
378
379 typedef
380 NTSTATUS
381 (*PBL_FILE_DESTROY_CALLBACK) (
382 _In_ PVOID Entry
383 );
384
385 struct _BL_TEXT_CONSOLE;
386 struct _BL_DISPLAY_STATE;
387 typedef
388 NTSTATUS
389 (*PCONSOLE_DESTRUCT) (
390 _In_ struct _BL_TEXT_CONSOLE* Console
391 );
392
393 typedef
394 NTSTATUS
395 (*PCONSOLE_REINITIALIZE) (
396 _In_ struct _BL_TEXT_CONSOLE* Console
397 );
398
399 typedef
400 NTSTATUS
401 (*PCONSOLE_GET_TEXT_STATE) (
402 _In_ struct _BL_TEXT_CONSOLE* Console,
403 _Out_ struct _BL_DISPLAY_STATE* TextState
404 );
405
406 typedef
407 NTSTATUS
408 (*PCONSOLE_SET_TEXT_STATE) (
409 _In_ struct _BL_TEXT_CONSOLE* Console,
410 _In_ ULONG Flags,
411 _In_ struct _BL_DISPLAY_STATE* TextState
412 );
413
414 typedef
415 NTSTATUS
416 (*PCONSOLE_GET_TEXT_RESOLUTION) (
417 _In_ struct _BL_TEXT_CONSOLE* Console,
418 _Out_ PULONG TextResolution
419 );
420
421 typedef
422 NTSTATUS
423 (*PCONSOLE_SET_TEXT_RESOLUTION) (
424 _In_ struct _BL_TEXT_CONSOLE* Console,
425 _In_ ULONG NewTextResolution,
426 _Out_ PULONG OldTextResolution
427 );
428
429 typedef
430 NTSTATUS
431 (*PCONSOLE_CLEAR_TEXT) (
432 _In_ struct _BL_TEXT_CONSOLE* Console,
433 _In_ ULONG Attribute
434 );
435
436 typedef
437 NTSTATUS
438 (*PCONSOLE_WRITE_TEXT) (
439 _In_ struct _BL_TEXT_CONSOLE* Console,
440 _In_ PCHAR Text,
441 _In_ ULONG Attribute
442 );
443
444 typedef
445 BOOLEAN
446 (*PBL_TBL_LOOKUP_ROUTINE) (
447 _In_ PVOID Entry,
448 _In_ PVOID Argument1,
449 _In_ PVOID Argument2,
450 _In_ PVOID Argument3,
451 _In_ PVOID Argument4
452 );
453
454 typedef
455 NTSTATUS
456 (*PBL_TBL_MAP_ROUTINE) (
457 _In_ PVOID Entry,
458 _In_ ULONG EntryIndex
459 );
460
461 typedef
462 NTSTATUS
463 (*PBL_TBL_SET_ROUTINE) (
464 _In_ PVOID Entry
465 );
466
467 typedef
468 NTSTATUS
469 (*PBL_IO_DESTROY_ROUTINE) (
470 VOID
471 );
472
473 struct _BL_HASH_ENTRY;
474 typedef
475 BOOLEAN
476 (*PBL_HASH_TABLE_COMPARE_FUNCTION) (
477 _In_ struct _BL_HASH_ENTRY* Entry1,
478 _In_ struct _BL_HASH_ENTRY* Entry2
479 );
480
481 typedef
482 ULONG
483 (*PBL_HASH_TABLE_HASH_FUNCTION) (
484 _In_ struct _BL_HASH_ENTRY* Entry,
485 _In_ ULONG TableSize
486 );
487
488 struct _BL_DEVICE_ENTRY;
489 struct _BL_DEVICE_DESCRIPTOR;
490 struct _BL_DEVICE_INFORMATION;
491
492 typedef
493 NTSTATUS
494 (*PBL_DEVICE_ENUMERATE_DEVICE_CLASS) (
495 VOID
496 );
497
498 typedef
499 NTSTATUS
500 (*PBL_DEVICE_OPEN) (
501 _In_ struct _BL_DEVICE_DESCRIPTOR* Device,
502 _In_ struct _BL_DEVICE_ENTRY* DeviceEntry
503 );
504
505 typedef
506 NTSTATUS
507 (*PBL_DEVICE_CLOSE) (
508 _In_ struct _BL_DEVICE_ENTRY* DeviceEntry
509 );
510
511 typedef
512 NTSTATUS
513 (*PBL_DEVICE_READ) (
514 _In_ struct _BL_DEVICE_ENTRY* DeviceEntry,
515 _In_ PVOID Buffer,
516 _In_ ULONG Size,
517 _Out_ PULONG BytesRead
518 );
519
520 typedef
521 NTSTATUS
522 (*PBL_DEVICE_WRITE) (
523 VOID
524 );
525
526 typedef
527 NTSTATUS
528 (*PBL_DEVICE_GET_INFORMATION) (
529 _In_ struct _BL_DEVICE_ENTRY* DeviceEntry,
530 _Out_ struct _BL_DEVICE_INFORMATION* DeviceInformation
531 );
532
533 typedef
534 NTSTATUS
535 (*PBL_DEVICE_SET_INFORMATION) (
536 _In_ struct _BL_DEVICE_ENTRY* DeviceEntry,
537 _In_ struct _BL_DEVICE_INFORMATION* DeviceInformation
538 );
539
540 typedef
541 NTSTATUS
542 (*PBL_DEVICE_RESET) (
543 VOID
544 );
545
546 typedef
547 NTSTATUS
548 (*PBL_DEVICE_FLUSH) (
549 VOID
550 );
551
552 typedef
553 NTSTATUS
554 (*PBL_DEVICE_CREATE) (
555 VOID
556 );
557
558
559 /* DATA STRUCTURES ***********************************************************/
560
561 typedef struct _BL_LIBRARY_PARAMETERS
562 {
563 ULONG LibraryFlags;
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;
572
573 /* This should eventually go into a more public header */
574 typedef struct _BOOT_APPLICATION_PARAMETER_BLOCK
575 {
576 /* This header tells the library what image we're dealing with */
577 ULONG Signature[2];
578 ULONG Version;
579 ULONG Size;
580 ULONG ImageType;
581 ULONG MemoryTranslationType;
582
583 /* Where is the image located */
584 ULONGLONG ImageBase;
585 ULONG ImageSize;
586
587 /* Offset to BL_MEMORY_DATA */
588 ULONG MemoryDataOffset;
589
590 /* Offset to BL_APPLICATION_ENTRY */
591 ULONG AppEntryOffset;
592
593 /* Offset to BL_DEVICE_DESCRPIPTOR */
594 ULONG BootDeviceOffset;
595
596 /* Offset to BL_FIRMWARE_PARAMETERS */
597 ULONG FirmwareParametersOffset;
598
599 /* Offset to BL_RETURN_ARGUMENTS */
600 ULONG ReturnArgumentsOffset;
601 } BOOT_APPLICATION_PARAMETER_BLOCK, *PBOOT_APPLICATION_PARAMETER_BLOCK;
602
603 typedef struct _BL_MEMORY_DATA
604 {
605 ULONG Version;
606 ULONG MdListOffset;
607 ULONG DescriptorCount;
608 ULONG DescriptorSize;
609 ULONG DescriptorOffset;
610 } BL_MEMORY_DATA, *PBL_MEMORY_DATA;
611
612 typedef struct _BL_FIRMWARE_DESCRIPTOR
613 {
614 ULONG Version;
615 ULONG Unknown;
616 EFI_HANDLE ImageHandle;
617 EFI_SYSTEM_TABLE *SystemTable;
618 } BL_FIRMWARE_DESCRIPTOR, *PBL_FIRMWARE_DESCRIPTOR;
619
620 typedef struct _BL_RETURN_ARGUMENTS
621 {
622 ULONG Version;
623 NTSTATUS Status;
624 ULONG ReturnArgumentData[5];
625 } BL_RETURN_ARGUMENTS, *PBL_RETURN_ARGUMENTS;
626
627 typedef struct _BL_MEMORY_DESCRIPTOR
628 {
629 LIST_ENTRY ListEntry;
630 union
631 {
632 struct
633 {
634 ULONGLONG BasePage;
635 ULONGLONG VirtualPage;
636 };
637 struct
638 {
639 ULONGLONG BaseAddress;
640 ULONGLONG VirtualAddress;
641 };
642 };
643 ULONGLONG PageCount;
644 ULONG Flags;
645 BL_MEMORY_TYPE Type;
646 } BL_MEMORY_DESCRIPTOR, *PBL_MEMORY_DESCRIPTOR;
647
648 typedef struct _BL_BCD_OPTION
649 {
650 ULONG Type;
651 ULONG DataOffset;
652 ULONG DataSize;
653 ULONG ListOffset;
654 ULONG NextEntryOffset;
655 ULONG Empty;
656 } BL_BCD_OPTION, *PBL_BCD_OPTION;
657
658 typedef struct _BL_APPLICATION_ENTRY
659 {
660 CHAR Signature[8];
661 ULONG Flags;
662 GUID Guid;
663 ULONG Unknown[4];
664 BL_BCD_OPTION BcdData;
665 } BL_APPLICATION_ENTRY, *PBL_APPLICATION_ENTRY;
666
667 typedef struct _BL_LOADED_APPLICATION_ENTRY
668 {
669 ULONG Flags;
670 GUID Guid;
671 PBL_BCD_OPTION BcdData;
672 } BL_LOADED_APPLICATION_ENTRY, *PBL_LOADED_APPLICATION_ENTRY;
673
674 typedef struct _BL_HARDDISK_DEVICE
675 {
676 ULONG PartitionType;
677 union
678 {
679 struct
680 {
681 ULONG PartitionSignature;
682 } Mbr;
683
684 struct
685 {
686 GUID PartitionSignature;
687 } Gpt;
688
689 struct
690 {
691 ULONG DiskNumber;
692 } Raw;
693 };
694 } BL_HARDDISK_DEVICE;
695
696 typedef struct _BL_LOCAL_DEVICE
697 {
698 ULONG Type;
699 union
700 {
701 struct
702 {
703 ULONG DriveNumber;
704 } FloppyDisk;
705
706 BL_HARDDISK_DEVICE HardDisk;
707
708 struct
709 {
710 PHYSICAL_ADDRESS ImageBase;
711 LARGE_INTEGER ImageSize;
712 ULONG ImageOffset;
713 } RamDisk;
714 };
715 } BL_LOCAL_DEVICE;
716
717 typedef struct _BL_DEVICE_DESCRIPTOR
718 {
719 ULONG Size;
720 ULONG Flags;
721 DEVICE_TYPE DeviceType;
722 ULONG Unknown;
723 union
724 {
725 BL_LOCAL_DEVICE Local;
726
727 struct
728 {
729 ULONG Unknown;
730 } Remote;
731
732 struct
733 {
734 union
735 {
736 ULONG PartitionNumber;
737 } Mbr;
738
739 union
740 {
741 GUID PartitionGuid;
742 } Gpt;
743
744 BL_LOCAL_DEVICE Disk;
745 } Partition;
746 };
747 } BL_DEVICE_DESCRIPTOR, *PBL_DEVICE_DESCRIPTOR;
748
749 typedef struct _BL_FILE_PATH_DESCRIPTOR
750 {
751 ULONG Version;
752 ULONG Length;
753 ULONG PathType;
754 UCHAR Path[ANYSIZE_ARRAY];
755 } BL_FILE_PATH_DESCRIPTOR, *PBL_FILE_PATH_DESCRIPTOR;
756
757 typedef struct _BL_WINDOWS_LOAD_OPTIONS
758 {
759 CHAR Signature[8];
760 ULONG Version;
761 ULONG Length;
762 ULONG OsPathOffset;
763 WCHAR LoadOptions[ANYSIZE_ARRAY];
764 } BL_WINDOWS_LOAD_OPTIONS, *PBL_WINDOWS_LOAD_OPTIONS;
765
766 typedef struct _BL_ARCH_CONTEXT
767 {
768 BL_ARCH_MODE Mode;
769 BL_TRANSLATION_TYPE TranslationType;
770 ULONG ContextFlags;
771 } BL_ARCH_CONTEXT, *PBL_ARCH_CONTEXT;
772
773 typedef struct _BL_MEMORY_DESCRIPTOR_LIST
774 {
775 LIST_ENTRY ListHead;
776 PLIST_ENTRY First;
777 PLIST_ENTRY This;
778 ULONG Type;
779 } BL_MEMORY_DESCRIPTOR_LIST, *PBL_MEMORY_DESCRIPTOR_LIST;
780
781 typedef struct _BL_ADDRESS_RANGE
782 {
783 ULONGLONG Minimum;
784 ULONGLONG Maximum;
785 } BL_ADDRESS_RANGE, *PBL_ADDRESS_RANGE;
786
787 typedef struct _BL_FILE_INFORMATION
788 {
789 ULONGLONG FileSize;
790 ULONGLONG CurrentOffset;
791 } BL_FILE_INFORMATION, *PBL_FILE_INFORMATION;
792
793 typedef struct _BL_FILE_CALLBACKS
794 {
795 PBL_FILE_OPEN Open;
796 PBL_FILE_CLOSE Close;
797 PBL_FILE_READ Read;
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;
803
804 typedef struct _BL_FILE_ENTRY
805 {
806 PWCHAR FilePath;
807 ULONG DeviceId;
808 ULONG FileId;
809 ULONG Flags;
810 ULONG ReferenceCount;
811 ULONG Unknown;
812 ULONGLONG Unknown1;
813 ULONGLONG Unknown2;
814 BL_FILE_CALLBACKS Callbacks;
815 PVOID FsSpecificData;
816 } BL_FILE_ENTRY, *PBL_FILE_ENTRY;
817
818 typedef struct _BL_FILE_SYSTEM_ENTRY
819 {
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;
826
827 typedef struct _BL_FILE_SYSTEM_REGISTRATION_TABLE
828 {
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;
834
835 typedef struct _BL_DISPLAY_STATE
836 {
837 ULONG BgColor;
838 ULONG FgColor;
839 ULONG XPos;
840 ULONG YPos;
841 ULONG CursorVisible;
842 } BL_DISPLAY_STATE, *PBL_DISPLAY_STATE;
843
844 typedef struct _BL_DISPLAY_MODE
845 {
846 ULONG HRes;
847 ULONG VRes;
848 ULONG HRes2;
849 } BL_DISPLAY_MODE, *PBL_DISPLAY_MODE;
850
851 typedef struct _BL_TEXT_CONSOLE_VTABLE
852 {
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;
862
863 typedef struct _BL_GRAPHICS_CONSOLE_VTABLE
864 {
865 BL_TEXT_CONSOLE_VTABLE Text;
866 /// more for graphics ///
867 } BL_GRAPHICS_CONSOLE_VTABLE, *PBL_GRAPHICS_CONSOLE_VTABLE;
868
869 typedef struct _BL_TEXT_CONSOLE
870 {
871 PBL_TEXT_CONSOLE_VTABLE Callbacks;
872 BL_DISPLAY_STATE State;
873 BL_DISPLAY_MODE DisplayMode;
874 BOOLEAN Active;
875 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL* Protocol;
876 ULONG Mode;
877 EFI_SIMPLE_TEXT_OUTPUT_MODE OldMode;
878 } BL_TEXT_CONSOLE, *PBL_TEXT_CONSOLE;
879
880 typedef enum _BL_GRAPHICS_CONSOLE_TYPE
881 {
882 BlGopConsole,
883 BlUgaConsole
884 } BL_GRAPHICS_CONSOLE_TYPE;
885
886 typedef struct _BL_GRAPHICS_CONSOLE
887 {
888 BL_TEXT_CONSOLE TextConsole;
889 BL_DISPLAY_MODE DisplayMode;
890 ULONG PixelDepth;
891 ULONG FgColor;
892 ULONG BgColor;
893 BL_DISPLAY_MODE OldDisplayMode;
894 ULONG OldPixelDepth;
895 EFI_HANDLE Handle;
896 BL_GRAPHICS_CONSOLE_TYPE Type;
897 EFI_GRAPHICS_OUTPUT_PROTOCOL* Protocol;
898 PVOID FrameBuffer;
899 ULONG FrameBufferSize;
900 ULONG PixelsPerScanLine;
901 ULONG Mode;
902 ULONG OldMode;
903 } BL_GRAPHICS_CONSOLE, *PBL_GRAPHICS_CONSOLE;
904
905 typedef struct _BL_REMOTE_CONSOLE
906 {
907 BL_TEXT_CONSOLE TextConsole;
908 } BL_REMOTE_CONSOLE, *PBL_REMOTE_CONSOLE;
909
910 typedef struct _BL_HASH_TABLE
911 {
912 PLIST_ENTRY HashLinks;
913 ULONG Size;
914 PBL_HASH_TABLE_COMPARE_FUNCTION CompareFunction;
915 PBL_HASH_TABLE_HASH_FUNCTION HashFunction;
916 } BL_HASH_TABLE, *PBL_HASH_TABLE;
917
918 typedef struct _BL_HASH_ENTRY
919 {
920 ULONG Size;
921 ULONG Flags;
922 PVOID Value;
923 } BL_HASH_ENTRY, *PBL_HASH_ENTRY;
924
925 typedef struct _BL_HASH_VALUE
926 {
927 ULONG DataSize;
928 PVOID Data;
929 } BL_HASH_VALUE, *PBL_HASH_VALUE;
930
931 typedef struct _BL_HASH_NODE
932 {
933 LIST_ENTRY ListEntry;
934 BL_HASH_ENTRY Entry;
935 BL_HASH_VALUE Value;
936 } BL_HASH_NODE, *PBL_HASH_NODE;
937
938 typedef struct _BL_BLOCK_DEVICE_INFORMATION
939 {
940 BL_LOCAL_DEVICE_TYPE Type;
941 ULONG DeviceFlags;
942 ULONG Unknown;
943 BL_PARTITION_TYPE PartitionType;
944 ULONG BlockSize;
945 ULONG Alignment;
946 ULONGLONG LastBlock;
947 ULONGLONG Offset;
948 ULONG Block;
949 struct
950 {
951 union
952 {
953 struct
954 {
955 ULONG Signature;
956 } Mbr;
957 struct
958 {
959 GUID Signature;
960 } Gpt;
961 };
962 } Disk;
963 } BL_BLOCK_DEVICE_INFORMATION, *PBL_BLOCK_DEVICE_INFORMATION;
964
965 typedef struct _BL_DEVICE_INFORMATION
966 {
967 BL_DEVICE_TYPE DeviceType;
968 union
969 {
970 BL_BLOCK_DEVICE_INFORMATION BlockDeviceInfo;
971 };
972 } BL_DEVICE_INFORMATION, *PBL_DEVICE_INFORMATION;
973
974 typedef struct _BL_BLOCK_DEVICE
975 {
976 BL_BLOCK_DEVICE_INFORMATION;
977 ULONGLONG StartOffset;
978 EFI_BLOCK_IO* Protocol;
979 EFI_HANDLE Handle;
980 } BL_BLOCK_DEVICE, *PBL_BLOCK_DEVICE;
981
982 typedef struct _BL_PROTOCOL_HANDLE
983 {
984 EFI_HANDLE Handle;
985 PVOID Interface;
986 } BL_PROTOCOL_HANDLE, *PBL_PROTOCOL_HANDLE;
987
988 typedef struct _BL_DEVICE_CALLBACKS
989 {
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;
1001
1002 typedef struct _BL_DEVICE_ENTRY
1003 {
1004 ULONG DeviceId;
1005 ULONG Flags;
1006 ULONG Unknown;
1007 ULONG ReferenceCount;
1008 BL_DEVICE_CALLBACKS Callbacks;
1009 PVOID DeviceSpecificData;
1010 PBL_DEVICE_DESCRIPTOR DeviceDescriptor;
1011 } BL_DEVICE_ENTRY, *PBL_DEVICE_ENTRY;
1012
1013 typedef struct _BL_IMG_FILE
1014 {
1015 UCHAR Flags;
1016 union
1017 {
1018 PVOID BaseAddress;
1019 ULONG FileId;
1020 };
1021 ULONG FileSize;
1022 PWCHAR FileName;
1023 } BL_IMG_FILE, *PBL_IMG_FILE;
1024
1025 /* INLINE ROUTINES ***********************************************************/
1026
1027 FORCEINLINE
1028 VOID
1029 BlSetupDefaultParameters (
1030 _Out_ PBL_LIBRARY_PARAMETERS LibraryParameters
1031 )
1032 {
1033 BL_LIBRARY_PARAMETERS DefaultParameters =
1034 {
1035 0x20,
1036 BlVirtual,
1037 1024,
1038 2 * 1024 * 1024,
1039 0,
1040 NULL,
1041 0,
1042 NULL
1043 };
1044
1045 /* Copy the defaults */
1046 RtlCopyMemory(LibraryParameters, &DefaultParameters, sizeof(*LibraryParameters));
1047 }
1048
1049 FORCEINLINE
1050 VOID
1051 MmMdInitializeListHead (
1052 _In_ PBL_MEMORY_DESCRIPTOR_LIST List
1053 )
1054 {
1055 /* Initialize the list */
1056 InitializeListHead(&List->ListHead);
1057 List->First = &List->ListHead;
1058 List->This = NULL;
1059 }
1060
1061 /* INITIALIZATION ROUTINES ***************************************************/
1062
1063 NTSTATUS
1064 BlInitializeLibrary(
1065 _In_ PBOOT_APPLICATION_PARAMETER_BLOCK BootAppParameters,
1066 _In_ PBL_LIBRARY_PARAMETERS LibraryParameters
1067 );
1068
1069 NTSTATUS
1070 BlpArchInitialize (
1071 _In_ ULONG Phase
1072 );
1073
1074 NTSTATUS
1075 BlpFwInitialize (
1076 _In_ ULONG Phase,
1077 _In_ PBL_FIRMWARE_DESCRIPTOR FirmwareParameters
1078 );
1079
1080 NTSTATUS
1081 BlpMmInitialize (
1082 _In_ PBL_MEMORY_DATA MemoryData,
1083 _In_ BL_TRANSLATION_TYPE TranslationType,
1084 _In_ PBL_LIBRARY_PARAMETERS LibraryParameters
1085 );
1086
1087 NTSTATUS
1088 MmBaInitialize (
1089 VOID
1090 );
1091
1092 NTSTATUS
1093 MmPaInitialize (
1094 _In_ PBL_MEMORY_DATA MemoryData,
1095 _In_ ULONG MinimumPages
1096 );
1097
1098 NTSTATUS
1099 MmArchInitialize (
1100 _In_ ULONG Phase,
1101 _In_ PBL_MEMORY_DATA MemoryData,
1102 _In_ BL_TRANSLATION_TYPE TranslationType,
1103 _In_ BL_TRANSLATION_TYPE LibraryTranslationType
1104 );
1105
1106 NTSTATUS
1107 MmHaInitialize (
1108 _In_ ULONG HeapSize,
1109 _In_ ULONG HeapAttributes
1110 );
1111
1112 VOID
1113 MmMdInitialize (
1114 _In_ ULONG Phase,
1115 _In_ PBL_LIBRARY_PARAMETERS LibraryParameters
1116 );
1117
1118 NTSTATUS
1119 BlpDeviceInitialize (
1120 VOID
1121 );
1122
1123 NTSTATUS
1124 BlpIoInitialize (
1125 VOID
1126 );
1127
1128 NTSTATUS
1129 BlpFileInitialize (
1130 VOID
1131 );
1132
1133 NTSTATUS
1134 BlpDisplayInitialize (
1135 _In_ ULONG Flags
1136 );
1137
1138 VOID
1139 BlDestroyLibrary (
1140 VOID
1141 );
1142
1143 NTSTATUS
1144 BcInitialize (
1145 VOID
1146 );
1147
1148 /* FIRMWARE ROUTINES *********************************************************/
1149
1150 VOID
1151 EfiPrintf (
1152 _In_ PWCHAR Format,
1153 ...
1154 );
1155
1156 NTSTATUS
1157 EfiAllocatePages (
1158 _In_ ULONG Type,
1159 _In_ ULONG Pages,
1160 _Inout_ EFI_PHYSICAL_ADDRESS* Memory
1161 );
1162
1163 NTSTATUS
1164 EfiStall (
1165 _In_ ULONG StallTime
1166 );
1167
1168 NTSTATUS
1169 EfiConOutQueryMode (
1170 _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface,
1171 _In_ ULONG Mode,
1172 _In_ UINTN* Columns,
1173 _In_ UINTN* Rows
1174 );
1175
1176 NTSTATUS
1177 EfiConOutSetMode (
1178 _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface,
1179 _In_ ULONG Mode
1180 );
1181
1182 VOID
1183 EfiConOutReadCurrentMode (
1184 _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface,
1185 _Out_ EFI_SIMPLE_TEXT_OUTPUT_MODE* Mode
1186 );
1187
1188 NTSTATUS
1189 EfiConOutSetAttribute (
1190 _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface,
1191 _In_ ULONG Attribute
1192 );
1193
1194 NTSTATUS
1195 EfiConOutSetCursorPosition (
1196 _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface,
1197 _In_ ULONG Column,
1198 _In_ ULONG Row
1199 );
1200
1201 NTSTATUS
1202 EfiConOutEnableCursor (
1203 _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface,
1204 _In_ BOOLEAN Visible
1205 );
1206
1207 NTSTATUS
1208 EfiLocateHandleBuffer (
1209 _In_ EFI_LOCATE_SEARCH_TYPE SearchType,
1210 _In_ EFI_GUID *Protocol,
1211 _Inout_ PULONG HandleCount,
1212 _Inout_ EFI_HANDLE** Buffer
1213 );
1214
1215 NTSTATUS
1216 EfiOpenProtocol (
1217 _In_ EFI_HANDLE Handle,
1218 _In_ EFI_GUID *Protocol,
1219 _Out_ PVOID* Interface
1220 );
1221
1222 NTSTATUS
1223 EfiCloseProtocol (
1224 _In_ EFI_HANDLE Handle,
1225 _In_ EFI_GUID *Protocol
1226 );
1227
1228 NTSTATUS
1229 EfiGopGetCurrentMode (
1230 _In_ EFI_GRAPHICS_OUTPUT_PROTOCOL *GopInterface,
1231 _Out_ UINTN* Mode,
1232 _Out_ EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Information
1233 );
1234
1235 NTSTATUS
1236 EfiGopSetMode (
1237 _In_ EFI_GRAPHICS_OUTPUT_PROTOCOL *GopInterface,
1238 _In_ ULONG Mode
1239 );
1240
1241 VOID
1242 EfiGopGetFrameBuffer (
1243 _In_ EFI_GRAPHICS_OUTPUT_PROTOCOL *GopInterface,
1244 _Out_ PHYSICAL_ADDRESS* FrameBuffer,
1245 _Out_ UINTN *FrameBufferSize
1246 );
1247
1248 VOID
1249 EfiResetSystem (
1250 _In_ EFI_RESET_TYPE ResetType
1251 );
1252
1253 EFI_DEVICE_PATH*
1254 EfiGetLeafNode (
1255 _In_ EFI_DEVICE_PATH *DevicePath
1256 );
1257
1258 EFI_DEVICE_PATH *
1259 EfiIsDevicePathParent (
1260 _In_ EFI_DEVICE_PATH *DevicePath1,
1261 _In_ EFI_DEVICE_PATH *DevicePath2
1262 );
1263
1264 /* PLATFORM TIMER ROUTINES ***************************************************/
1265
1266 NTSTATUS
1267 BlpTimeCalibratePerformanceCounter (
1268 VOID
1269 );
1270
1271 /* FILESYSTEM ROUTINES *******************************************************/
1272
1273 NTSTATUS
1274 FatInitialize (
1275 VOID
1276 );
1277
1278 NTSTATUS
1279 FatMount (
1280 _In_ ULONG DeviceId,
1281 _In_ ULONG Unknown,
1282 _Out_ PBL_FILE_ENTRY* FileEntry
1283 );
1284
1285 NTSTATUS
1286 EtfsInitialize (
1287 VOID
1288 );
1289
1290 NTSTATUS
1291 EtfsMount (
1292 _In_ ULONG DeviceId,
1293 _In_ ULONG Unknown,
1294 _Out_ PBL_FILE_ENTRY* FileEntry
1295 );
1296
1297 /* DEBUG ROUTINES ************************************************************/
1298
1299
1300 BOOLEAN
1301 BlBdDebuggerEnabled (
1302 VOID
1303 );
1304
1305 NTSTATUS
1306 BlBdPullRemoteFile (
1307 _In_ PWCHAR FilePath,
1308 _Out_ PVOID BaseAddress,
1309 _Out_ PULONGLONG FileSize
1310 );
1311
1312 VOID
1313 BlStatusPrint (
1314 _In_ PCWCH Format,
1315 ...
1316 );
1317
1318 VOID
1319 BlStatusError (
1320 _In_ ULONG ErrorCode,
1321 _In_ ULONG Parameter1,
1322 _In_ ULONG_PTR Parameter2,
1323 _In_ ULONG_PTR Parameter3,
1324 _In_ ULONG_PTR Parameter4
1325 );
1326
1327 /* UTILITY ROUTINES **********************************************************/
1328
1329 VOID
1330 BlUtlUpdateProgress (
1331 _In_ ULONG Percentage,
1332 _Out_opt_ PBOOLEAN Completed
1333 );
1334
1335 EFI_STATUS
1336 EfiGetEfiStatusCode(
1337 _In_ NTSTATUS Status
1338 );
1339
1340 NTSTATUS
1341 EfiGetNtStatusCode (
1342 _In_ EFI_STATUS EfiStatus
1343 );
1344
1345 NTSTATUS
1346 BlUtlInitialize (
1347 VOID
1348 );
1349
1350 VOID
1351 BlFwReboot (
1352 VOID
1353 );
1354
1355 PGUID
1356 BlGetApplicationIdentifier (
1357 VOID
1358 );
1359
1360 PWCHAR
1361 BlResourceFindMessage (
1362 _In_ ULONG MsgId
1363 );
1364
1365 /* TABLE ROUTINES ************************************************************/
1366
1367 NTSTATUS
1368 BlTblMap (
1369 _In_ PVOID *Table,
1370 _In_ ULONG Count,
1371 _In_ PBL_TBL_MAP_ROUTINE MapCallback
1372 );
1373
1374 PVOID
1375 BlTblFindEntry (
1376 _In_ PVOID *Table,
1377 _In_ ULONG Count,
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
1384 );
1385
1386 NTSTATUS
1387 BlTblSetEntry (
1388 _Inout_ PVOID** Table,
1389 _Inout_ PULONG Count,
1390 _In_ PVOID Entry,
1391 _Out_ PULONG EntryIndex,
1392 _In_ PBL_TBL_SET_ROUTINE Callback
1393 );
1394
1395 NTSTATUS
1396 TblDoNotPurgeEntry (
1397 _In_ PVOID Entry
1398 );
1399
1400 /* HASH TABLE ROUTINES *******************************************************/
1401
1402 NTSTATUS
1403 BlHtStore (
1404 _In_ ULONG TableId,
1405 _In_ PBL_HASH_ENTRY Entry,
1406 _In_ PVOID Data,
1407 _In_ ULONG DataSize
1408 );
1409
1410 NTSTATUS
1411 BlHtLookup (
1412 _In_ ULONG TableId,
1413 _In_ PBL_HASH_ENTRY Entry,
1414 _Out_ PBL_HASH_VALUE *Value
1415 );
1416
1417 NTSTATUS
1418 BlHtCreate (
1419 _In_ ULONG Size,
1420 _In_ PBL_HASH_TABLE_HASH_FUNCTION HashFunction,
1421 _In_ PBL_HASH_TABLE_COMPARE_FUNCTION CompareFunction,
1422 _Out_ PULONG Id
1423 );
1424
1425 /* BCD ROUTINES **************************************************************/
1426
1427 ULONG
1428 BlGetBootOptionSize (
1429 _In_ PBL_BCD_OPTION BcdOption
1430 );
1431
1432 NTSTATUS
1433 BlGetBootOptionString (
1434 _In_ PBL_BCD_OPTION List,
1435 _In_ ULONG Type,
1436 _Out_ PWCHAR* Value
1437 );
1438
1439 NTSTATUS
1440 BlGetBootOptionInteger (
1441 _In_ PBL_BCD_OPTION List,
1442 _In_ ULONG Type,
1443 _Out_ PULONGLONG Value
1444 );
1445
1446 NTSTATUS
1447 BlGetBootOptionBoolean (
1448 _In_ PBL_BCD_OPTION List,
1449 _In_ ULONG Type,
1450 _Out_ PBOOLEAN Value
1451 );
1452
1453 NTSTATUS
1454 BlGetBootOptionDevice (
1455 _In_ PBL_BCD_OPTION List,
1456 _In_ ULONG Type,
1457 _Out_ PBL_DEVICE_DESCRIPTOR* Value,
1458 _In_opt_ PBL_BCD_OPTION* ExtraOptions
1459 );
1460
1461 /* CONTEXT ROUTINES **********************************************************/
1462
1463 VOID
1464 BlpArchSwitchContext (
1465 _In_ BL_ARCH_MODE NewMode
1466 );
1467
1468 /* MEMORY DESCRIPTOR ROUTINES ************************************************/
1469
1470 VOID
1471 MmMdFreeList(
1472 _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList
1473 );
1474
1475 PBL_MEMORY_DESCRIPTOR
1476 MmMdInitByteGranularDescriptor (
1477 _In_ ULONG Flags,
1478 _In_ BL_MEMORY_TYPE Type,
1479 _In_ ULONGLONG BasePage,
1480 _In_ ULONGLONG VirtualPage,
1481 _In_ ULONGLONG PageCount
1482 );
1483
1484 VOID
1485 MmMdFreeGlobalDescriptors (
1486 VOID
1487 );
1488
1489 NTSTATUS
1490 MmMdAddDescriptorToList (
1491 _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList,
1492 _In_ PBL_MEMORY_DESCRIPTOR MemoryDescriptor,
1493 _In_ ULONG Flags
1494 );
1495
1496 VOID
1497 MmMdRemoveDescriptorFromList (
1498 _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList,
1499 _In_ PBL_MEMORY_DESCRIPTOR Entry
1500 );
1501
1502 BOOLEAN
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,
1511 _In_ ULONG Flags,
1512 _In_ ULONG Alignment
1513 );
1514
1515 NTSTATUS
1516 MmMdRemoveRegionFromMdlEx (
1517 __in PBL_MEMORY_DESCRIPTOR_LIST MdList,
1518 __in ULONG Flags,
1519 __in ULONGLONG BasePage,
1520 __in ULONGLONG PageCount,
1521 __in PBL_MEMORY_DESCRIPTOR_LIST NewMdList
1522 );
1523
1524 NTSTATUS
1525 MmMdFreeDescriptor (
1526 _In_ PBL_MEMORY_DESCRIPTOR MemoryDescriptor
1527 );
1528
1529 /* PAGE ALLOCATOR ROUTINES ***************************************************/
1530
1531 NTSTATUS
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
1538 );
1539
1540 NTSTATUS
1541 BlMmFreePhysicalPages (
1542 _In_ PHYSICAL_ADDRESS Address
1543 );
1544
1545 NTSTATUS
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,
1553 _In_ ULONG Type
1554 );
1555
1556 NTSTATUS
1557 MmFwGetMemoryMap (
1558 _Out_ PBL_MEMORY_DESCRIPTOR_LIST MemoryMap,
1559 _In_ ULONG Flags
1560 );
1561
1562 /* VIRTUAL MEMORY ROUTINES ***************************************************/
1563
1564 NTSTATUS
1565 BlMmMapPhysicalAddressEx (
1566 _In_ PVOID* VirtualAddress,
1567 _In_ ULONG Attributes,
1568 _In_ ULONGLONG Size,
1569 _In_ PHYSICAL_ADDRESS PhysicalAddress
1570 );
1571
1572 NTSTATUS
1573 BlMmUnmapVirtualAddressEx (
1574 _In_ PVOID VirtualAddress,
1575 _In_ ULONGLONG Size
1576 );
1577
1578 /* BLOCK ALLOCATOR ROUTINES **************************************************/
1579
1580 NTSTATUS
1581 BlpMmCreateBlockAllocator (
1582 VOID
1583 );
1584
1585 /* HEAP ALLOCATOR ROUTINES ***************************************************/
1586
1587 PVOID
1588 BlMmAllocateHeap (
1589 _In_ ULONG Size
1590 );
1591
1592 NTSTATUS
1593 BlMmFreeHeap (
1594 _In_ PVOID Buffer
1595 );
1596
1597 /* DISPLAY ROUTINES **********************************************************/
1598
1599 VOID
1600 BlDisplayGetTextCellResolution (
1601 _Out_ PULONG TextWidth,
1602 _Out_ PULONG TextHeight
1603 );
1604
1605 /* I/O ROUTINES **************************************************************/
1606
1607 NTSTATUS
1608 BlpIoRegisterDestroyRoutine (
1609 _In_ PBL_IO_DESTROY_ROUTINE DestroyRoutine
1610 );
1611
1612 NTSTATUS
1613 BlDeviceClose (
1614 _In_ ULONG DeviceId
1615 );
1616
1617 NTSTATUS
1618 BlpDeviceOpen (
1619 _In_ PBL_DEVICE_DESCRIPTOR Device,
1620 _In_ ULONG Flags,
1621 _In_ ULONG Unknown,
1622 _Out_ PULONG DeviceId
1623 );
1624
1625 NTSTATUS
1626 BlDeviceGetInformation (
1627 _In_ ULONG DeviceId,
1628 _Out_ PBL_DEVICE_INFORMATION DeviceInformation
1629 );
1630
1631 NTSTATUS
1632 BlDeviceSetInformation (
1633 _In_ ULONG DeviceId,
1634 _In_ PBL_DEVICE_INFORMATION DeviceInformation
1635 );
1636
1637 NTSTATUS
1638 BlDeviceReadAtOffset (
1639 _In_ ULONG DeviceId,
1640 _In_ ULONG Size,
1641 _In_ ULONGLONG Offset,
1642 _In_ PVOID Buffer,
1643 _Out_ PULONG BytesRead
1644 );
1645
1646 /* IMAGE ROUTINES ************************************************************/
1647
1648 NTSTATUS
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
1659 );
1660
1661 /* FILE I/O ROUTINES *********************************************************/
1662
1663 NTSTATUS
1664 BlFileClose (
1665 _In_ ULONG FileId
1666 );
1667
1668 NTSTATUS
1669 BlFileReadAtOffsetEx (
1670 _In_ ULONG FileId,
1671 _In_ ULONG Size,
1672 _In_ ULONGLONG ByteOffset,
1673 _In_ PVOID Buffer,
1674 _Out_ PULONG BytesReturned,
1675 _In_ ULONG Flags
1676 );
1677
1678 NTSTATUS
1679 BlFileGetInformation (
1680 _In_ ULONG FileId,
1681 _In_ PBL_FILE_INFORMATION FileInfo
1682 );
1683
1684 NTSTATUS
1685 BlFileOpen (
1686 _In_ ULONG DeviceId,
1687 _In_ PWCHAR FileName,
1688 _In_ ULONG Flags,
1689 _Out_ PULONG FileId
1690 );
1691
1692 /* TEXT CONSOLE ROUTINES *****************************************************/
1693
1694 NTSTATUS
1695 ConsoleTextLocalDestruct (
1696 _In_ struct _BL_TEXT_CONSOLE* Console
1697 );
1698
1699 NTSTATUS
1700 ConsoleTextLocalReinitialize (
1701 _In_ struct _BL_TEXT_CONSOLE* Console
1702 );
1703
1704 NTSTATUS
1705 ConsoleTextBaseGetTextState (
1706 _In_ struct _BL_TEXT_CONSOLE* Console,
1707 _Out_ PBL_DISPLAY_STATE TextState
1708 );
1709
1710 NTSTATUS
1711 ConsoleTextLocalSetTextState (
1712 _In_ struct _BL_TEXT_CONSOLE* Console,
1713 _In_ ULONG Flags,
1714 _In_ PBL_DISPLAY_STATE TextState
1715 );
1716
1717 NTSTATUS
1718 ConsoleTextBaseGetTextResolution (
1719 _In_ struct _BL_TEXT_CONSOLE* Console,
1720 _Out_ PULONG TextResolution
1721 );
1722
1723 NTSTATUS
1724 ConsoleTextLocalSetTextResolution (
1725 _In_ struct _BL_TEXT_CONSOLE* Console,
1726 _In_ ULONG NewTextResolution,
1727 _Out_ PULONG OldTextResolution
1728 );
1729
1730 NTSTATUS
1731 ConsoleTextLocalClearText (
1732 _In_ struct _BL_TEXT_CONSOLE* Console,
1733 _In_ ULONG Attribute
1734 );
1735
1736 NTSTATUS
1737 ConsoleTextLocalWriteText (
1738 _In_ struct _BL_TEXT_CONSOLE* Console,
1739 _In_ PCHAR Text,
1740 _In_ ULONG Attribute
1741 );
1742
1743 NTSTATUS
1744 ConsoleTextLocalConstruct (
1745 _In_ PBL_TEXT_CONSOLE TextConsole,
1746 _In_ BOOLEAN Activate
1747 );
1748
1749 BOOLEAN
1750 ConsolepFindResolution (
1751 _In_ PBL_DISPLAY_MODE Mode,
1752 _In_ PBL_DISPLAY_MODE List,
1753 _In_ ULONG MaxIndex
1754 );
1755
1756 VOID
1757 ConsoleFirmwareTextClose (
1758 _In_ PBL_TEXT_CONSOLE TextConsole
1759 );
1760
1761 NTSTATUS
1762 ConsoleFirmwareTextOpen (
1763 _In_ PBL_TEXT_CONSOLE TextConsole
1764 );
1765
1766 NTSTATUS
1767 ConsoleFirmwareTextSetState (
1768 _In_ PBL_TEXT_CONSOLE TextConsole,
1769 _In_ UCHAR Mask,
1770 _In_ PBL_DISPLAY_STATE State
1771 );
1772
1773 NTSTATUS
1774 ConsoleGraphicalConstruct (
1775 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
1776 );
1777
1778 NTSTATUS
1779 ConsoleCreateRemoteConsole (
1780 _In_ PBL_TEXT_CONSOLE* TextConsole
1781 );
1782
1783 NTSTATUS
1784 ConsoleEfiGraphicalOpenProtocol (
1785 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole,
1786 _In_ BL_GRAPHICS_CONSOLE_TYPE Type
1787 );
1788
1789 VOID
1790 ConsoleFirmwareGraphicalClose (
1791 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
1792 );
1793
1794 NTSTATUS
1795 ConsoleFirmwareGraphicalEnable (
1796 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
1797 );
1798
1799 NTSTATUS
1800 ConsoleEfiUgaOpen (
1801 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
1802 );
1803
1804 VOID
1805 ConsoleEfiUgaClose (
1806 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
1807 );
1808
1809 VOID
1810 ConsoleEfiGopClose (
1811 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
1812 );
1813
1814 NTSTATUS
1815 ConsoleEfiGopOpen (
1816 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
1817 );
1818
1819 NTSTATUS
1820 ConsoleEfiGopEnable (
1821 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
1822 );
1823
1824 NTSTATUS
1825 ConsoleEfiUgaSetResolution (
1826 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole,
1827 _In_ PBL_DISPLAY_MODE DisplayMode,
1828 _In_ ULONG DisplayModeCount
1829 );
1830
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];
1851 #endif