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