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