xref: /reactos/boot/environ/include/bl.h (revision 5ddbd373)
1 /*
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 /* NT SafeInt Header */
26 #include <ntintsafe.h>
27 
28 /* PE Headers */
29 #include <ntimage.h>
30 
31 /* ACPI Headers */
32 #include <drivers/acpi/acpi.h>
33 
34 /* UEFI Headers */
35 #include <Uefi.h>
36 #include <DevicePath.h>
37 #include <LoadedImage.h>
38 #include <GraphicsOutput.h>
39 #include <UgaDraw.h>
40 #include <BlockIo.h>
41 #include <Acpi.h>
42 #include <GlobalVariable.h>
43 
44 /* Registry Headers */
45 #define __FREELDR_H
46 #include <cmlib.h>
47 
48 /* DEFINES *******************************************************************/
49 
50 DEFINE_GUID(BadMemoryGuid, 0x54B8275B, 0xD431, 0x473F, 0xAC, 0xFB, 0xE5, 0x36, 0xA0, 0x84, 0x94, 0xA3);
51 
52 #define BL_APPLICATION_FLAG_CONVERTED_FROM_EFI          0x01
53 
54 #define BL_APP_ENTRY_SIGNATURE                          "BTAPENT"
55 
56 #define BOOT_APPLICATION_SIGNATURE_1                    'TOOB'
57 #define BOOT_APPLICATION_SIGNATURE_2                    ' PPA'
58 
59 #define BOOT_MEMORY_TRANSLATION_TYPE_PHYSICAL           0
60 #define BOOT_MEMORY_TRANSLATION_TYPE_VIRTUAL            1
61 
62 #define BOOT_APPLICATION_VERSION                        2
63 #define BL_MEMORY_DATA_VERSION                          1
64 #define BL_RETURN_ARGUMENTS_VERSION                     1
65 #define BL_FIRMWARE_DESCRIPTOR_VERSION                  2
66 
67 #define BL_RETURN_ARGUMENTS_NO_PAE_FLAG                 0x40
68 
69 #define BL_APPLICATION_ENTRY_FLAG_NO_GUID               0x01
70 #define BL_APPLICATION_ENTRY_BCD_OPTIONS_INTERNAL       0x02
71 #define BL_APPLICATION_ENTRY_WINLOAD                    0x04
72 #define BL_APPLICATION_ENTRY_STARTUP                    0x08
73 #define BL_APPLICATION_ENTRY_REBOOT_ON_ERROR            0x20
74 #define BL_APPLICATION_ENTRY_NTLDR                      0x40
75 #define BL_APPLICATION_ENTRY_BCD_OPTIONS_EXTERNAL       0x80
76 #define BL_APPLICATION_ENTRY_WINRESUME                  0x100
77 #define BL_APPLICATION_ENTRY_SETUPLDR                   0x200
78 #define BL_APPLICATION_ENTRY_BOOTSECTOR                 0x400
79 #define BL_APPLICATION_ENTRY_BOOTMGR                    0x1000
80 #define BL_APPLICATION_ENTRY_DISPLAY_ORDER              0x800000
81 #define BL_APPLICATION_ENTRY_FIXED_SEQUENCE             0x20000000
82 #define BL_APPLICATION_ENTRY_RECOVERY                   0x40000000
83 
84 #define BL_CONTEXT_PAGING_ON                            1
85 #define BL_CONTEXT_INTERRUPTS_ON                        2
86 
87 #define BL_MM_FLAG_USE_FIRMWARE_FOR_MEMORY_MAP_BUFFERS  0x01
88 #define BL_MM_FLAG_REQUEST_COALESCING                   0x02
89 
90 #define BL_MM_ADD_DESCRIPTOR_COALESCE_FLAG              0x01
91 #define BL_MM_ADD_DESCRIPTOR_TRUNCATE_FLAG              0x02
92 #define BL_MM_ADD_DESCRIPTOR_NEVER_COALESCE_FLAG        0x10
93 #define BL_MM_ADD_DESCRIPTOR_NEVER_TRUNCATE_FLAG        0x20
94 #define BL_MM_ADD_DESCRIPTOR_ALLOCATE_FLAG              0x1000
95 #define BL_MM_ADD_DESCRIPTOR_UPDATE_LIST_POINTER_FLAG   0x2000
96 
97 #define BL_MM_INCLUDE_MAPPED_ALLOCATED                  0x01
98 #define BL_MM_INCLUDE_MAPPED_UNALLOCATED                0x02
99 #define BL_MM_INCLUDE_UNMAPPED_ALLOCATED                0x04
100 #define BL_MM_INCLUDE_UNMAPPED_UNALLOCATED              0x08
101 #define BL_MM_INCLUDE_RESERVED_ALLOCATED                0x10
102 #define BL_MM_INCLUDE_BAD_MEMORY                        0x20
103 #define BL_MM_INCLUDE_FIRMWARE_MEMORY                   0x40
104 #define BL_MM_INCLUDE_TRUNCATED_MEMORY                  0x80
105 #define BL_MM_INCLUDE_PERSISTENT_MEMORY                 0x100
106 #define BL_MM_INCLUDE_FIRMWARE_MEMORY_2                 0x200
107 
108 #define BL_MM_INCLUDE_NO_FIRMWARE_MEMORY                (BL_MM_INCLUDE_PERSISTENT_MEMORY | \
109                                                          BL_MM_INCLUDE_TRUNCATED_MEMORY | \
110                                                          BL_MM_INCLUDE_BAD_MEMORY | \
111                                                          BL_MM_INCLUDE_RESERVED_ALLOCATED | \
112                                                          BL_MM_INCLUDE_UNMAPPED_UNALLOCATED | \
113                                                          BL_MM_INCLUDE_UNMAPPED_ALLOCATED | \
114                                                          BL_MM_INCLUDE_MAPPED_UNALLOCATED | \
115                                                          BL_MM_INCLUDE_MAPPED_ALLOCATED)
116 C_ASSERT(BL_MM_INCLUDE_NO_FIRMWARE_MEMORY == 0x1BF);
117 
118 #define BL_MM_INCLUDE_ONLY_FIRMWARE_MEMORY              (BL_MM_INCLUDE_FIRMWARE_MEMORY_2 | \
119                                                          BL_MM_INCLUDE_FIRMWARE_MEMORY)
120 C_ASSERT(BL_MM_INCLUDE_ONLY_FIRMWARE_MEMORY == 0x240);
121 
122 #define BL_MM_REQUEST_DEFAULT_TYPE                      1
123 #define BL_MM_REQUEST_TOP_DOWN_TYPE                     2
124 
125 #define BL_MM_REMOVE_PHYSICAL_REGION_FLAG               0x40000000
126 #define BL_MM_REMOVE_VIRTUAL_REGION_FLAG                0x80000000
127 
128 #define BL_LIBRARY_FLAG_NO_DISPLAY                      0x01
129 #define BL_LIBRARY_FLAG_REINITIALIZE                    0x02
130 #define BL_LIBRARY_FLAG_REINITIALIZE_ALL                0x04
131 #define BL_LIBRARY_FLAG_ZERO_HEAP_ALLOCATIONS_ON_FREE   0x10
132 #define BL_LIBRARY_FLAG_INITIALIZATION_COMPLETED        0x20
133 #define BL_LIBRARY_FLAG_NO_GRAPHICS_CONSOLE             0x800
134 
135 #define BL_DISPLAY_GRAPHICS_FORCED_VIDEO_MODE_FLAG      0x01
136 #define BL_DISPLAY_GRAPHICS_FORCED_HIGH_RES_MODE_FLAG   0x02
137 
138 #define BL_HT_VALUE_IS_INLINE                           0x01
139 
140 #define BL_FS_REGISTER_AT_HEAD_FLAG                     1
141 
142 #define BL_BLOCK_DEVICE_REMOVABLE_FLAG                  0x01
143 #define BL_BLOCK_DEVICE_PRESENT_FLAG                    0x02
144 #define BL_BLOCK_DEVICE_VIRTUAL_FLAG                    0x04
145 
146 #define BL_MEMORY_CLASS_SHIFT                           28
147 
148 #define BL_FILE_READ_ACCESS                             0x01
149 #define BL_FILE_WRITE_ACCESS                            0x02
150 #define BL_DIRECTORY_ACCESS                             0x04
151 #define BL_UNKNOWN_ACCESS                               0x10
152 
153 #define BL_DEVICE_READ_ACCESS                           0x01
154 #define BL_DEVICE_WRITE_ACCESS                          0x02
155 
156 #define BL_DEVICE_ENTRY_OPENED                          0x01
157 #define BL_DEVICE_ENTRY_READ_ACCESS                     0x02
158 #define BL_DEVICE_ENTRY_WRITE_ACCESS                    0x04
159 
160 #define BL_FILE_ENTRY_OPENED                            0x01
161 #define BL_FILE_ENTRY_READ_ACCESS                       0x02
162 #define BL_FILE_ENTRY_WRITE_ACCESS                      0x04
163 #define BL_FILE_ENTRY_UNKNOWN_ACCESS                    0x10
164 #define BL_FILE_ENTRY_DIRECTORY                         0x10000
165 
166 #define BL_ETFS_FILE_ENTRY_DIRECTORY                    0x01
167 
168 #define BL_IMG_VALID_FILE                               0x01
169 #define BL_IMG_MEMORY_FILE                              0x02
170 #define BL_IMG_REMOTE_FILE                              0x04
171 
172 #define BL_LOAD_IMG_VIRTUAL_BUFFER                      0x01
173 #define BL_LOAD_IMG_EXISTING_BUFFER                     0x04
174 #define BL_LOAD_IMG_UNKNOWN_BUFFER_FLAG                 0x08
175 #define BL_LOAD_IMG_COMPUTE_SIGNATURE                   0x10
176 #define BL_LOAD_IMG_COMPUTE_HASH                        0x40000
177 
178 #define BL_LOAD_PE_IMG_VIRTUAL_BUFFER                   BL_LOAD_IMG_VIRTUAL_BUFFER
179 #define BL_LOAD_PE_IMG_CHECK_MACHINE                    0x02
180 #define BL_LOAD_PE_IMG_EXISTING_BUFFER                  BL_LOAD_IMG_EXISTING_BUFFER
181 #define BL_LOAD_PE_IMG_COMPUTE_HASH                     0x10
182 #define BL_LOAD_PE_IMG_CHECK_SUBSYSTEM                  0x80
183 #define BL_LOAD_PE_IMG_SKIP_RELOCATIONS                 0x100
184 #define BL_LOAD_PE_IMG_CHECK_FORCED_INTEGRITY           0x200
185 #define BL_LOAD_PE_IMG_IGNORE_CHECKSUM_MISMATCH         0x10000
186 #define BL_LOAD_PE_IMG_VALIDATE_ORIGINAL_FILENAME       0x400000
187 
188 #define BL_UTL_CHECKSUM_COMPLEMENT                      0x10000
189 #define BL_UTL_CHECKSUM_ROTATE                          0x20000
190 #define BL_UTL_CHECKSUM_NEGATE                          0x40000
191 #define BL_UTL_CHECKSUM_UCHAR_BUFFER                    0x01
192 #define BL_UTL_CHECKSUM_USHORT_BUFFER                   0x02
193 
194 /* ENUMERATIONS **************************************************************/
195 
196 typedef enum _BL_COLOR
197 {
198     Black,
199     Blue,
200     Green,
201     Cyan,
202     Red,
203     Magenta,
204     Brown,
205     LtGray,
206     Gray,
207     LtBlue,
208     LtGreen,
209     LtCyan,
210     LtRed,
211     LtMagenta,
212     Yellow,
213     White
214 } BL_COLOR, *PBL_COLOR;
215 
216 typedef enum _BL_MENU_POLICY
217 {
218     MenuPolicyLegacy = 0,
219     MenuPolicyStandard = 1
220 } BL_MENU_POLICY;
221 
222 typedef enum _BL_MEMORY_DESCRIPTOR_TYPE
223 {
224     BlMdPhysical,
225     BlMdVirtual,
226     BlMdTracker
227 } BL_MEMORY_DESCRIPTOR_TYPE;
228 
229 typedef enum _BL_TRANSLATION_TYPE
230 {
231     BlNone,
232     BlVirtual,
233     BlPae,
234     BlMax
235 } BL_TRANSLATION_TYPE;
236 
237 typedef enum _BL_ARCH_MODE
238 {
239     BlProtectedMode,
240     BlRealMode
241 } BL_ARCH_MODE;
242 
243 //
244 // Boot Device Types
245 //
246 typedef enum _BL_DEVICE_TYPE
247 {
248     DiskDevice = 0,
249     LegacyPartitionDevice = 2,
250     SerialDevice = 3,
251     UdpDevice = 4,
252     BootDevice = 5,
253     PartitionDevice = 6,
254     LocateDevice = 8,
255 } BL_DEVICE_TYPE;
256 
257 //
258 // Local Device Types
259 //
260 typedef enum _BL_LOCAL_DEVICE_TYPE
261 {
262     LocalDevice = 0,
263     FloppyDevice = 1,
264     CdRomDevice = 2,
265     RamDiskDevice = 3,
266     FileDevice = 5,
267     VirtualDiskDevice = 6
268 } BL_LOCAL_DEVICE_TYPE;
269 
270 //
271 // Partition types
272 //
273 typedef enum _BL_PARTITION_TYPE
274 {
275     GptPartition,
276     MbrPartition,
277     RawPartition,
278 } BL_PARTITION_TYPE;
279 
280 //
281 // File Path Types
282 //
283 typedef enum _BL_PATH_TYPE
284 {
285     InternalPath = 3,
286     EfiPath = 4
287 } BL_PATH_TYPE;
288 
289 //
290 // Classes of Memory
291 //
292 typedef enum _BL_MEMORY_CLASS
293 {
294     BlLoaderClass = 0xD,
295     BlApplicationClass,
296     BlSystemClass
297 } BL_MEMORY_CLASS;
298 
299 //
300 // Types of Memory
301 //
302 typedef enum _BL_MEMORY_TYPE
303 {
304     //
305     // Loader Memory
306     //
307     BlLoaderMemory = 0xD0000002,
308     BlLoaderDeviceMemory = 0xD0000004,
309     BlLoaderHeap = 0xD0000005,
310     BlLoaderPageDirectory = 0xD0000006,
311     BlLoaderReferencePage = 0xD0000007,
312     BlLoaderRamDisk = 0xD0000008,
313     BlLoaderArchData = 0xD0000009,
314     BlLoaderData = 0xD000000A,
315     BlLoaderRegistry = 0xD000000B,
316     BlLoaderBlockMemory = 0xD000000C,
317     BlLoaderSelfMap = 0xD000000F,
318 
319     //
320     // Application Memory
321     //
322     BlApplicationReserved = 0xE0000001,
323     BlApplicationData = 0xE0000004,
324 
325     //
326     // System Memory
327     //
328     BlConventionalMemory = 0xF0000001,
329     BlUnusableMemory = 0xF0000002,
330     BlReservedMemory = 0xF0000003,
331     BlEfiBootMemory = 0xF0000004,
332     BlConventionalZeroedMemory = 0xF000005,
333     BlEfiRuntimeCodeMemory = 0xF0000006,
334     BlAcpiReclaimMemory = 0xF0000008,
335     BlAcpiNvsMemory = 0xF0000009,
336     BlDeviceIoMemory = 0xF000000A,
337     BlDevicePortMemory = 0xF000000B,
338     BlPalMemory = 0xF000000C,
339     BlEfiRuntimeDataMemory = 0xF000000E,
340 } BL_MEMORY_TYPE;
341 
342 typedef enum _BL_MEMORY_ATTR
343 {
344     //
345     // Memory Caching Attributes
346     //
347     BlMemoryUncached =          0x00000001,
348     BlMemoryWriteCombined =     0x00000002,
349     BlMemoryWriteThrough =      0x00000004,
350     BlMemoryWriteBack =         0x00000008,
351     BlMemoryUncachedExported =  0x00000010,
352     BlMemoryValidCacheAttributes            = BlMemoryUncached | BlMemoryWriteCombined | BlMemoryWriteThrough | BlMemoryWriteBack | BlMemoryUncachedExported,
353     BlMemoryValidCacheAttributeMask         = 0x000000FF,
354 
355     //
356     // Memory Protection Attributes
357     //
358     BlMemoryWriteProtected =    0x00000100,
359     BlMemoryReadProtected =     0x00000200,
360     BlMemoryExecuteProtected =  0x00000400,
361     BlMemoryValidProtectionAttributes       = BlMemoryWriteProtected | BlMemoryReadProtected | BlMemoryExecuteProtected,
362     BlMemoryValidProtectionAttributeMask    = 0x0000FF00,
363 
364     //
365     // Memory Allocation Attributes
366     //
367     BlMemoryLargePages =        0x00010000,
368     BlMemoryKernelRange =       0x00020000,
369     BlMemoryFixed =             0x00040000,
370     BlMemoryBelow1MB =          0x00080000,
371     BlMemoryValidAllocationAttributes       = BlMemoryKernelRange | BlMemoryFixed | BlMemoryBelow1MB | BlMemoryLargePages,
372     BlMemoryValidAllocationAttributeMask    = 0x00FF0000,
373 
374     //
375     // Memory Type Attributes
376     //
377     BlMemoryRuntime =           0x01000000,
378     BlMemoryCoalesced =         0x02000000,
379     BlMemoryUpdate =            0x04000000,
380     BlMemoryNonFirmware =       0x08000000,
381     BlMemoryPersistent =        0x10000000,
382     BlMemorySpecial =           0x20000000,
383     BlMemoryFirmware =          0x80000000,
384     BlMemoryValidTypeAttributes             = BlMemoryRuntime | BlMemoryCoalesced | BlMemoryUpdate | BlMemoryNonFirmware | BlMemoryPersistent | BlMemorySpecial | BlMemoryFirmware,
385     BlMemoryValidTypeAttributeMask          = 0xFF000000,
386 } BL_MEMORY_ATTR;
387 
388 /* CALLBACKS *****************************************************************/
389 
390 struct _BL_FILE_ENTRY;
391 struct _BL_FILE_INFORMATION;
392 typedef
393 NTSTATUS
394 (*PBL_FILE_OPEN) (
395     _In_ struct _BL_FILE_ENTRY* Directory,
396     _In_ PWCHAR FileName,
397     _In_ ULONG Flags,
398     _Out_ struct _BL_FILE_ENTRY** FileEntry
399     );
400 
401 typedef
402 NTSTATUS
403 (*PBL_FILE_CLOSE) (
404     _In_ struct _BL_FILE_ENTRY* FileEntry
405     );
406 
407 typedef
408 NTSTATUS
409 (*PBL_FILE_READ) (
410     _In_ struct _BL_FILE_ENTRY* FileEntry,
411     _In_ PVOID Buffer,
412     _In_ ULONG Size,
413     _Out_opt_ PULONG BytesRead
414     );
415 
416 typedef
417 NTSTATUS
418 (*PBL_FILE_WRITE) (
419     VOID
420     );
421 
422 typedef
423 NTSTATUS
424 (*PBL_FILE_GET_NEXT) (
425     VOID
426     );
427 
428 typedef
429 NTSTATUS
430 (*PBL_FILE_GET_INFO) (
431     _In_ struct _BL_FILE_ENTRY* FileEntry,
432     _Out_ struct _BL_FILE_INFORMATION* FileInfo
433     );
434 
435 typedef
436 NTSTATUS
437 (*PBL_FILE_SET_INFO) (
438     _In_ struct _BL_FILE_ENTRY* FileEntry,
439     _In_ struct _BL_FILE_INFORMATION* FileInfo
440     );
441 
442 typedef
443 NTSTATUS
444 (*PBL_FS_INIT_CALLBACK) (
445     VOID
446     );
447 
448 typedef
449 NTSTATUS
450 (*PBL_FS_DESTROY_CALLBACK) (
451     VOID
452     );
453 
454 typedef
455 NTSTATUS
456 (*PBL_FS_MOUNT_CALLBACK) (
457     _In_ ULONG DeviceId,
458     _In_ ULONG Unknown,
459     _Out_ struct _BL_FILE_ENTRY** FileEntry
460     );
461 
462 typedef
463 NTSTATUS
464 (*PBL_FS_PURGE_CALLBACK) (
465     VOID
466     );
467 
468 typedef
469 NTSTATUS
470 (*PBL_FILE_DESTROY_CALLBACK) (
471     _In_ PVOID Entry
472     );
473 
474 struct _BL_TEXT_CONSOLE;
475 struct _BL_DISPLAY_STATE;
476 struct _BL_DISPLAY_MODE;
477 struct _BL_INPUT_CONSOLE;
478 struct _BL_REMOTE_CONSOLE;
479 struct _BL_GRAPHICS_CONSOLE;
480 typedef
481 VOID
482 (*PCONSOLE_DESTRUCT) (
483     _In_ struct _BL_TEXT_CONSOLE* Console
484     );
485 
486 typedef
487 NTSTATUS
488 (*PCONSOLE_REINITIALIZE) (
489     _In_ struct _BL_TEXT_CONSOLE* Console
490     );
491 
492 typedef
493 NTSTATUS
494 (*PCONSOLE_GET_TEXT_STATE) (
495     _In_ struct _BL_TEXT_CONSOLE* Console,
496     _Out_ struct _BL_DISPLAY_STATE* TextState
497     );
498 
499 typedef
500 NTSTATUS
501 (*PCONSOLE_SET_TEXT_STATE) (
502     _In_ struct _BL_TEXT_CONSOLE* Console,
503     _In_ ULONG Flags,
504     _In_ struct _BL_DISPLAY_STATE* TextState
505     );
506 
507 typedef
508 NTSTATUS
509 (*PCONSOLE_GET_TEXT_RESOLUTION) (
510     _In_ struct _BL_TEXT_CONSOLE* Console,
511     _Out_ PULONG TextResolution
512     );
513 
514 typedef
515 NTSTATUS
516 (*PCONSOLE_SET_TEXT_RESOLUTION) (
517     _In_ struct _BL_TEXT_CONSOLE* Console,
518     _In_ ULONG NewTextResolution,
519     _Out_ PULONG OldTextResolution
520     );
521 
522 typedef
523 NTSTATUS
524 (*PCONSOLE_CLEAR_TEXT) (
525     _In_ struct _BL_TEXT_CONSOLE* Console,
526     _In_ BOOLEAN LineOnly
527     );
528 
529 typedef
530 BOOLEAN
531 (*PCONSOLE_IS_ENABLED) (
532     _In_ struct _BL_GRAPHICS_CONSOLE* Console
533     );
534 
535 typedef
536 NTSTATUS
537 (*PCONSOLE_GET_GRAPHICAL_RESOLUTION) (
538     _In_ struct _BL_GRAPHICS_CONSOLE* Console,
539     _Out_ struct _BL_DISPLAY_MODE* DisplayMode
540     );
541 
542 typedef
543 NTSTATUS
544 (*PCONSOLE_SET_GRAPHICAL_RESOLUTION) (
545     _In_ struct _BL_GRAPHICS_CONSOLE* Console,
546     _In_ struct _BL_DISPLAY_MODE DisplayMode
547     );
548 
549 typedef
550 NTSTATUS
551 (*PCONSOLE_ENABLE) (
552     _In_ struct _BL_GRAPHICS_CONSOLE* Console,
553     _In_ BOOLEAN Enable
554 );
555 
556 typedef
557 NTSTATUS
558 (*PCONSOLE_WRITE_TEXT) (
559     _In_ struct _BL_TEXT_CONSOLE* Console,
560     _In_ PCHAR Text,
561     _In_ ULONG Attribute
562     );
563 
564 typedef
565 BOOLEAN
566 (*PBL_TBL_LOOKUP_ROUTINE) (
567     _In_ PVOID Entry,
568     _In_ PVOID Argument1,
569     _In_ PVOID Argument2,
570     _In_ PVOID Argument3,
571     _In_ PVOID Argument4
572     );
573 
574 typedef
575 NTSTATUS
576 (*PBL_TBL_MAP_ROUTINE) (
577     _In_ PVOID Entry,
578     _In_ ULONG EntryIndex
579     );
580 
581 typedef
582 NTSTATUS
583 (*PBL_TBL_SET_ROUTINE) (
584     _In_ PVOID Entry
585     );
586 
587 typedef
588 NTSTATUS
589 (*PBL_IO_DESTROY_ROUTINE) (
590     VOID
591     );
592 
593 struct _BL_HASH_ENTRY;
594 typedef
595 BOOLEAN
596 (*PBL_HASH_TABLE_COMPARE_FUNCTION) (
597     _In_ struct _BL_HASH_ENTRY* Entry1,
598     _In_ struct _BL_HASH_ENTRY* Entry2
599     );
600 
601 typedef
602 ULONG
603 (*PBL_HASH_TABLE_HASH_FUNCTION) (
604     _In_ struct _BL_HASH_ENTRY* Entry,
605     _In_ ULONG TableSize
606     );
607 
608 struct _BL_DEVICE_ENTRY;
609 struct _BL_DEVICE_DESCRIPTOR;
610 struct _BL_DEVICE_INFORMATION;
611 
612 typedef
613 NTSTATUS
614 (*PBL_DEVICE_ENUMERATE_DEVICE_CLASS) (
615     VOID
616     );
617 
618 typedef
619 NTSTATUS
620 (*PBL_DEVICE_OPEN) (
621     _In_ struct _BL_DEVICE_DESCRIPTOR* Device,
622     _In_ struct _BL_DEVICE_ENTRY* DeviceEntry
623     );
624 
625 typedef
626 NTSTATUS
627 (*PBL_DEVICE_CLOSE) (
628     _In_ struct _BL_DEVICE_ENTRY* DeviceEntry
629     );
630 
631 typedef
632 NTSTATUS
633 (*PBL_DEVICE_READ) (
634     _In_ struct _BL_DEVICE_ENTRY* DeviceEntry,
635     _In_ PVOID Buffer,
636     _In_ ULONG Size,
637     _Out_ PULONG BytesRead
638     );
639 
640 typedef
641 NTSTATUS
642 (*PBL_DEVICE_WRITE) (
643     VOID
644     );
645 
646 typedef
647 NTSTATUS
648 (*PBL_DEVICE_GET_INFORMATION) (
649     _In_ struct _BL_DEVICE_ENTRY* DeviceEntry,
650     _Out_ struct _BL_DEVICE_INFORMATION* DeviceInformation
651     );
652 
653 typedef
654 NTSTATUS
655 (*PBL_DEVICE_SET_INFORMATION) (
656     _In_ struct _BL_DEVICE_ENTRY* DeviceEntry,
657     _In_ struct _BL_DEVICE_INFORMATION* DeviceInformation
658     );
659 
660 typedef
661 NTSTATUS
662 (*PBL_DEVICE_RESET) (
663     VOID
664     );
665 
666 typedef
667 NTSTATUS
668 (*PBL_DEVICE_FLUSH) (
669     VOID
670     );
671 
672 typedef
673 NTSTATUS
674 (*PBL_DEVICE_CREATE) (
675     VOID
676     );
677 
678 typedef VOID
679 (*PBL_MM_FLUSH_TLB) (
680     VOID
681     );
682 
683 typedef VOID
684 (*PBL_MM_RELOCATE_SELF_MAP) (
685     VOID
686     );
687 
688 typedef NTSTATUS
689 (*PBL_MM_MOVE_VIRTUAL_ADDRESS_RANGE) (
690     _In_ PVOID DestinationAddress,
691     _In_ PVOID SourceAddress,
692     _In_ ULONGLONG Size
693     );
694 
695 typedef NTSTATUS
696 (*PBL_MM_ZERO_VIRTUAL_ADDRESS_RANGE) (
697     _In_ PVOID DestinationAddress,
698     _In_ ULONGLONG Size
699     );
700 
701 typedef VOID
702 (*PBL_MM_DESTROY_SELF_MAP) (
703     VOID
704     );
705 
706 typedef VOID
707 (*PBL_MM_FLUSH_TLB_ENTRY) (
708     _In_ PVOID VirtualAddress
709     );
710 
711 typedef VOID
712 (*PBL_MM_FLUSH_TLB) (
713     VOID
714     );
715 
716 typedef NTSTATUS
717 (*PBL_MM_UNMAP_VIRTUAL_ADDRESS) (
718     _In_ PVOID VirtualAddress,
719     _In_ ULONG Size
720     );
721 
722 typedef NTSTATUS
723 (*PBL_MM_REMAP_VIRTUAL_ADDRESS) (
724     _In_ PPHYSICAL_ADDRESS PhysicalAddress,
725     _Out_ PVOID VirtualAddress,
726     _In_ ULONG Size,
727     _In_ ULONG CacheAttributes
728     );
729 
730 typedef NTSTATUS
731 (*PBL_MM_MAP_PHYSICAL_ADDRESS) (
732     _In_ PHYSICAL_ADDRESS PhysicalAddress,
733     _Out_ PVOID VirtualAddress,
734     _In_ ULONG Size,
735     _In_ ULONG CacheAttributes
736     );
737 
738 typedef BOOLEAN
739 (*PBL_MM_TRANSLATE_VIRTUAL_ADDRESS) (
740     _In_ PVOID VirtualAddress,
741     _Out_ PPHYSICAL_ADDRESS PhysicalAddress,
742     _Out_opt_ PULONG CacheAttributes
743     );
744 
745 typedef NTSTATUS
746 (*PBL_STATUS_ERROR_HANDLER) (
747     _In_ ULONG ErrorCode,
748     _In_ ULONG Parameter1,
749     _In_ ULONG_PTR Parameter2,
750     _In_ ULONG_PTR Parameter3,
751     _In_ ULONG_PTR Parameter4
752     );
753 
754 /* DATA STRUCTURES ***********************************************************/
755 
756 typedef struct _BL_LIBRARY_PARAMETERS
757 {
758     ULONG LibraryFlags;
759     ULONG TranslationType;
760     ULONG MinimumAllocationCount;
761     ULONG MinimumHeapSize;
762     ULONG HeapAllocationAttributes;
763     PWCHAR ApplicationBaseDirectory;
764     ULONG DescriptorCount;
765     PWCHAR FontBaseDirectory;
766 } BL_LIBRARY_PARAMETERS, *PBL_LIBRARY_PARAMETERS;
767 
768 /* This should eventually go into a more public header */
769 typedef struct _BOOT_APPLICATION_PARAMETER_BLOCK
770 {
771     /* This header tells the library what image we're dealing with */
772     ULONG Signature[2];
773     ULONG Version;
774     ULONG Size;
775     ULONG ImageType;
776     ULONG MemoryTranslationType;
777 
778     /* Where is the image located */
779     ULONGLONG ImageBase;
780     ULONG ImageSize;
781 
782     /* Offset to BL_MEMORY_DATA */
783     ULONG MemoryDataOffset;
784 
785     /* Offset to BL_APPLICATION_ENTRY */
786     ULONG AppEntryOffset;
787 
788     /* Offset to BL_DEVICE_DESCRPIPTOR */
789     ULONG BootDeviceOffset;
790 
791     /* Offset to BL_FIRMWARE_PARAMETERS */
792     ULONG FirmwareParametersOffset;
793 
794     /* Offset to BL_RETURN_ARGUMENTS */
795     ULONG ReturnArgumentsOffset;
796 } BOOT_APPLICATION_PARAMETER_BLOCK, *PBOOT_APPLICATION_PARAMETER_BLOCK;
797 
798 typedef struct _BL_MEMORY_DATA
799 {
800     ULONG Version;
801     ULONG MdListOffset;
802     ULONG DescriptorCount;
803     ULONG DescriptorSize;
804     ULONG DescriptorOffset;
805 } BL_MEMORY_DATA, *PBL_MEMORY_DATA;
806 
807 typedef struct _BL_FIRMWARE_DESCRIPTOR
808 {
809     ULONG Version;
810     ULONG Unknown;
811     EFI_HANDLE ImageHandle;
812     EFI_SYSTEM_TABLE *SystemTable;
813 } BL_FIRMWARE_DESCRIPTOR, *PBL_FIRMWARE_DESCRIPTOR;
814 
815 typedef struct _BL_RETURN_ARGUMENTS
816 {
817     ULONG Version;
818     NTSTATUS Status;
819     ULONG Flags;
820     ULONGLONG DataSize;
821     ULONGLONG DataPage;
822 } BL_RETURN_ARGUMENTS, *PBL_RETURN_ARGUMENTS;
823 
824 typedef struct _BL_MEMORY_DESCRIPTOR
825 {
826     LIST_ENTRY ListEntry;
827     union
828     {
829         struct
830         {
831             ULONGLONG BasePage;
832             ULONGLONG VirtualPage;
833         };
834         struct
835         {
836             ULONGLONG BaseAddress;
837             ULONGLONG VirtualAddress;
838         };
839     };
840     ULONGLONG PageCount;
841     ULONG Flags;
842     BL_MEMORY_TYPE Type;
843 } BL_MEMORY_DESCRIPTOR, *PBL_MEMORY_DESCRIPTOR;
844 
845 typedef struct _BL_BCD_OPTION
846 {
847     ULONG Type;
848     ULONG DataOffset;
849     ULONG DataSize;
850     ULONG ListOffset;
851     ULONG NextEntryOffset;
852     ULONG Empty;
853 } BL_BCD_OPTION, *PBL_BCD_OPTION;
854 
855 typedef struct _BL_APPLICATION_ENTRY
856 {
857     CHAR Signature[8];
858     ULONG Flags;
859     GUID Guid;
860     ULONG Unknown[4];
861     BL_BCD_OPTION BcdData;
862 } BL_APPLICATION_ENTRY, *PBL_APPLICATION_ENTRY;
863 
864 typedef struct _BL_LOADED_APPLICATION_ENTRY
865 {
866     ULONG Flags;
867     GUID Guid;
868     PBL_BCD_OPTION BcdData;
869 } BL_LOADED_APPLICATION_ENTRY, *PBL_LOADED_APPLICATION_ENTRY;
870 
871 typedef struct _BL_MENU_STATUS
872 {
873     union
874     {
875         struct
876         {
877             ULONG AnyKey : 1;
878             ULONG AdvancedOptions : 1;
879             ULONG BootOptions : 1;
880             ULONG OemKey : 1;
881             ULONG Exit : 1;
882             ULONG Reserved : 27;
883         };
884         ULONG AsULong;
885     };
886     ULONG BootIndex;
887     WCHAR KeyValue;
888 } BL_MENU_STATUS, *PL_MENU_STATUS;
889 
890 typedef enum _BL_BOOT_ERROR_STATUS
891 {
892     Reboot = 1,
893     Recover = 2,
894     RecoverOem = 3,
895     OsSelection = 4,
896     NextOs = 5,
897     TryAgain = 6,
898     AdvancedOptions = 7,
899     BootOptions = 8
900 } BL_BOOT_ERROR_STATUS;
901 
902 typedef struct _BL_HARDDISK_DEVICE
903 {
904     ULONG PartitionType;
905     union
906     {
907         struct
908         {
909             ULONG PartitionSignature;
910         } Mbr;
911 
912         struct
913         {
914             GUID PartitionSignature;
915         } Gpt;
916 
917         struct
918         {
919             ULONG DiskNumber;
920         } Raw;
921     };
922 } BL_HARDDISK_DEVICE;
923 
924 typedef struct _BL_LOCAL_DEVICE
925 {
926     BL_LOCAL_DEVICE_TYPE Type;
927     union
928     {
929         struct
930         {
931             ULONG DriveNumber;
932         } FloppyDisk;
933 
934         BL_HARDDISK_DEVICE HardDisk;
935 
936         BL_HARDDISK_DEVICE VirtualHardDisk;
937 
938         struct
939         {
940             PHYSICAL_ADDRESS ImageBase;
941             LARGE_INTEGER ImageSize;
942             ULONG ImageOffset;
943         } RamDisk;
944 
945         ULONG File; // unknown for now
946     };
947 } BL_LOCAL_DEVICE, *PBL_LOCAL_DEVICE;
948 
949 typedef struct _BL_DEVICE_DESCRIPTOR
950 {
951     DEVICE_TYPE DeviceType;
952     ULONG Flags;
953     ULONG Size;
954     ULONG Unknown;
955     union
956     {
957         BL_LOCAL_DEVICE Local;
958 
959         struct
960         {
961             ULONG Unknown;
962         } Remote;
963 
964         struct
965         {
966             union
967             {
968                 ULONG PartitionNumber;
969             } Mbr;
970 
971             union
972             {
973                 GUID PartitionGuid;
974             } Gpt;
975 
976             BL_LOCAL_DEVICE Disk;
977         } Partition;
978     };
979 } BL_DEVICE_DESCRIPTOR, *PBL_DEVICE_DESCRIPTOR;
980 
981 typedef struct _BL_FILE_PATH_DESCRIPTOR
982 {
983     ULONG Version;
984     ULONG Length;
985     ULONG PathType;
986     UCHAR Path[ANYSIZE_ARRAY];
987 } BL_FILE_PATH_DESCRIPTOR, *PBL_FILE_PATH_DESCRIPTOR;
988 
989 typedef struct _BL_WINDOWS_LOAD_OPTIONS
990 {
991     CHAR Signature[8];
992     ULONG Version;
993     ULONG Length;
994     ULONG OsPathOffset;
995     WCHAR LoadOptions[ANYSIZE_ARRAY];
996 } BL_WINDOWS_LOAD_OPTIONS, *PBL_WINDOWS_LOAD_OPTIONS;
997 
998 typedef struct _BL_ARCH_CONTEXT
999 {
1000     BL_ARCH_MODE Mode;
1001     BL_TRANSLATION_TYPE TranslationType;
1002     ULONG ContextFlags;
1003 } BL_ARCH_CONTEXT, *PBL_ARCH_CONTEXT;
1004 
1005 typedef struct _BL_MEMORY_DESCRIPTOR_LIST
1006 {
1007     LIST_ENTRY ListHead;
1008     PLIST_ENTRY First;
1009     PLIST_ENTRY This;
1010     ULONG Type;
1011 } BL_MEMORY_DESCRIPTOR_LIST, *PBL_MEMORY_DESCRIPTOR_LIST;
1012 
1013 typedef struct _BL_ADDRESS_RANGE
1014 {
1015     ULONGLONG Minimum;
1016     ULONGLONG Maximum;
1017 } BL_ADDRESS_RANGE, *PBL_ADDRESS_RANGE;
1018 
1019 typedef struct _BL_FILE_INFORMATION
1020 {
1021     ULONGLONG Size;
1022     ULONGLONG Offset;
1023     PWCHAR FsName;
1024     ULONG Flags;
1025 } BL_FILE_INFORMATION, *PBL_FILE_INFORMATION;
1026 
1027 typedef struct _BL_FILE_CALLBACKS
1028 {
1029     PBL_FILE_OPEN Open;
1030     PBL_FILE_CLOSE Close;
1031     PBL_FILE_READ Read;
1032     PBL_FILE_WRITE Write;
1033     PBL_FILE_GET_NEXT GetNext;
1034     PBL_FILE_GET_INFO GetInfo;
1035     PBL_FILE_SET_INFO SetInfo;
1036 } BL_FILE_CALLBACKS, *PBL_FILE_CALLBACKS;
1037 
1038 typedef struct _BL_FILE_ENTRY
1039 {
1040     PWCHAR FilePath;
1041     ULONG DeviceId;
1042     ULONG FileId;
1043     ULONG Flags;
1044     ULONG ReferenceCount;
1045     ULONG Unknown;
1046     ULONGLONG TotalBytesRead;
1047     ULONGLONG Unknown2;
1048     BL_FILE_CALLBACKS Callbacks;
1049     PVOID FsSpecificData;
1050 } BL_FILE_ENTRY, *PBL_FILE_ENTRY;
1051 
1052 typedef struct _BL_FILE_SYSTEM_ENTRY
1053 {
1054     LIST_ENTRY ListEntry;
1055     PBL_FS_INIT_CALLBACK InitCallback;
1056     PBL_FS_DESTROY_CALLBACK DestroyCallback;
1057     PBL_FS_MOUNT_CALLBACK MountCallback;
1058     PBL_FS_PURGE_CALLBACK PurgeCallback;
1059 } BL_FILE_SYSTEM_ENTRY, *PBL_FILE_SYSTEM_ENTRY;
1060 
1061 typedef struct _BL_FILE_SYSTEM_REGISTRATION_TABLE
1062 {
1063     PBL_FS_INIT_CALLBACK Init;
1064     PBL_FS_DESTROY_CALLBACK Destroy;
1065     PBL_FS_MOUNT_CALLBACK Mount;
1066     PBL_FS_PURGE_CALLBACK Purge;
1067 } BL_FILE_SYSTEM_REGISTRATION_TABLE;
1068 
1069 typedef struct _BL_DISPLAY_STATE
1070 {
1071     ULONG BgColor;
1072     ULONG FgColor;
1073     ULONG XPos;
1074     ULONG YPos;
1075     ULONG CursorVisible;
1076 } BL_DISPLAY_STATE, *PBL_DISPLAY_STATE;
1077 
1078 typedef struct _BL_DISPLAY_MODE
1079 {
1080     ULONG HRes;
1081     ULONG VRes;
1082     ULONG HRes2;
1083 } BL_DISPLAY_MODE, *PBL_DISPLAY_MODE;
1084 
1085 typedef struct _BL_TEXT_CONSOLE_VTABLE
1086 {
1087     PCONSOLE_DESTRUCT Destruct;
1088     PCONSOLE_REINITIALIZE Reinitialize;
1089     PCONSOLE_GET_TEXT_STATE GetTextState;
1090     PCONSOLE_SET_TEXT_STATE SetTextState;
1091     PCONSOLE_GET_TEXT_RESOLUTION GetTextResolution;
1092     PCONSOLE_SET_TEXT_RESOLUTION SetTextResolution;
1093     PCONSOLE_CLEAR_TEXT ClearText;
1094     PCONSOLE_WRITE_TEXT WriteText;
1095 } BL_TEXT_CONSOLE_VTABLE, *PBL_TEXT_CONSOLE_VTABLE;
1096 
1097 typedef struct _BL_GRAPHICS_CONSOLE_VTABLE
1098 {
1099     BL_TEXT_CONSOLE_VTABLE Text;
1100     PCONSOLE_IS_ENABLED IsEnabled;
1101     PCONSOLE_ENABLE Enable;
1102     PVOID GetConsoleResolution;
1103     PCONSOLE_GET_GRAPHICAL_RESOLUTION GetGraphicalResolution;
1104     PCONSOLE_GET_GRAPHICAL_RESOLUTION GetOriginalResolution;
1105     PCONSOLE_SET_GRAPHICAL_RESOLUTION SetOriginalResolution;
1106     /// more for graphics ///
1107 } BL_GRAPHICS_CONSOLE_VTABLE, *PBL_GRAPHICS_CONSOLE_VTABLE;
1108 
1109 typedef struct _BL_TEXT_CONSOLE
1110 {
1111     PBL_TEXT_CONSOLE_VTABLE Callbacks;
1112     BL_DISPLAY_STATE State;
1113     BL_DISPLAY_MODE DisplayMode;
1114     BOOLEAN Active;
1115     EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL* Protocol;
1116     ULONG Mode;
1117     EFI_SIMPLE_TEXT_OUTPUT_MODE OldMode;
1118 } BL_TEXT_CONSOLE, *PBL_TEXT_CONSOLE;
1119 
1120 typedef struct _BL_INPUT_CONSOLE_VTABLE
1121 {
1122     PCONSOLE_DESTRUCT Destruct;
1123     PCONSOLE_REINITIALIZE Reinitialize;
1124     //PCONSOLE_IS_KEY_PENDING IsKeyPending;
1125     //PCONSOLE_READ_INPUT ReadInput;
1126     //PCONSOLE_ERASE_BUFFER EraseBuffer;
1127     //PCONSOLE_FILL_BUFFER FillBuffer;
1128 } BL_INPUT_CONSOLE_VTABLE, *PBL_INPUT_CONSOLE_VTABLE;
1129 
1130 typedef struct _BL_INPUT_CONSOLE
1131 {
1132     PBL_INPUT_CONSOLE_VTABLE Callbacks;
1133     PULONG Buffer;
1134     PULONG DataStart;
1135     PULONG DataEnd;
1136     PULONG EndBuffer;
1137 } BL_INPUT_CONSOLE, *PBL_INPUT_CONSOLE;
1138 
1139 typedef enum _BL_GRAPHICS_CONSOLE_TYPE
1140 {
1141     BlGopConsole,
1142     BlUgaConsole
1143 } BL_GRAPHICS_CONSOLE_TYPE;
1144 
1145 typedef struct _BL_GRAPHICS_CONSOLE
1146 {
1147     BL_TEXT_CONSOLE TextConsole;
1148     BL_DISPLAY_MODE DisplayMode;
1149     ULONG PixelDepth;
1150     ULONG FgColor;
1151     ULONG BgColor;
1152     BL_DISPLAY_MODE OldDisplayMode;
1153     ULONG OldPixelDepth;
1154     EFI_HANDLE Handle;
1155     BL_GRAPHICS_CONSOLE_TYPE Type;
1156     EFI_GRAPHICS_OUTPUT_PROTOCOL* Protocol;
1157     PVOID FrameBuffer;
1158     ULONG FrameBufferSize;
1159     ULONG PixelsPerScanLine;
1160     ULONG Mode;
1161     ULONG OldMode;
1162 } BL_GRAPHICS_CONSOLE, *PBL_GRAPHICS_CONSOLE;
1163 
1164 typedef struct _BL_REMOTE_CONSOLE
1165 {
1166     BL_TEXT_CONSOLE TextConsole;
1167 } BL_REMOTE_CONSOLE, *PBL_REMOTE_CONSOLE;
1168 
1169 typedef struct _BL_HASH_TABLE
1170 {
1171     PLIST_ENTRY HashLinks;
1172     ULONG Size;
1173     PBL_HASH_TABLE_COMPARE_FUNCTION CompareFunction;
1174     PBL_HASH_TABLE_HASH_FUNCTION HashFunction;
1175 } BL_HASH_TABLE, *PBL_HASH_TABLE;
1176 
1177 typedef struct _BL_HASH_ENTRY
1178 {
1179     ULONG Size;
1180     ULONG Flags;
1181     PVOID Value;
1182 } BL_HASH_ENTRY, *PBL_HASH_ENTRY;
1183 
1184 typedef struct _BL_HASH_VALUE
1185 {
1186     ULONG DataSize;
1187     PVOID Data;
1188 } BL_HASH_VALUE, *PBL_HASH_VALUE;
1189 
1190 typedef struct _BL_HASH_NODE
1191 {
1192     LIST_ENTRY ListEntry;
1193     BL_HASH_ENTRY Entry;
1194     BL_HASH_VALUE Value;
1195 } BL_HASH_NODE, *PBL_HASH_NODE;
1196 
1197 typedef struct _BL_BLOCK_DEVICE_INFORMATION
1198 {
1199     BL_LOCAL_DEVICE_TYPE Type;
1200     ULONG DeviceFlags;
1201     ULONG Unknown;
1202     BL_PARTITION_TYPE PartitionType;
1203     ULONG BlockSize;
1204     ULONG Alignment;
1205     ULONGLONG LastBlock;
1206     ULONGLONG Offset;
1207     ULONG Block;
1208     struct
1209     {
1210         union
1211         {
1212             struct
1213             {
1214                 ULONG Signature;
1215             } Mbr;
1216             struct
1217             {
1218                 GUID Signature;
1219             } Gpt;
1220         };
1221     } Disk;
1222 } BL_BLOCK_DEVICE_INFORMATION, *PBL_BLOCK_DEVICE_INFORMATION;
1223 
1224 typedef struct _BL_DEVICE_INFORMATION
1225 {
1226     BL_DEVICE_TYPE DeviceType;
1227     union
1228     {
1229         BL_BLOCK_DEVICE_INFORMATION BlockDeviceInfo;
1230     };
1231 } BL_DEVICE_INFORMATION, *PBL_DEVICE_INFORMATION;
1232 
1233 typedef struct _BL_BLOCK_DEVICE
1234 {
1235     BL_BLOCK_DEVICE_INFORMATION;
1236     ULONGLONG StartOffset;
1237     EFI_BLOCK_IO* Protocol;
1238     EFI_HANDLE Handle;
1239 } BL_BLOCK_DEVICE, *PBL_BLOCK_DEVICE;
1240 
1241 typedef struct _BL_PROTOCOL_HANDLE
1242 {
1243     EFI_HANDLE Handle;
1244     PVOID Interface;
1245 } BL_PROTOCOL_HANDLE, *PBL_PROTOCOL_HANDLE;
1246 
1247 typedef struct _BL_DEVICE_CALLBACKS
1248 {
1249     PBL_DEVICE_ENUMERATE_DEVICE_CLASS EnumerateDeviceClass;
1250     PBL_DEVICE_OPEN Open;
1251     PBL_DEVICE_CLOSE Close;
1252     PBL_DEVICE_READ Read;
1253     PBL_DEVICE_WRITE Write;
1254     PBL_DEVICE_GET_INFORMATION GetInformation;
1255     PBL_DEVICE_SET_INFORMATION SetInformation;
1256     PBL_DEVICE_RESET Reset;
1257     PBL_DEVICE_FLUSH Flush;
1258     PBL_DEVICE_CREATE Create;
1259 } BL_DEVICE_CALLBACKS, *PBL_DEVICE_CALLBACKS;
1260 
1261 typedef struct _BL_DEVICE_ENTRY
1262 {
1263     ULONG DeviceId;
1264     ULONG Flags;
1265     ULONG Unknown;
1266     ULONG ReferenceCount;
1267     BL_DEVICE_CALLBACKS Callbacks;
1268     PVOID DeviceSpecificData;
1269     PBL_DEVICE_DESCRIPTOR DeviceDescriptor;
1270 } BL_DEVICE_ENTRY, *PBL_DEVICE_ENTRY;
1271 
1272 typedef struct _BL_IMG_FILE
1273 {
1274     UCHAR Flags;
1275     union
1276     {
1277         PVOID BaseAddress;
1278         ULONG FileId;
1279     };
1280     ULONG FileSize;
1281     PWCHAR FileName;
1282 } BL_IMG_FILE, *PBL_IMG_FILE;
1283 
1284 typedef struct _BL_IMAGE_APPLICATION_ENTRY
1285 {
1286     PBL_APPLICATION_ENTRY AppEntry;
1287     PVOID ImageBase;
1288     ULONG ImageSize;
1289 } BL_IMAGE_APPLICATION_ENTRY, *PBL_IMAGE_APPLICATION_ENTRY;
1290 
1291 typedef struct _BL_BUFFER_DESCRIPTOR
1292 {
1293     PVOID Buffer;
1294     ULONG ActualSize;
1295     ULONG BufferSize;
1296 } BL_BUFFER_DESCRIPTOR, *PBL_BUFFER_DESCRIPTOR;
1297 
1298 typedef struct _BL_DEFERRED_FONT_FILE
1299 {
1300     LIST_ENTRY ListEntry;
1301     ULONG Flags;
1302     PBL_DEVICE_DESCRIPTOR Device;
1303     PWCHAR FontPath;
1304 } BL_DEFERRED_FONT_FILE, *PBL_DEFERRED_FONT_FILE;
1305 
1306 #pragma pack(push)
1307 #pragma pack(1)
1308 typedef struct _BMP_HEADER
1309 {
1310     USHORT Signature;
1311     ULONG Size;
1312     USHORT Reserved[2];
1313     ULONG Offset;
1314 } BMP_HEADER, *PBMP_HEADER;
1315 
1316 typedef struct _DIB_HEADER
1317 {
1318     ULONG Size;
1319     ULONG Width;
1320     ULONG Height;
1321     USHORT Planes;
1322     USHORT BitCount;
1323     ULONG Compression;
1324     ULONG SizeImage;
1325     ULONG XPelsPerMeter;
1326     ULONG YPelsPerMEter;
1327     ULONG ClrUsed;
1328     ULONG ClrImportant;
1329 } DIB_HEADER, *PDIB_HEADER;
1330 
1331 typedef struct _BITMAP
1332 {
1333     BMP_HEADER BmpHeader;
1334     DIB_HEADER DibHeader;
1335 } BITMAP, *PBITMAP;
1336 #pragma pack(pop)
1337 
1338 typedef struct _COORD
1339 {
1340     ULONG X;
1341     ULONG Y;
1342 } COORD, *PCOORD;
1343 
1344 typedef struct _BL_PD_DATA_BLOB
1345 {
1346     PVOID Data;
1347     ULONG DataSize;
1348     ULONG BlobSize;
1349 } BL_PD_DATA_BLOB, *PBL_PD_DATA_BLOB;
1350 
1351 /* INLINE ROUTINES ***********************************************************/
1352 
1353 FORCEINLINE
1354 VOID
1355 BlSetupDefaultParameters (
1356     _Out_ PBL_LIBRARY_PARAMETERS LibraryParameters
1357     )
1358 {
1359     BL_LIBRARY_PARAMETERS DefaultParameters =
1360     {
1361         0x20,
1362         BlVirtual,
1363         1024,
1364         2 * 1024 * 1024,
1365         0,
1366         NULL,
1367         0,
1368         NULL
1369     };
1370 
1371     /* Copy the defaults */
1372     RtlCopyMemory(LibraryParameters, &DefaultParameters, sizeof(*LibraryParameters));
1373 }
1374 
1375 FORCEINLINE
1376 VOID
1377 MmMdInitializeListHead (
1378     _In_ PBL_MEMORY_DESCRIPTOR_LIST List
1379     )
1380 {
1381     /* Initialize the list */
1382     InitializeListHead(&List->ListHead);
1383     List->First = &List->ListHead;
1384     List->This = NULL;
1385     List->Type = 0;
1386 }
1387 
1388 FORCEINLINE
1389 PVOID
1390 PhysicalAddressToPtr (
1391     _In_ PHYSICAL_ADDRESS PhysicalAddress)
1392 {
1393     return (PVOID)(ULONG_PTR)PhysicalAddress.QuadPart;
1394 }
1395 
1396 /* INITIALIZATION ROUTINES ***************************************************/
1397 
1398 NTSTATUS
1399 BlInitializeLibrary(
1400     _In_ PBOOT_APPLICATION_PARAMETER_BLOCK BootAppParameters,
1401     _In_ PBL_LIBRARY_PARAMETERS LibraryParameters
1402     );
1403 
1404 NTSTATUS
1405 BlpArchInitialize (
1406     _In_ ULONG Phase
1407     );
1408 
1409 NTSTATUS
1410 BlpFwInitialize (
1411     _In_ ULONG Phase,
1412     _In_ PBL_FIRMWARE_DESCRIPTOR FirmwareParameters
1413     );
1414 
1415 NTSTATUS
1416 BlpMmInitialize (
1417     _In_ PBL_MEMORY_DATA MemoryData,
1418     _In_ BL_TRANSLATION_TYPE TranslationType,
1419     _In_ PBL_LIBRARY_PARAMETERS LibraryParameters
1420     );
1421 
1422 NTSTATUS
1423 MmBaInitialize (
1424     VOID
1425     );
1426 
1427 NTSTATUS
1428 MmPaInitialize (
1429     _In_ PBL_MEMORY_DATA MemoryData,
1430     _In_ ULONG MinimumPages
1431     );
1432 
1433 NTSTATUS
1434 MmArchInitialize (
1435     _In_ ULONG Phase,
1436     _In_ PBL_MEMORY_DATA MemoryData,
1437     _In_ BL_TRANSLATION_TYPE TranslationType,
1438     _In_ BL_TRANSLATION_TYPE LibraryTranslationType
1439     );
1440 
1441 NTSTATUS
1442 MmHaInitialize (
1443     _In_ ULONG HeapSize,
1444     _In_ ULONG HeapAttributes
1445     );
1446 
1447 VOID
1448 MmMdInitialize (
1449     _In_ ULONG Phase,
1450     _In_ PBL_LIBRARY_PARAMETERS LibraryParameters
1451     );
1452 
1453 NTSTATUS
1454 BlpDeviceInitialize (
1455     VOID
1456     );
1457 
1458 NTSTATUS
1459 BlpIoInitialize (
1460     VOID
1461     );
1462 
1463 NTSTATUS
1464 BlpFileInitialize (
1465     VOID
1466     );
1467 
1468 NTSTATUS
1469 BlpDisplayInitialize (
1470     _In_ ULONG Flags
1471     );
1472 
1473 NTSTATUS
1474 BlpDisplayReinitialize (
1475     VOID
1476     );
1477 
1478 VOID
1479 BlDestroyLibrary (
1480     VOID
1481     );
1482 
1483 NTSTATUS
1484 BcInitialize (
1485     VOID
1486     );
1487 
1488 /* FIRMWARE ROUTINES *********************************************************/
1489 
1490 VOID
1491 EfiPrintf (
1492     _In_ PWCHAR Format,
1493     ...
1494     );
1495 
1496 NTSTATUS
1497 BlFwGetParameters(
1498     _In_ PBL_FIRMWARE_DESCRIPTOR Parameters
1499     );
1500 
1501 NTSTATUS
1502 BlFwEnumerateDevice (
1503     _In_ PBL_DEVICE_DESCRIPTOR Device
1504     );
1505 
1506 NTSTATUS
1507 EfiAllocatePages (
1508     _In_ ULONG Type,
1509     _In_ ULONG Pages,
1510     _Inout_ EFI_PHYSICAL_ADDRESS* Memory
1511     );
1512 
1513 NTSTATUS
1514 EfiStall (
1515     _In_ ULONG StallTime
1516     );
1517 
1518 NTSTATUS
1519 EfiConInExReset (
1520     VOID
1521     );
1522 
1523 NTSTATUS
1524 EfiConInReset (
1525     VOID
1526     );
1527 
1528 NTSTATUS
1529 EfiConOutOutputString (
1530     _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface,
1531     _In_ PWCHAR String
1532     );
1533 
1534 NTSTATUS
1535 EfiConOutQueryMode (
1536     _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface,
1537     _In_ ULONG Mode,
1538     _In_ UINTN* Columns,
1539     _In_ UINTN* Rows
1540     );
1541 
1542 NTSTATUS
1543 EfiConOutSetMode (
1544     _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface,
1545     _In_ ULONG Mode
1546     );
1547 
1548 VOID
1549 EfiConOutReadCurrentMode (
1550     _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface,
1551     _Out_ EFI_SIMPLE_TEXT_OUTPUT_MODE* Mode
1552     );
1553 
1554 NTSTATUS
1555 EfiConOutSetAttribute (
1556     _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface,
1557     _In_ ULONG Attribute
1558     );
1559 
1560 NTSTATUS
1561 EfiConOutSetCursorPosition (
1562     _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface,
1563     _In_ ULONG Column,
1564     _In_ ULONG Row
1565     );
1566 
1567 NTSTATUS
1568 EfiConOutEnableCursor (
1569     _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface,
1570     _In_ BOOLEAN Visible
1571     );
1572 
1573 NTSTATUS
1574 EfiLocateHandleBuffer (
1575     _In_ EFI_LOCATE_SEARCH_TYPE SearchType,
1576     _In_ EFI_GUID *Protocol,
1577     _Inout_ PULONG HandleCount,
1578     _Inout_ EFI_HANDLE** Buffer
1579     );
1580 
1581 NTSTATUS
1582 EfiOpenProtocol (
1583     _In_ EFI_HANDLE Handle,
1584     _In_ EFI_GUID *Protocol,
1585     _Out_ PVOID* Interface
1586     );
1587 
1588 NTSTATUS
1589 EfiCloseProtocol (
1590     _In_ EFI_HANDLE Handle,
1591     _In_ EFI_GUID *Protocol
1592     );
1593 
1594 NTSTATUS
1595 EfiGopGetCurrentMode (
1596     _In_ EFI_GRAPHICS_OUTPUT_PROTOCOL *GopInterface,
1597     _Out_ UINTN* Mode,
1598     _Out_ EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Information
1599     );
1600 
1601 NTSTATUS
1602 EfiGopSetMode (
1603     _In_ EFI_GRAPHICS_OUTPUT_PROTOCOL *GopInterface,
1604     _In_ ULONG Mode
1605     );
1606 
1607 VOID
1608 EfiGopGetFrameBuffer (
1609     _In_ EFI_GRAPHICS_OUTPUT_PROTOCOL *GopInterface,
1610     _Out_ PHYSICAL_ADDRESS* FrameBuffer,
1611     _Out_ UINTN *FrameBufferSize
1612     );
1613 
1614 VOID
1615 EfiResetSystem (
1616     _In_ EFI_RESET_TYPE ResetType
1617     );
1618 
1619 EFI_DEVICE_PATH*
1620 EfiGetLeafNode (
1621     _In_ EFI_DEVICE_PATH *DevicePath
1622     );
1623 
1624 EFI_DEVICE_PATH *
1625 EfiIsDevicePathParent (
1626     _In_ EFI_DEVICE_PATH *DevicePath1,
1627     _In_ EFI_DEVICE_PATH *DevicePath2
1628     );
1629 
1630 NTSTATUS
1631 EfipGetRsdt (
1632     _Out_ PPHYSICAL_ADDRESS FoundRsdt
1633     );
1634 
1635 NTSTATUS
1636 EfiFreePages (
1637     _In_ ULONG Pages,
1638     _In_ EFI_PHYSICAL_ADDRESS PhysicalAddress
1639     );
1640 
1641 /* PLATFORM TIMER ROUTINES ***************************************************/
1642 
1643 NTSTATUS
1644 BlpTimeCalibratePerformanceCounter (
1645     VOID
1646     );
1647 
1648 ULONGLONG
1649 BlTimeQueryPerformanceCounter (
1650     _Out_opt_ PLARGE_INTEGER Frequency
1651     );
1652 
1653 ULONGLONG
1654 BlArchGetPerformanceCounter (
1655     VOID
1656     );
1657 
1658 /* RESOURCE LOCALE INTERNATIONALIZATION ROUTINES *****************************/
1659 
1660 NTSTATUS
1661 BlpDisplayRegisterLocale (
1662     _In_ PWCHAR Locale
1663     );
1664 
1665 /* FONT ROUTINES *************************************************************/
1666 
1667 VOID
1668 BfiFreeDeferredFontFile (
1669     _In_ PBL_DEFERRED_FONT_FILE DeferredFontFile
1670     );
1671 
1672 NTSTATUS
1673 BfLoadFontFile (
1674     _In_ PBL_DEVICE_DESCRIPTOR Device,
1675     _In_ PWCHAR FontPath
1676     );
1677 
1678 NTSTATUS
1679 BfLoadDeferredFontFiles (
1680     VOID
1681     );
1682 
1683 NTSTATUS
1684 BfClearScreen  (
1685     _In_ PBL_GRAPHICS_CONSOLE Console
1686     );
1687 
1688 NTSTATUS
1689 BfClearToEndOfLine (
1690     _In_ PBL_GRAPHICS_CONSOLE Console
1691     );
1692 
1693 /* FILESYSTEM ROUTINES *******************************************************/
1694 
1695 NTSTATUS
1696 FatInitialize (
1697     VOID
1698     );
1699 
1700 NTSTATUS
1701 FatMount (
1702     _In_ ULONG DeviceId,
1703     _In_ ULONG Unknown,
1704     _Out_ PBL_FILE_ENTRY* FileEntry
1705     );
1706 
1707 NTSTATUS
1708 EtfsInitialize (
1709     VOID
1710     );
1711 
1712 NTSTATUS
1713 EtfsMount (
1714     _In_ ULONG DeviceId,
1715     _In_ ULONG Unknown,
1716     _Out_ PBL_FILE_ENTRY* FileEntry
1717     );
1718 
1719 /* DEBUG ROUTINES ************************************************************/
1720 
1721 BOOLEAN
1722 BlBdDebuggerEnabled (
1723     VOID
1724     );
1725 
1726 NTSTATUS
1727 BlBdPullRemoteFile (
1728     _In_ PWCHAR FilePath,
1729     _Out_ PVOID BaseAddress,
1730     _Out_ PULONGLONG FileSize
1731     );
1732 
1733 VOID
1734 BlStatusPrint (
1735     _In_ PCWCH Format,
1736     ...
1737     );
1738 
1739 VOID
1740 BlStatusError (
1741     _In_ ULONG ErrorCode,
1742     _In_ ULONG Parameter1,
1743     _In_ ULONG_PTR Parameter2,
1744     _In_ ULONG_PTR Parameter3,
1745     _In_ ULONG_PTR Parameter4
1746     );
1747 
1748 /* UTILITY ROUTINES **********************************************************/
1749 
1750 VOID
1751 BlArchCpuId (
1752     _In_ ULONG Function,
1753     _In_ ULONG SubFunction,
1754     _Out_ PCPU_INFO Result
1755     );
1756 
1757 CPU_VENDORS
1758 BlArchGetCpuVendor (
1759     VOID
1760     );
1761 
1762 BOOLEAN
1763 BlArchIsCpuIdFunctionSupported (
1764     _In_ ULONG Function
1765     );
1766 
1767 VOID
1768 BlUtlUpdateProgress (
1769     _In_ ULONG Percentage,
1770     _Out_opt_ PBOOLEAN Completed
1771     );
1772 
1773 NTSTATUS
1774 BlUtlGetAcpiTable (
1775     _Out_ PVOID* TableAddress,
1776     _In_ ULONG Signature
1777     );
1778 
1779 NTSTATUS
1780 BlUtlInitialize (
1781     VOID
1782     );
1783 
1784 NTSTATUS
1785 BlUtlRegisterProgressRoutine (
1786     VOID
1787     );
1788 
1789 ULONG
1790 BlUtlCheckSum (
1791     _In_ ULONG PartialSum,
1792     _In_ PUCHAR Buffer,
1793     _In_ ULONG Length,
1794     _In_ ULONG Flags
1795     );
1796 
1797 NTSTATUS
1798 BlGetApplicationBaseAndSize (
1799     _Out_ PVOID* ImageBase,
1800     _Out_ PULONG ImageSize
1801     );
1802 
1803 VOID
1804 BlDestroyBootEntry (
1805     _In_ PBL_LOADED_APPLICATION_ENTRY AppEntry
1806     );
1807 
1808 NTSTATUS
1809 BlPdQueryData (
1810     _In_ const GUID* DataGuid,
1811     _In_ PVOID Unknown,
1812     _Inout_ PBL_PD_DATA_BLOB DataBlob
1813     );
1814 
1815 /* FIRMWARE UTILITY ROUTINES *************************************************/
1816 
1817 EFI_STATUS
1818 EfiGetEfiStatusCode(
1819     _In_ NTSTATUS Status
1820     );
1821 
1822 NTSTATUS
1823 EfiGetNtStatusCode (
1824     _In_ EFI_STATUS EfiStatus
1825     );
1826 
1827 VOID
1828 BlFwReboot (
1829     VOID
1830     );
1831 
1832 NTSTATUS
1833 MmFwFreePages (
1834     _In_ ULONG BasePage,
1835     _In_ ULONG PageCount
1836     );
1837 
1838 PGUID
1839 BlGetApplicationIdentifier (
1840     VOID
1841     );
1842 
1843 NTSTATUS
1844 BlpSecureBootEFIIsEnabled (
1845     VOID
1846     );
1847 
1848 NTSTATUS
1849 BlSecureBootIsEnabled (
1850     _Out_ PBOOLEAN SecureBootEnabled
1851     );
1852 
1853 NTSTATUS
1854 BlSecureBootCheckForFactoryReset (
1855     VOID
1856     );
1857 
1858 /* RESOURCE ROUTINES *********************************************************/
1859 
1860 PWCHAR
1861 BlResourceFindMessage (
1862     _In_ ULONG MsgId
1863     );
1864 
1865 PWCHAR
1866 BlResourceFindHtml (
1867     VOID
1868     );
1869 
1870 NTSTATUS
1871 BlpResourceInitialize (
1872     VOID
1873     );
1874 
1875 /* TABLE ROUTINES ************************************************************/
1876 
1877 NTSTATUS
1878 BlTblMap (
1879     _In_ PVOID *Table,
1880     _In_ ULONG Count,
1881     _In_ PBL_TBL_MAP_ROUTINE MapCallback
1882     );
1883 
1884 PVOID
1885 BlTblFindEntry (
1886     _In_ PVOID *Table,
1887     _In_ ULONG Count,
1888     _Out_ PULONG EntryIndex,
1889     _In_ PBL_TBL_LOOKUP_ROUTINE Callback,
1890     _In_ PVOID Argument1,
1891     _In_ PVOID Argument2,
1892     _In_ PVOID Argument3,
1893     _In_ PVOID Argument4
1894     );
1895 
1896 NTSTATUS
1897 BlTblSetEntry (
1898     _Inout_ PVOID** Table,
1899     _Inout_ PULONG Count,
1900     _In_ PVOID Entry,
1901     _Out_ PULONG EntryIndex,
1902     _In_ PBL_TBL_SET_ROUTINE Callback
1903     );
1904 
1905 NTSTATUS
1906 TblDoNotPurgeEntry (
1907     _In_ PVOID Entry
1908     );
1909 
1910 /* HASH TABLE ROUTINES *******************************************************/
1911 
1912 NTSTATUS
1913 BlHtStore (
1914     _In_ ULONG TableId,
1915     _In_ PBL_HASH_ENTRY Entry,
1916     _In_ PVOID Data,
1917     _In_ ULONG DataSize
1918     );
1919 
1920 NTSTATUS
1921 BlHtDelete (
1922     _In_ ULONG TableId,
1923     _In_ PBL_HASH_ENTRY Entry
1924     );
1925 
1926 NTSTATUS
1927 BlHtLookup (
1928     _In_ ULONG TableId,
1929     _In_ PBL_HASH_ENTRY Entry,
1930     _Out_ PBL_HASH_VALUE *Value
1931     );
1932 
1933 NTSTATUS
1934 BlHtCreate (
1935     _In_ ULONG Size,
1936     _In_ PBL_HASH_TABLE_HASH_FUNCTION HashFunction,
1937     _In_ PBL_HASH_TABLE_COMPARE_FUNCTION CompareFunction,
1938     _Out_ PULONG Id
1939     );
1940 
1941 /* BCD OPTION ROUTINES *******************************************************/
1942 
1943 PBL_BCD_OPTION
1944 MiscGetBootOption (
1945     _In_ PBL_BCD_OPTION List,
1946     _In_ ULONG Type
1947     );
1948 
1949 ULONG
1950 BlGetBootOptionListSize (
1951     _In_ PBL_BCD_OPTION BcdOption
1952     );
1953 
1954 ULONG
1955 BlGetBootOptionSize (
1956     _In_ PBL_BCD_OPTION BcdOption
1957     );
1958 
1959 NTSTATUS
1960 BlGetBootOptionString (
1961     _In_ PBL_BCD_OPTION List,
1962     _In_ ULONG Type,
1963     _Out_ PWCHAR* Value
1964     );
1965 
1966 NTSTATUS
1967 BlGetBootOptionInteger (
1968     _In_ PBL_BCD_OPTION List,
1969     _In_ ULONG Type,
1970     _Out_ PULONGLONG Value
1971     );
1972 
1973 NTSTATUS
1974 BlGetBootOptionBoolean (
1975     _In_ PBL_BCD_OPTION List,
1976     _In_ ULONG Type,
1977     _Out_ PBOOLEAN Value
1978     );
1979 
1980 NTSTATUS
1981 BlpGetBootOptionIntegerList (
1982     _In_ PBL_BCD_OPTION List,
1983     _In_ ULONG Type,
1984     _Out_ PULONGLONG* Value,
1985     _Out_ PULONGLONG Count,
1986     _In_ BOOLEAN NoCopy
1987     );
1988 
1989 NTSTATUS
1990 BlGetBootOptionDevice (
1991     _In_ PBL_BCD_OPTION List,
1992     _In_ ULONG Type,
1993     _Out_ PBL_DEVICE_DESCRIPTOR* Value,
1994     _In_opt_ PBL_BCD_OPTION* ExtraOptions
1995     );
1996 
1997 NTSTATUS
1998 BlGetBootOptionGuid (
1999     _In_ PBL_BCD_OPTION List,
2000     _In_ ULONG Type,
2001     _Out_ PGUID Value
2002     );
2003 
2004 NTSTATUS
2005 BlGetBootOptionGuidList (
2006     _In_ PBL_BCD_OPTION List,
2007     _In_ ULONG Type,
2008     _Out_ PGUID *Value,
2009     _In_ PULONG Count
2010     );
2011 
2012 NTSTATUS
2013 BlCopyBootOptions (
2014     _In_ PBL_BCD_OPTION OptionList,
2015     _Out_ PBL_BCD_OPTION *CopiedOptions
2016     );
2017 
2018 NTSTATUS
2019 BlAppendBootOptionBoolean (
2020     _In_ PBL_LOADED_APPLICATION_ENTRY AppEntry,
2021     _In_ ULONG OptionId,
2022     _In_ BOOLEAN Value
2023     );
2024 
2025 NTSTATUS
2026 BlAppendBootOptionInteger (
2027     _In_ PBL_LOADED_APPLICATION_ENTRY AppEntry,
2028     _In_ ULONG OptionId,
2029     _In_ ULONGLONG Value
2030     );
2031 
2032 NTSTATUS
2033 BlAppendBootOptionString (
2034     _In_ PBL_LOADED_APPLICATION_ENTRY AppEntry,
2035     _In_ ULONG OptionId,
2036     _In_ PWCHAR OptionString
2037     );
2038 
2039 NTSTATUS
2040 BlAppendBootOptions (
2041     _In_ PBL_LOADED_APPLICATION_ENTRY AppEntry,
2042     _In_ PBL_BCD_OPTION Options
2043     );
2044 
2045 VOID
2046 BlRemoveBootOption (
2047     _In_ PBL_BCD_OPTION List,
2048     _In_ ULONG Type
2049     );
2050 
2051 NTSTATUS
2052 BlReplaceBootOptions (
2053     _In_ PBL_LOADED_APPLICATION_ENTRY AppEntry,
2054     _In_ PBL_BCD_OPTION NewOptions
2055     );
2056 
2057 /* BOOT REGISTRY ROUTINES ****************************************************/
2058 
2059 VOID
2060 BiCloseKey (
2061     _In_ HANDLE KeyHandle
2062     );
2063 
2064 NTSTATUS
2065 BiOpenKey(
2066     _In_ HANDLE ParentHandle,
2067     _In_ PWCHAR KeyName,
2068     _Out_ PHANDLE Handle
2069     );
2070 
2071 NTSTATUS
2072 BiLoadHive (
2073     _In_ PBL_FILE_PATH_DESCRIPTOR FilePath,
2074     _Out_ PHANDLE HiveHandle
2075     );
2076 
2077 NTSTATUS
2078 BiGetRegistryValue (
2079     _In_ HANDLE KeyHandle,
2080     _In_ PWCHAR ValueName,
2081     _In_ ULONG Type,
2082     _Out_ PVOID* Buffer,
2083     _Out_ PULONG ValueLength
2084     );
2085 
2086 NTSTATUS
2087 BiEnumerateSubKeys (
2088     _In_ HANDLE KeyHandle,
2089     _Out_ PWCHAR** SubKeyList,
2090     _Out_ PULONG SubKeyCount
2091     );
2092 
2093 NTSTATUS
2094 BiDeleteKey (
2095     _In_ HANDLE KeyHandle
2096     );
2097 
2098 VOID
2099 BiDereferenceHive (
2100     _In_ HANDLE KeyHandle
2101     );
2102 
2103 /* CONTEXT ROUTINES **********************************************************/
2104 
2105 VOID
2106 BlpArchSwitchContext (
2107     _In_ BL_ARCH_MODE NewMode
2108     );
2109 
2110 VOID
2111 BlpArchEnableTranslation (
2112     VOID
2113     );
2114 
2115 VOID
2116 Archx86TransferTo32BitApplicationAsm (
2117     VOID
2118     );
2119 
2120 /* MEMORY DESCRIPTOR ROUTINES ************************************************/
2121 
2122 VOID
2123 MmMdDbgDumpList (
2124     _In_ PBL_MEMORY_DESCRIPTOR_LIST DescriptorList,
2125     _In_opt_ ULONG MaxCount
2126 );
2127 
2128 VOID
2129 MmMdInitializeList (
2130     _In_ PBL_MEMORY_DESCRIPTOR_LIST DescriptorList,
2131     _In_ ULONG Type,
2132     _In_ PLIST_ENTRY ListHead
2133     );
2134 
2135 PBL_MEMORY_DESCRIPTOR
2136 MmMdFindDescriptor (
2137     _In_ ULONG WhichList,
2138     _In_ ULONG Flags,
2139     _In_ ULONGLONG Page
2140     );
2141 
2142 PBL_MEMORY_DESCRIPTOR
2143 MmMdFindDescriptorFromMdl (
2144     _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList,
2145     _In_ ULONG Flags,
2146     _In_ ULONGLONG Page
2147     );
2148 
2149 NTSTATUS
2150 MmMdCopyList (
2151     _In_ PBL_MEMORY_DESCRIPTOR_LIST DestinationList,
2152     _In_ PBL_MEMORY_DESCRIPTOR_LIST SourceList,
2153     _In_opt_ PBL_MEMORY_DESCRIPTOR ListDescriptor,
2154     _Out_ PULONG ActualCount,
2155     _In_ ULONG Count,
2156     _In_ ULONG Flags
2157     );
2158 
2159 ULONG
2160 MmMdCountList (
2161     _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList
2162     );
2163 
2164 VOID
2165 MmMdFreeList(
2166     _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList
2167     );
2168 
2169 PBL_MEMORY_DESCRIPTOR
2170 MmMdInitByteGranularDescriptor (
2171     _In_ ULONG Flags,
2172     _In_ BL_MEMORY_TYPE Type,
2173     _In_ ULONGLONG BasePage,
2174     _In_ ULONGLONG VirtualPage,
2175     _In_ ULONGLONG PageCount
2176     );
2177 
2178 VOID
2179 MmMdFreeGlobalDescriptors (
2180     VOID
2181     );
2182 
2183 NTSTATUS
2184 MmMdAddDescriptorToList (
2185     _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList,
2186     _In_ PBL_MEMORY_DESCRIPTOR MemoryDescriptor,
2187     _In_ ULONG Flags
2188     );
2189 
2190 NTSTATUS
2191 MmMdTruncateDescriptors (
2192     _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList,
2193     _In_ PBL_MEMORY_DESCRIPTOR_LIST NewList,
2194     _In_ ULONGLONG BasePage
2195     );
2196 
2197 VOID
2198 MmMdRemoveDescriptorFromList (
2199     _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList,
2200     _In_ PBL_MEMORY_DESCRIPTOR Entry
2201     );
2202 
2203 BOOLEAN
2204 MmMdFindSatisfyingRegion (
2205     _In_ PBL_MEMORY_DESCRIPTOR Descriptor,
2206     _Out_ PBL_MEMORY_DESCRIPTOR NewDescriptor,
2207     _In_ ULONGLONG Pages,
2208     _In_ PBL_ADDRESS_RANGE BaseRange,
2209     _In_ PBL_ADDRESS_RANGE VirtualRange,
2210     _In_ BOOLEAN TopDown,
2211     _In_ BL_MEMORY_TYPE MemoryType,
2212     _In_ ULONG Flags,
2213     _In_ ULONG Alignment
2214     );
2215 
2216 NTSTATUS
2217 MmMdRemoveRegionFromMdlEx (
2218     __in PBL_MEMORY_DESCRIPTOR_LIST MdList,
2219     __in ULONG Flags,
2220     __in ULONGLONG BasePage,
2221     __in ULONGLONG PageCount,
2222     __in PBL_MEMORY_DESCRIPTOR_LIST NewMdList
2223     );
2224 
2225 NTSTATUS
2226 MmMdFreeDescriptor (
2227     _In_ PBL_MEMORY_DESCRIPTOR MemoryDescriptor
2228     );
2229 
2230 /* PAGE ALLOCATOR ROUTINES ***************************************************/
2231 
2232 NTSTATUS
2233 MmPaTruncateMemory (
2234     _In_ ULONGLONG BasePage
2235     );
2236 
2237 NTSTATUS
2238 BlMmAllocatePhysicalPages(
2239     _Inout_ PPHYSICAL_ADDRESS Address,
2240     _In_ BL_MEMORY_TYPE MemoryType,
2241     _In_ ULONGLONG PageCount,
2242     _In_ ULONG Attributes,
2243     _In_ ULONG Alignment
2244     );
2245 
2246 NTSTATUS
2247 MmPapAllocatePhysicalPagesInRange (
2248     _Inout_ PPHYSICAL_ADDRESS BaseAddress,
2249     _In_ BL_MEMORY_TYPE MemoryType,
2250     _In_ ULONGLONG Pages,
2251     _In_ ULONG Attributes,
2252     _In_ ULONG Alignment,
2253     _In_ PBL_MEMORY_DESCRIPTOR_LIST NewList,
2254     _In_opt_ PBL_ADDRESS_RANGE Range,
2255     _In_ ULONG RangeType
2256     );
2257 
2258 NTSTATUS
2259 MmPaReleaseSelfMapPages (
2260     _In_ PHYSICAL_ADDRESS Address
2261     );
2262 
2263 NTSTATUS
2264 MmPaReserveSelfMapPages (
2265     _Inout_ PPHYSICAL_ADDRESS PhysicalAddress,
2266     _In_ ULONG Alignment,
2267     _In_ ULONG PageCount
2268     );
2269 
2270 NTSTATUS
2271 BlMmFreePhysicalPages (
2272     _In_ PHYSICAL_ADDRESS Address
2273     );
2274 
2275 NTSTATUS
2276 MmPapFreePages (
2277     _In_ PVOID Address,
2278     _In_ ULONG WhichList
2279     );
2280 
2281 NTSTATUS
2282 MmPapAllocatePagesInRange (
2283     _Inout_ PVOID* PhysicalAddress,
2284     _In_ BL_MEMORY_TYPE MemoryType,
2285     _In_ ULONGLONG Pages,
2286     _In_ ULONG Attributes,
2287     _In_ ULONG Alignment,
2288     _In_opt_ PBL_ADDRESS_RANGE Range,
2289     _In_ ULONG Type
2290     );
2291 
2292 NTSTATUS
2293 MmFwGetMemoryMap (
2294     _Out_ PBL_MEMORY_DESCRIPTOR_LIST MemoryMap,
2295     _In_ ULONG Flags
2296     );
2297 
2298 NTSTATUS
2299 BlpMmInitializeConstraints (
2300     VOID
2301     );
2302 
2303 NTSTATUS
2304 BlMmRemoveBadMemory (
2305     VOID
2306     );
2307 
2308 NTSTATUS
2309 BlMmGetMemoryMap (
2310     _In_ PLIST_ENTRY MemoryMap,
2311     _In_ PBL_BUFFER_DESCRIPTOR MemoryParameters,
2312     _In_ ULONG WhichTypes,
2313     _In_ ULONG Flags
2314     );
2315 
2316 /* VIRTUAL MEMORY ROUTINES ***************************************************/
2317 
2318 NTSTATUS
2319 MmSelectMappingAddress (
2320     _Out_ PVOID* MappingAddress,
2321     _In_ PVOID PreferredAddress,
2322     _In_ ULONGLONG Size,
2323     _In_ ULONG AllocationAttributes,
2324     _In_ ULONG Flags,
2325     _In_ PHYSICAL_ADDRESS PhysicalAddress
2326     );
2327 
2328 NTSTATUS
2329 MmMapPhysicalAddress (
2330     _Inout_ PPHYSICAL_ADDRESS PhysicalAddress,
2331     _Out_ PVOID* VirtualAddress,
2332     _Inout_ PULONGLONG Size,
2333     _In_ ULONG CacheAttributes
2334     );
2335 
2336 NTSTATUS
2337 MmUnmapVirtualAddress (
2338     _Inout_ PVOID* VirtualAddress,
2339     _Inout_ PULONGLONG Size
2340     );
2341 
2342 NTSTATUS
2343 BlMmMapPhysicalAddressEx (
2344     _In_ PVOID* VirtualAddress,
2345     _In_ ULONG Attributes,
2346     _In_ ULONGLONG Size,
2347     _In_ PHYSICAL_ADDRESS PhysicalAddress
2348     );
2349 
2350 NTSTATUS
2351 BlMmUnmapVirtualAddressEx (
2352     _In_ PVOID VirtualAddress,
2353     _In_ ULONGLONG Size
2354     );
2355 
2356 BOOLEAN
2357 BlMmTranslateVirtualAddress (
2358     _In_ PVOID VirtualAddress,
2359     _Out_ PPHYSICAL_ADDRESS PhysicalAddress
2360     );
2361 
2362 BOOLEAN
2363 MmArchTranslateVirtualAddress (
2364     _In_ PVOID VirtualAddress,
2365     _Out_opt_ PPHYSICAL_ADDRESS PhysicalAddress,
2366     _Out_opt_ PULONG CachingFlags
2367     );
2368 
2369 /* BLOCK ALLOCATOR ROUTINES **************************************************/
2370 
2371 NTSTATUS
2372 BlpMmCreateBlockAllocator (
2373     VOID
2374     );
2375 
2376 /* HEAP ALLOCATOR ROUTINES ***************************************************/
2377 
2378 PVOID
2379 BlMmAllocateHeap (
2380     _In_ SIZE_T Size
2381     );
2382 
2383 NTSTATUS
2384 BlMmFreeHeap (
2385     _In_ PVOID Buffer
2386     );
2387 
2388 /* DISPLAY ROUTINES **********************************************************/
2389 
2390 VOID
2391 BlDisplayGetTextCellResolution (
2392     _Out_ PULONG TextWidth,
2393     _Out_ PULONG TextHeight
2394     );
2395 
2396 NTSTATUS
2397 BlDisplaySetScreenResolution (
2398     VOID
2399     );
2400 
2401 NTSTATUS
2402 BlDisplayGetScreenResolution (
2403     _Out_ PULONG HRes,
2404     _Out_ PULONG Vres
2405     );
2406 
2407 VOID
2408 BlDisplayInvalidateOemBitmap (
2409     VOID
2410     );
2411 
2412 PBITMAP
2413 BlDisplayGetOemBitmap (
2414     _Out_ PCOORD Offset,
2415     _Out_opt_ PULONG Flags
2416     );
2417 
2418 BOOLEAN
2419 BlDisplayValidOemBitmap (
2420     VOID
2421     );
2422 
2423 NTSTATUS
2424 BlDisplayClearScreen (
2425     VOID
2426     );
2427 
2428 NTSTATUS
2429 BlDisplaySetCursorType (
2430     _In_ ULONG Type
2431     );
2432 
2433 /* I/O ROUTINES **************************************************************/
2434 
2435 NTSTATUS
2436 BlpIoRegisterDestroyRoutine (
2437     _In_ PBL_IO_DESTROY_ROUTINE DestroyRoutine
2438     );
2439 
2440 NTSTATUS
2441 BlDeviceClose (
2442     _In_ ULONG DeviceId
2443     );
2444 
2445 BOOLEAN
2446 BlDeviceIsVirtualPartitionDevice (
2447     _In_ PBL_DEVICE_DESCRIPTOR InputDevice,
2448     _Outptr_ PBL_DEVICE_DESCRIPTOR* VirtualDevice
2449     );
2450 
2451 NTSTATUS
2452 BlpDeviceOpen (
2453     _In_ PBL_DEVICE_DESCRIPTOR Device,
2454     _In_ ULONG Flags,
2455     _In_ ULONG Unknown,
2456     _Out_ PULONG DeviceId
2457     );
2458 
2459 NTSTATUS
2460 BlDeviceGetInformation (
2461     _In_ ULONG DeviceId,
2462     _Out_ PBL_DEVICE_INFORMATION DeviceInformation
2463     );
2464 
2465 NTSTATUS
2466 BlDeviceSetInformation (
2467     _In_ ULONG DeviceId,
2468     _In_ PBL_DEVICE_INFORMATION DeviceInformation
2469     );
2470 
2471 NTSTATUS
2472 BlDeviceReadAtOffset (
2473     _In_ ULONG DeviceId,
2474     _In_ ULONG Size,
2475     _In_ ULONGLONG Offset,
2476     _In_ PVOID Buffer,
2477     _Out_ PULONG BytesRead
2478     );
2479 
2480 /* IMAGE ROUTINES ************************************************************/
2481 
2482 NTSTATUS
2483 BlImgLoadImageWithProgress2 (
2484     _In_ ULONG DeviceId,
2485     _In_ BL_MEMORY_TYPE MemoryType,
2486     _In_ PWCHAR FileName,
2487     _Inout_ PVOID* MappedBase,
2488     _Inout_ PULONG MappedSize,
2489     _In_ ULONG ImageFlags,
2490     _In_ BOOLEAN ShowProgress,
2491     _Out_opt_ PUCHAR* HashBuffer,
2492     _Out_opt_ PULONG HashSize
2493     );
2494 
2495 PIMAGE_SECTION_HEADER
2496 BlImgFindSection (
2497     _In_ PVOID ImageBase,
2498     _In_ ULONG ImageSize
2499     );
2500 
2501 NTSTATUS
2502 BlImgLoadBootApplication (
2503     _In_ PBL_LOADED_APPLICATION_ENTRY BootEntry,
2504     _Out_ PULONG AppHandle
2505     );
2506 
2507 NTSTATUS
2508 BlImgStartBootApplication (
2509     _In_ ULONG AppHandle,
2510     _Inout_ PBL_RETURN_ARGUMENTS ReturnArguments
2511     );
2512 
2513 NTSTATUS
2514 BlImgUnloadBootApplication (
2515     _In_ ULONG AppHandle
2516     );
2517 
2518 VOID
2519 BlImgQueryCodeIntegrityBootOptions (
2520     _In_ PBL_LOADED_APPLICATION_ENTRY ApplicationEntry,
2521     _Out_ PBOOLEAN IntegrityChecksDisabled,
2522     _Out_ PBOOLEAN TestSigning
2523     );
2524 
2525 /* FILE I/O ROUTINES *********************************************************/
2526 
2527 NTSTATUS
2528 BlFileClose (
2529     _In_ ULONG FileId
2530     );
2531 
2532 NTSTATUS
2533 BlFileReadAtOffsetEx (
2534     _In_ ULONG FileId,
2535     _In_ ULONG Size,
2536     _In_ ULONGLONG ByteOffset,
2537     _In_ PVOID Buffer,
2538     _Out_ PULONG BytesReturned,
2539     _In_ ULONG Flags
2540     );
2541 
2542 NTSTATUS
2543 BlFileGetInformation (
2544     _In_ ULONG FileId,
2545     _In_ PBL_FILE_INFORMATION FileInfo
2546     );
2547 
2548 NTSTATUS
2549 BlFileOpen (
2550     _In_ ULONG DeviceId,
2551     _In_ PWCHAR FileName,
2552     _In_ ULONG Flags,
2553     _Out_ PULONG FileId
2554     );
2555 
2556 /* BLOCK I/O ROUTINES *******************************************************/
2557 
2558 NTSTATUS
2559 BlockIoEfiCompareDevice (
2560     _In_ PBL_DEVICE_DESCRIPTOR Device,
2561     _In_ EFI_HANDLE Handle
2562     );
2563 
2564 /* INPUT CONSOLE ROUTINES ****************************************************/
2565 
2566 VOID
2567 ConsoleInputLocalDestruct (
2568     _In_ struct _BL_INPUT_CONSOLE* Console
2569     );
2570 
2571 NTSTATUS
2572 ConsoleInputBaseReinitialize (
2573     _In_ struct _BL_INPUT_CONSOLE* Console
2574     );
2575 
2576 NTSTATUS
2577 ConsoleCreateLocalInputCnsole (
2578     VOID
2579     );
2580 
2581 /* TEXT CONSOLE ROUTINES *****************************************************/
2582 
2583 VOID
2584 ConsoleGraphicalDestruct (
2585     _In_ struct _BL_GRAPHICS_CONSOLE* Console
2586     );
2587 
2588 NTSTATUS
2589 ConsoleGraphicalClearText (
2590     _In_ PBL_GRAPHICS_CONSOLE Console,
2591     _In_ BOOLEAN LineOnly
2592     );
2593 
2594 NTSTATUS
2595 ConsoleGraphicalClearPixels  (
2596     _In_ PBL_GRAPHICS_CONSOLE Console,
2597     _In_ ULONG Color
2598     );
2599 
2600 NTSTATUS
2601 ConsoleGraphicalReinitialize (
2602     _In_ struct _BL_GRAPHICS_CONSOLE* Console
2603     );
2604 
2605 NTSTATUS
2606 ConsoleGraphicalSetTextState (
2607     _In_ PBL_GRAPHICS_CONSOLE Console,
2608     _In_ ULONG Mask,
2609     _In_ PBL_DISPLAY_STATE TextState
2610     );
2611 
2612 BOOLEAN
2613 ConsoleGraphicalIsEnabled (
2614     _In_ struct _BL_GRAPHICS_CONSOLE* Console
2615     );
2616 
2617 NTSTATUS
2618 ConsoleGraphicalGetGraphicalResolution (
2619     _In_ struct _BL_GRAPHICS_CONSOLE* Console,
2620     _In_ PBL_DISPLAY_MODE DisplayMode
2621     );
2622 
2623 NTSTATUS
2624 ConsoleGraphicalGetOriginalResolution (
2625     _In_ struct _BL_GRAPHICS_CONSOLE* Console,
2626     _In_ PBL_DISPLAY_MODE DisplayMode
2627     );
2628 
2629 NTSTATUS
2630 ConsoleGraphicalEnable (
2631     _In_ struct _BL_GRAPHICS_CONSOLE* Console,
2632     _In_ BOOLEAN Enable
2633     );
2634 
2635 VOID
2636 ConsoleTextLocalDestruct (
2637     _In_ struct _BL_TEXT_CONSOLE* Console
2638     );
2639 
2640 NTSTATUS
2641 ConsoleTextLocalReinitialize (
2642     _In_ struct _BL_TEXT_CONSOLE* Console
2643     );
2644 
2645 NTSTATUS
2646 ConsoleTextBaseGetTextState (
2647     _In_ struct _BL_TEXT_CONSOLE* Console,
2648     _Out_ PBL_DISPLAY_STATE TextState
2649     );
2650 
2651 NTSTATUS
2652 ConsoleTextLocalSetTextState (
2653     _In_ struct _BL_TEXT_CONSOLE* Console,
2654     _In_ ULONG Flags,
2655     _In_ PBL_DISPLAY_STATE TextState
2656     );
2657 
2658 NTSTATUS
2659 ConsoleTextBaseGetTextResolution (
2660     _In_ struct _BL_TEXT_CONSOLE* Console,
2661     _Out_ PULONG TextResolution
2662     );
2663 
2664 NTSTATUS
2665 ConsoleTextLocalSetTextResolution (
2666     _In_ struct _BL_TEXT_CONSOLE* Console,
2667     _In_ ULONG NewTextResolution,
2668     _Out_ PULONG OldTextResolution
2669     );
2670 
2671 NTSTATUS
2672 ConsoleTextLocalClearText (
2673     _In_ struct _BL_TEXT_CONSOLE* Console,
2674     _In_ BOOLEAN LineOnly
2675     );
2676 
2677 NTSTATUS
2678 ConsoleTextLocalWriteText (
2679     _In_ struct _BL_TEXT_CONSOLE* Console,
2680     _In_ PCHAR Text,
2681     _In_ ULONG Attribute
2682     );
2683 
2684 NTSTATUS
2685 ConsoleTextLocalConstruct (
2686     _In_ PBL_TEXT_CONSOLE TextConsole,
2687     _In_ BOOLEAN Activate
2688     );
2689 
2690 BOOLEAN
2691 ConsolepFindResolution (
2692     _In_ PBL_DISPLAY_MODE Mode,
2693     _In_ PBL_DISPLAY_MODE List,
2694     _In_ ULONG MaxIndex
2695     );
2696 
2697 NTSTATUS
2698 ConsoleFirmwareTextClear (
2699     _In_ PBL_TEXT_CONSOLE Console,
2700     _In_ BOOLEAN LineOnly
2701     );
2702 
2703 VOID
2704 ConsoleFirmwareTextClose (
2705     _In_ PBL_TEXT_CONSOLE TextConsole
2706     );
2707 
2708 NTSTATUS
2709 ConsoleFirmwareTextOpen (
2710     _In_ PBL_TEXT_CONSOLE TextConsole
2711     );
2712 
2713 NTSTATUS
2714 ConsoleFirmwareTextSetState (
2715     _In_ PBL_TEXT_CONSOLE TextConsole,
2716     _In_ UCHAR Mask,
2717     _In_ PBL_DISPLAY_STATE State
2718     );
2719 
2720 NTSTATUS
2721 ConsoleGraphicalConstruct (
2722     _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
2723     );
2724 
2725 NTSTATUS
2726 ConsoleCreateRemoteConsole (
2727     _In_ PBL_TEXT_CONSOLE* TextConsole
2728     );
2729 
2730 NTSTATUS
2731 ConsoleEfiGraphicalOpenProtocol (
2732     _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole,
2733     _In_ BL_GRAPHICS_CONSOLE_TYPE Type
2734     );
2735 
2736 VOID
2737 ConsoleFirmwareGraphicalClose (
2738     _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
2739     );
2740 
2741 VOID
2742 ConsoleFirmwareGraphicalDisable (
2743     _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
2744     );
2745 
2746 NTSTATUS
2747 ConsoleFirmwareGraphicalClear (
2748     _In_ PBL_GRAPHICS_CONSOLE Console,
2749     _In_ ULONG Color
2750     );
2751 
2752 NTSTATUS
2753 ConsoleFirmwareGraphicalEnable (
2754     _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
2755     );
2756 
2757 NTSTATUS
2758 ConsoleEfiUgaOpen (
2759     _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
2760     );
2761 
2762 VOID
2763 ConsoleEfiUgaClose (
2764     _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
2765     );
2766 
2767 VOID
2768 ConsoleEfiGopClose (
2769     _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
2770     );
2771 
2772 NTSTATUS
2773 ConsoleEfiGopOpen (
2774     _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
2775     );
2776 
2777 NTSTATUS
2778 ConsoleEfiGopEnable (
2779     _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
2780     );
2781 
2782 NTSTATUS
2783 ConsoleEfiUgaSetResolution  (
2784     _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole,
2785     _In_ PBL_DISPLAY_MODE DisplayMode,
2786     _In_ ULONG DisplayModeCount
2787     );
2788 
2789 NTSTATUS
2790 ConsoleCreateLocalInputConsole (
2791     VOID
2792     );
2793 
2794 NTSTATUS
2795 ConsoleInputLocalEraseBuffer (
2796     _In_ PBL_INPUT_CONSOLE Console,
2797     _In_opt_ PULONG ValueToFill
2798     );
2799 
2800 VOID
2801 ConsolepClearBuffer (
2802     _In_ PUCHAR FrameBuffer,
2803     _In_ ULONG Width,
2804     _In_ PUCHAR FillColor,
2805     _In_ ULONG Height,
2806     _In_ ULONG ScanlineWidth,
2807     _In_ ULONG PixelDepth
2808     );
2809 
2810 NTSTATUS
2811 ConsolepConvertColorToPixel (
2812     _In_ BL_COLOR Color,
2813     _Out_ PUCHAR Pixel
2814     );
2815 
2816 extern ULONG MmDescriptorCallTreeCount;
2817 extern ULONG BlpApplicationFlags;
2818 extern BL_LIBRARY_PARAMETERS BlpLibraryParameters;
2819 extern BL_TRANSLATION_TYPE  MmTranslationType;
2820 extern PBL_ARCH_CONTEXT CurrentExecutionContext;
2821 extern PBL_DEVICE_DESCRIPTOR BlpBootDevice;
2822 extern BL_LOADED_APPLICATION_ENTRY BlpApplicationEntry;
2823 extern EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *EfiConOut;
2824 extern EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *EfiConInEx;
2825 extern EFI_GUID EfiGraphicsOutputProtocol;
2826 extern EFI_GUID EfiUgaDrawProtocol;
2827 extern EFI_GUID EfiLoadedImageProtocol;
2828 extern EFI_GUID EfiDevicePathProtocol;
2829 extern EFI_GUID EfiBlockIoProtocol;
2830 extern EFI_GUID EfiSimpleTextInputExProtocol;
2831 extern EFI_GUID EfiRootAcpiTableGuid;
2832 extern EFI_GUID EfiRootAcpiTable10Guid;
2833 extern EFI_GUID EfiGlobalVariable;
2834 extern ULONG ConsoleGraphicalResolutionListFlags;
2835 extern BL_DISPLAY_MODE ConsoleGraphicalResolutionList[];
2836 extern BL_DISPLAY_MODE ConsoleTextResolutionList[];
2837 extern ULONG ConsoleGraphicalResolutionListSize;
2838 extern PVOID DspRemoteInputConsole;
2839 extern PVOID DspLocalInputConsole;
2840 extern WCHAR BlScratchBuffer[8192];
2841 extern BL_MEMORY_DESCRIPTOR_LIST MmMdlMappedAllocated;
2842 extern BL_MEMORY_DESCRIPTOR_LIST MmMdlMappedUnallocated;
2843 extern BL_MEMORY_DESCRIPTOR_LIST MmMdlFwAllocationTracker;
2844 extern BL_MEMORY_DESCRIPTOR_LIST MmMdlUnmappedAllocated;
2845 extern BL_MEMORY_DESCRIPTOR_LIST MmMdlUnmappedUnallocated;
2846 extern BL_MEMORY_DESCRIPTOR_LIST MmMdlReservedAllocated;
2847 extern BL_MEMORY_DESCRIPTOR_LIST MmMdlBadMemory;
2848 extern BL_MEMORY_DESCRIPTOR_LIST MmMdlTruncatedMemory;
2849 extern BL_MEMORY_DESCRIPTOR_LIST MmMdlPersistentMemory;
2850 extern BL_MEMORY_DESCRIPTOR_LIST MmMdlCompleteBadMemory;
2851 extern BL_MEMORY_DESCRIPTOR_LIST MmMdlFreeVirtual;
2852 extern BL_MEMORY_DESCRIPTOR_LIST MmMdlMappingTrackers;
2853 extern ULONGLONG BlpTimePerformanceFrequency;
2854 extern LIST_ENTRY RegisteredFileSystems;
2855 extern BL_ADDRESS_RANGE MmArchKsegAddressRange;
2856 extern ULONG_PTR MmArchTopOfApplicationAddressSpace;
2857 extern PBL_MM_RELOCATE_SELF_MAP BlMmRelocateSelfMap;
2858 extern PBL_MM_FLUSH_TLB BlMmFlushTlb;
2859 extern PBL_MM_MOVE_VIRTUAL_ADDRESS_RANGE BlMmMoveVirtualAddressRange;
2860 extern PBL_MM_ZERO_VIRTUAL_ADDRESS_RANGE BlMmZeroVirtualAddressRange;
2861 extern PBL_STATUS_ERROR_HANDLER BlpStatusErrorHandler;
2862 
2863 #endif
2864