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