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