[BOOTMGR]: Add the basics of some memory allocator/descriptor tests.
[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 /* DATA STRUCTURES ***********************************************************/
674
675 typedef struct _BL_LIBRARY_PARAMETERS
676 {
677 ULONG LibraryFlags;
678 ULONG TranslationType;
679 ULONG MinimumAllocationCount;
680 ULONG MinimumHeapSize;
681 ULONG HeapAllocationAttributes;
682 PWCHAR ApplicationBaseDirectory;
683 ULONG DescriptorCount;
684 PWCHAR FontBaseDirectory;
685 } BL_LIBRARY_PARAMETERS, *PBL_LIBRARY_PARAMETERS;
686
687 /* This should eventually go into a more public header */
688 typedef struct _BOOT_APPLICATION_PARAMETER_BLOCK
689 {
690 /* This header tells the library what image we're dealing with */
691 ULONG Signature[2];
692 ULONG Version;
693 ULONG Size;
694 ULONG ImageType;
695 ULONG MemoryTranslationType;
696
697 /* Where is the image located */
698 ULONGLONG ImageBase;
699 ULONG ImageSize;
700
701 /* Offset to BL_MEMORY_DATA */
702 ULONG MemoryDataOffset;
703
704 /* Offset to BL_APPLICATION_ENTRY */
705 ULONG AppEntryOffset;
706
707 /* Offset to BL_DEVICE_DESCRPIPTOR */
708 ULONG BootDeviceOffset;
709
710 /* Offset to BL_FIRMWARE_PARAMETERS */
711 ULONG FirmwareParametersOffset;
712
713 /* Offset to BL_RETURN_ARGUMENTS */
714 ULONG ReturnArgumentsOffset;
715 } BOOT_APPLICATION_PARAMETER_BLOCK, *PBOOT_APPLICATION_PARAMETER_BLOCK;
716
717 typedef struct _BL_MEMORY_DATA
718 {
719 ULONG Version;
720 ULONG MdListOffset;
721 ULONG DescriptorCount;
722 ULONG DescriptorSize;
723 ULONG DescriptorOffset;
724 } BL_MEMORY_DATA, *PBL_MEMORY_DATA;
725
726 typedef struct _BL_FIRMWARE_DESCRIPTOR
727 {
728 ULONG Version;
729 ULONG Unknown;
730 EFI_HANDLE ImageHandle;
731 EFI_SYSTEM_TABLE *SystemTable;
732 } BL_FIRMWARE_DESCRIPTOR, *PBL_FIRMWARE_DESCRIPTOR;
733
734 typedef struct _BL_RETURN_ARGUMENTS
735 {
736 ULONG Version;
737 NTSTATUS Status;
738 ULONG Flags;
739 ULONGLONG DataSize;
740 ULONGLONG DataPage;
741 } BL_RETURN_ARGUMENTS, *PBL_RETURN_ARGUMENTS;
742
743 typedef struct _BL_MEMORY_DESCRIPTOR
744 {
745 LIST_ENTRY ListEntry;
746 union
747 {
748 struct
749 {
750 ULONGLONG BasePage;
751 ULONGLONG VirtualPage;
752 };
753 struct
754 {
755 ULONGLONG BaseAddress;
756 ULONGLONG VirtualAddress;
757 };
758 };
759 ULONGLONG PageCount;
760 ULONG Flags;
761 BL_MEMORY_TYPE Type;
762 } BL_MEMORY_DESCRIPTOR, *PBL_MEMORY_DESCRIPTOR;
763
764 typedef struct _BL_BCD_OPTION
765 {
766 ULONG Type;
767 ULONG DataOffset;
768 ULONG DataSize;
769 ULONG ListOffset;
770 ULONG NextEntryOffset;
771 ULONG Empty;
772 } BL_BCD_OPTION, *PBL_BCD_OPTION;
773
774 typedef struct _BL_APPLICATION_ENTRY
775 {
776 CHAR Signature[8];
777 ULONG Flags;
778 GUID Guid;
779 ULONG Unknown[4];
780 BL_BCD_OPTION BcdData;
781 } BL_APPLICATION_ENTRY, *PBL_APPLICATION_ENTRY;
782
783 typedef struct _BL_LOADED_APPLICATION_ENTRY
784 {
785 ULONG Flags;
786 GUID Guid;
787 PBL_BCD_OPTION BcdData;
788 } BL_LOADED_APPLICATION_ENTRY, *PBL_LOADED_APPLICATION_ENTRY;
789
790 typedef struct _BL_MENU_STATUS
791 {
792 union
793 {
794 struct
795 {
796 ULONG AnyKey : 1;
797 ULONG AdvancedOptions : 1;
798 ULONG BootOptions : 1;
799 ULONG OemKey : 1;
800 ULONG Exit : 1;
801 ULONG Reserved : 27;
802 };
803 ULONG AsULong;
804 };
805 ULONG BootIndex;
806 WCHAR KeyValue;
807 } BL_MENU_STATUS, *PL_MENU_STATUS;
808
809 typedef enum _BL_BOOT_ERROR_STATUS
810 {
811 Reboot = 1,
812 Recover = 2,
813 RecoverOem = 3,
814 OsSelection = 4,
815 NextOs = 5,
816 TryAgain = 6,
817 AdvancedOptions = 7,
818 BootOptions = 8
819 } BL_BOOT_ERROR_STATUS;
820
821 typedef struct _BL_HARDDISK_DEVICE
822 {
823 ULONG PartitionType;
824 union
825 {
826 struct
827 {
828 ULONG PartitionSignature;
829 } Mbr;
830
831 struct
832 {
833 GUID PartitionSignature;
834 } Gpt;
835
836 struct
837 {
838 ULONG DiskNumber;
839 } Raw;
840 };
841 } BL_HARDDISK_DEVICE;
842
843 typedef struct _BL_LOCAL_DEVICE
844 {
845 ULONG Type;
846 union
847 {
848 struct
849 {
850 ULONG DriveNumber;
851 } FloppyDisk;
852
853 BL_HARDDISK_DEVICE HardDisk;
854
855 struct
856 {
857 PHYSICAL_ADDRESS ImageBase;
858 LARGE_INTEGER ImageSize;
859 ULONG ImageOffset;
860 } RamDisk;
861
862 ULONG File; // unknown for now
863 };
864 } BL_LOCAL_DEVICE, *PBL_LOCAL_DEVICE;
865
866 typedef struct _BL_DEVICE_DESCRIPTOR
867 {
868 DEVICE_TYPE DeviceType;
869 ULONG Flags;
870 ULONG Size;
871 ULONG Unknown;
872 union
873 {
874 BL_LOCAL_DEVICE Local;
875
876 struct
877 {
878 ULONG Unknown;
879 } Remote;
880
881 struct
882 {
883 union
884 {
885 ULONG PartitionNumber;
886 } Mbr;
887
888 union
889 {
890 GUID PartitionGuid;
891 } Gpt;
892
893 BL_LOCAL_DEVICE Disk;
894 } Partition;
895 };
896 } BL_DEVICE_DESCRIPTOR, *PBL_DEVICE_DESCRIPTOR;
897
898 typedef struct _BL_FILE_PATH_DESCRIPTOR
899 {
900 ULONG Version;
901 ULONG Length;
902 ULONG PathType;
903 UCHAR Path[ANYSIZE_ARRAY];
904 } BL_FILE_PATH_DESCRIPTOR, *PBL_FILE_PATH_DESCRIPTOR;
905
906 typedef struct _BL_WINDOWS_LOAD_OPTIONS
907 {
908 CHAR Signature[8];
909 ULONG Version;
910 ULONG Length;
911 ULONG OsPathOffset;
912 WCHAR LoadOptions[ANYSIZE_ARRAY];
913 } BL_WINDOWS_LOAD_OPTIONS, *PBL_WINDOWS_LOAD_OPTIONS;
914
915 typedef struct _BL_ARCH_CONTEXT
916 {
917 BL_ARCH_MODE Mode;
918 BL_TRANSLATION_TYPE TranslationType;
919 ULONG ContextFlags;
920 } BL_ARCH_CONTEXT, *PBL_ARCH_CONTEXT;
921
922 typedef struct _BL_MEMORY_DESCRIPTOR_LIST
923 {
924 LIST_ENTRY ListHead;
925 PLIST_ENTRY First;
926 PLIST_ENTRY This;
927 ULONG Type;
928 } BL_MEMORY_DESCRIPTOR_LIST, *PBL_MEMORY_DESCRIPTOR_LIST;
929
930 typedef struct _BL_ADDRESS_RANGE
931 {
932 ULONGLONG Minimum;
933 ULONGLONG Maximum;
934 } BL_ADDRESS_RANGE, *PBL_ADDRESS_RANGE;
935
936 typedef struct _BL_FILE_INFORMATION
937 {
938 ULONGLONG Size;
939 ULONGLONG Offset;
940 PWCHAR FsName;
941 ULONG Flags;
942 } BL_FILE_INFORMATION, *PBL_FILE_INFORMATION;
943
944 typedef struct _BL_FILE_CALLBACKS
945 {
946 PBL_FILE_OPEN Open;
947 PBL_FILE_CLOSE Close;
948 PBL_FILE_READ Read;
949 PBL_FILE_WRITE Write;
950 PBL_FILE_GET_NEXT GetNext;
951 PBL_FILE_GET_INFO GetInfo;
952 PBL_FILE_SET_INFO SetInfo;
953 } BL_FILE_CALLBACKS, *PBL_FILE_CALLBACKS;
954
955 typedef struct _BL_FILE_ENTRY
956 {
957 PWCHAR FilePath;
958 ULONG DeviceId;
959 ULONG FileId;
960 ULONG Flags;
961 ULONG ReferenceCount;
962 ULONG Unknown;
963 ULONGLONG TotalBytesRead;
964 ULONGLONG Unknown2;
965 BL_FILE_CALLBACKS Callbacks;
966 PVOID FsSpecificData;
967 } BL_FILE_ENTRY, *PBL_FILE_ENTRY;
968
969 typedef struct _BL_FILE_SYSTEM_ENTRY
970 {
971 LIST_ENTRY ListEntry;
972 PBL_FS_INIT_CALLBACK InitCallback;
973 PBL_FS_DESTROY_CALLBACK DestroyCallback;
974 PBL_FS_MOUNT_CALLBACK MountCallback;
975 PBL_FS_PURGE_CALLBACK PurgeCallback;
976 } BL_FILE_SYSTEM_ENTRY, *PBL_FILE_SYSTEM_ENTRY;
977
978 typedef struct _BL_FILE_SYSTEM_REGISTRATION_TABLE
979 {
980 PBL_FS_INIT_CALLBACK Init;
981 PBL_FS_DESTROY_CALLBACK Destroy;
982 PBL_FS_MOUNT_CALLBACK Mount;
983 PBL_FS_PURGE_CALLBACK Purge;
984 } BL_FILE_SYSTEM_REGISTRATION_TABLE;
985
986 typedef struct _BL_DISPLAY_STATE
987 {
988 ULONG BgColor;
989 ULONG FgColor;
990 ULONG XPos;
991 ULONG YPos;
992 ULONG CursorVisible;
993 } BL_DISPLAY_STATE, *PBL_DISPLAY_STATE;
994
995 typedef struct _BL_DISPLAY_MODE
996 {
997 ULONG HRes;
998 ULONG VRes;
999 ULONG HRes2;
1000 } BL_DISPLAY_MODE, *PBL_DISPLAY_MODE;
1001
1002 typedef struct _BL_TEXT_CONSOLE_VTABLE
1003 {
1004 PCONSOLE_DESTRUCT Destruct;
1005 PCONSOLE_REINITIALIZE Reinitialize;
1006 PCONSOLE_GET_TEXT_STATE GetTextState;
1007 PCONSOLE_SET_TEXT_STATE SetTextState;
1008 PCONSOLE_GET_TEXT_RESOLUTION GetTextResolution;
1009 PCONSOLE_SET_TEXT_RESOLUTION SetTextResolution;
1010 PCONSOLE_CLEAR_TEXT ClearText;
1011 PCONSOLE_WRITE_TEXT WriteText;
1012 } BL_TEXT_CONSOLE_VTABLE, *PBL_TEXT_CONSOLE_VTABLE;
1013
1014 typedef struct _BL_GRAPHICS_CONSOLE_VTABLE
1015 {
1016 BL_TEXT_CONSOLE_VTABLE Text;
1017 PCONSOLE_IS_ENABLED IsEnabled;
1018 PCONSOLE_ENABLE Enable;
1019 PVOID GetConsoleResolution;
1020 PCONSOLE_GET_GRAPHICAL_RESOLUTION GetGraphicalResolution;
1021 PCONSOLE_GET_GRAPHICAL_RESOLUTION GetOriginalResolution;
1022 PCONSOLE_SET_GRAPHICAL_RESOLUTION SetOriginalResolution;
1023 /// more for graphics ///
1024 } BL_GRAPHICS_CONSOLE_VTABLE, *PBL_GRAPHICS_CONSOLE_VTABLE;
1025
1026 typedef struct _BL_TEXT_CONSOLE
1027 {
1028 PBL_TEXT_CONSOLE_VTABLE Callbacks;
1029 BL_DISPLAY_STATE State;
1030 BL_DISPLAY_MODE DisplayMode;
1031 BOOLEAN Active;
1032 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL* Protocol;
1033 ULONG Mode;
1034 EFI_SIMPLE_TEXT_OUTPUT_MODE OldMode;
1035 } BL_TEXT_CONSOLE, *PBL_TEXT_CONSOLE;
1036
1037 typedef struct _BL_INPUT_CONSOLE_VTABLE
1038 {
1039 PCONSOLE_DESTRUCT Destruct;
1040 PCONSOLE_REINITIALIZE Reinitialize;
1041 //PCONSOLE_IS_KEY_PENDING IsKeyPending;
1042 //PCONSOLE_READ_INPUT ReadInput;
1043 //PCONSOLE_ERASE_BUFFER EraseBuffer;
1044 //PCONSOLE_FILL_BUFFER FillBuffer;
1045 } BL_INPUT_CONSOLE_VTABLE, *PBL_INPUT_CONSOLE_VTABLE;
1046
1047 typedef struct _BL_INPUT_CONSOLE
1048 {
1049 PBL_INPUT_CONSOLE_VTABLE Callbacks;
1050 PULONG Buffer;
1051 PULONG DataStart;
1052 PULONG DataEnd;
1053 PULONG EndBuffer;
1054 } BL_INPUT_CONSOLE, *PBL_INPUT_CONSOLE;
1055
1056 typedef enum _BL_GRAPHICS_CONSOLE_TYPE
1057 {
1058 BlGopConsole,
1059 BlUgaConsole
1060 } BL_GRAPHICS_CONSOLE_TYPE;
1061
1062 typedef struct _BL_GRAPHICS_CONSOLE
1063 {
1064 BL_TEXT_CONSOLE TextConsole;
1065 BL_DISPLAY_MODE DisplayMode;
1066 ULONG PixelDepth;
1067 ULONG FgColor;
1068 ULONG BgColor;
1069 BL_DISPLAY_MODE OldDisplayMode;
1070 ULONG OldPixelDepth;
1071 EFI_HANDLE Handle;
1072 BL_GRAPHICS_CONSOLE_TYPE Type;
1073 EFI_GRAPHICS_OUTPUT_PROTOCOL* Protocol;
1074 PVOID FrameBuffer;
1075 ULONG FrameBufferSize;
1076 ULONG PixelsPerScanLine;
1077 ULONG Mode;
1078 ULONG OldMode;
1079 } BL_GRAPHICS_CONSOLE, *PBL_GRAPHICS_CONSOLE;
1080
1081 typedef struct _BL_REMOTE_CONSOLE
1082 {
1083 BL_TEXT_CONSOLE TextConsole;
1084 } BL_REMOTE_CONSOLE, *PBL_REMOTE_CONSOLE;
1085
1086 typedef struct _BL_HASH_TABLE
1087 {
1088 PLIST_ENTRY HashLinks;
1089 ULONG Size;
1090 PBL_HASH_TABLE_COMPARE_FUNCTION CompareFunction;
1091 PBL_HASH_TABLE_HASH_FUNCTION HashFunction;
1092 } BL_HASH_TABLE, *PBL_HASH_TABLE;
1093
1094 typedef struct _BL_HASH_ENTRY
1095 {
1096 ULONG Size;
1097 ULONG Flags;
1098 PVOID Value;
1099 } BL_HASH_ENTRY, *PBL_HASH_ENTRY;
1100
1101 typedef struct _BL_HASH_VALUE
1102 {
1103 ULONG DataSize;
1104 PVOID Data;
1105 } BL_HASH_VALUE, *PBL_HASH_VALUE;
1106
1107 typedef struct _BL_HASH_NODE
1108 {
1109 LIST_ENTRY ListEntry;
1110 BL_HASH_ENTRY Entry;
1111 BL_HASH_VALUE Value;
1112 } BL_HASH_NODE, *PBL_HASH_NODE;
1113
1114 typedef struct _BL_BLOCK_DEVICE_INFORMATION
1115 {
1116 BL_LOCAL_DEVICE_TYPE Type;
1117 ULONG DeviceFlags;
1118 ULONG Unknown;
1119 BL_PARTITION_TYPE PartitionType;
1120 ULONG BlockSize;
1121 ULONG Alignment;
1122 ULONGLONG LastBlock;
1123 ULONGLONG Offset;
1124 ULONG Block;
1125 struct
1126 {
1127 union
1128 {
1129 struct
1130 {
1131 ULONG Signature;
1132 } Mbr;
1133 struct
1134 {
1135 GUID Signature;
1136 } Gpt;
1137 };
1138 } Disk;
1139 } BL_BLOCK_DEVICE_INFORMATION, *PBL_BLOCK_DEVICE_INFORMATION;
1140
1141 typedef struct _BL_DEVICE_INFORMATION
1142 {
1143 BL_DEVICE_TYPE DeviceType;
1144 union
1145 {
1146 BL_BLOCK_DEVICE_INFORMATION BlockDeviceInfo;
1147 };
1148 } BL_DEVICE_INFORMATION, *PBL_DEVICE_INFORMATION;
1149
1150 typedef struct _BL_BLOCK_DEVICE
1151 {
1152 BL_BLOCK_DEVICE_INFORMATION;
1153 ULONGLONG StartOffset;
1154 EFI_BLOCK_IO* Protocol;
1155 EFI_HANDLE Handle;
1156 } BL_BLOCK_DEVICE, *PBL_BLOCK_DEVICE;
1157
1158 typedef struct _BL_PROTOCOL_HANDLE
1159 {
1160 EFI_HANDLE Handle;
1161 PVOID Interface;
1162 } BL_PROTOCOL_HANDLE, *PBL_PROTOCOL_HANDLE;
1163
1164 typedef struct _BL_DEVICE_CALLBACKS
1165 {
1166 PBL_DEVICE_ENUMERATE_DEVICE_CLASS EnumerateDeviceClass;
1167 PBL_DEVICE_OPEN Open;
1168 PBL_DEVICE_CLOSE Close;
1169 PBL_DEVICE_READ Read;
1170 PBL_DEVICE_WRITE Write;
1171 PBL_DEVICE_GET_INFORMATION GetInformation;
1172 PBL_DEVICE_SET_INFORMATION SetInformation;
1173 PBL_DEVICE_RESET Reset;
1174 PBL_DEVICE_FLUSH Flush;
1175 PBL_DEVICE_CREATE Create;
1176 } BL_DEVICE_CALLBACKS, *PBL_DEVICE_CALLBACKS;
1177
1178 typedef struct _BL_DEVICE_ENTRY
1179 {
1180 ULONG DeviceId;
1181 ULONG Flags;
1182 ULONG Unknown;
1183 ULONG ReferenceCount;
1184 BL_DEVICE_CALLBACKS Callbacks;
1185 PVOID DeviceSpecificData;
1186 PBL_DEVICE_DESCRIPTOR DeviceDescriptor;
1187 } BL_DEVICE_ENTRY, *PBL_DEVICE_ENTRY;
1188
1189 typedef struct _BL_IMG_FILE
1190 {
1191 UCHAR Flags;
1192 union
1193 {
1194 PVOID BaseAddress;
1195 ULONG FileId;
1196 };
1197 ULONG FileSize;
1198 PWCHAR FileName;
1199 } BL_IMG_FILE, *PBL_IMG_FILE;
1200
1201 typedef struct _BL_IMAGE_APPLICATION_ENTRY
1202 {
1203 PBL_APPLICATION_ENTRY AppEntry;
1204 PVOID ImageBase;
1205 ULONG ImageSize;
1206 } BL_IMAGE_APPLICATION_ENTRY, *PBL_IMAGE_APPLICATION_ENTRY;
1207
1208 typedef struct _BL_IMAGE_PARAMETERS
1209 {
1210 PVOID Buffer;
1211 ULONG ActualSize;
1212 ULONG BufferSize;
1213 } BL_IMAGE_PARAMETERS, *PBL_IMAGE_PARAMETERS;
1214
1215 typedef struct _BL_DEFERRED_FONT_FILE
1216 {
1217 LIST_ENTRY ListEntry;
1218 ULONG Flags;
1219 PBL_DEVICE_DESCRIPTOR Device;
1220 PWCHAR FontPath;
1221 } BL_DEFERRED_FONT_FILE, *PBL_DEFERRED_FONT_FILE;
1222
1223 #pragma pack(push)
1224 #pragma pack(1)
1225 typedef struct _BMP_HEADER
1226 {
1227 USHORT Signature;
1228 ULONG Size;
1229 USHORT Reserved[2];
1230 ULONG Offset;
1231 } BMP_HEADER, *PBMP_HEADER;
1232
1233 typedef struct _DIB_HEADER
1234 {
1235 ULONG Size;
1236 ULONG Width;
1237 ULONG Height;
1238 USHORT Planes;
1239 USHORT BitCount;
1240 ULONG Compression;
1241 ULONG SizeImage;
1242 ULONG XPelsPerMeter;
1243 ULONG YPelsPerMEter;
1244 ULONG ClrUsed;
1245 ULONG ClrImportant;
1246 } DIB_HEADER, *PDIB_HEADER;
1247
1248 typedef struct _BITMAP
1249 {
1250 BMP_HEADER BmpHeader;
1251 DIB_HEADER DibHeader;
1252 } BITMAP, *PBITMAP;
1253 #pragma pack(pop)
1254
1255 typedef struct _COORD
1256 {
1257 ULONG X;
1258 ULONG Y;
1259 } COORD, *PCOORD;
1260
1261 typedef struct _BL_PD_DATA_BLOB
1262 {
1263 PVOID Data;
1264 ULONG DataSize;
1265 ULONG BlobSize;
1266 } BL_PD_DATA_BLOB, *PBL_PD_DATA_BLOB;
1267
1268 /* INLINE ROUTINES ***********************************************************/
1269
1270 FORCEINLINE
1271 VOID
1272 BlSetupDefaultParameters (
1273 _Out_ PBL_LIBRARY_PARAMETERS LibraryParameters
1274 )
1275 {
1276 BL_LIBRARY_PARAMETERS DefaultParameters =
1277 {
1278 0x20,
1279 BlVirtual,
1280 1024,
1281 2 * 1024 * 1024,
1282 0,
1283 NULL,
1284 0,
1285 NULL
1286 };
1287
1288 /* Copy the defaults */
1289 RtlCopyMemory(LibraryParameters, &DefaultParameters, sizeof(*LibraryParameters));
1290 }
1291
1292 FORCEINLINE
1293 VOID
1294 MmMdInitializeListHead (
1295 _In_ PBL_MEMORY_DESCRIPTOR_LIST List
1296 )
1297 {
1298 /* Initialize the list */
1299 InitializeListHead(&List->ListHead);
1300 List->First = &List->ListHead;
1301 List->This = NULL;
1302 List->Type = 0;
1303 }
1304
1305 /* INITIALIZATION ROUTINES ***************************************************/
1306
1307 NTSTATUS
1308 BlInitializeLibrary(
1309 _In_ PBOOT_APPLICATION_PARAMETER_BLOCK BootAppParameters,
1310 _In_ PBL_LIBRARY_PARAMETERS LibraryParameters
1311 );
1312
1313 NTSTATUS
1314 BlpArchInitialize (
1315 _In_ ULONG Phase
1316 );
1317
1318 NTSTATUS
1319 BlpFwInitialize (
1320 _In_ ULONG Phase,
1321 _In_ PBL_FIRMWARE_DESCRIPTOR FirmwareParameters
1322 );
1323
1324 NTSTATUS
1325 BlpMmInitialize (
1326 _In_ PBL_MEMORY_DATA MemoryData,
1327 _In_ BL_TRANSLATION_TYPE TranslationType,
1328 _In_ PBL_LIBRARY_PARAMETERS LibraryParameters
1329 );
1330
1331 NTSTATUS
1332 MmBaInitialize (
1333 VOID
1334 );
1335
1336 NTSTATUS
1337 MmPaInitialize (
1338 _In_ PBL_MEMORY_DATA MemoryData,
1339 _In_ ULONG MinimumPages
1340 );
1341
1342 NTSTATUS
1343 MmArchInitialize (
1344 _In_ ULONG Phase,
1345 _In_ PBL_MEMORY_DATA MemoryData,
1346 _In_ BL_TRANSLATION_TYPE TranslationType,
1347 _In_ BL_TRANSLATION_TYPE LibraryTranslationType
1348 );
1349
1350 NTSTATUS
1351 MmHaInitialize (
1352 _In_ ULONG HeapSize,
1353 _In_ ULONG HeapAttributes
1354 );
1355
1356 VOID
1357 MmMdInitialize (
1358 _In_ ULONG Phase,
1359 _In_ PBL_LIBRARY_PARAMETERS LibraryParameters
1360 );
1361
1362 NTSTATUS
1363 BlpDeviceInitialize (
1364 VOID
1365 );
1366
1367 NTSTATUS
1368 BlpIoInitialize (
1369 VOID
1370 );
1371
1372 NTSTATUS
1373 BlpFileInitialize (
1374 VOID
1375 );
1376
1377 NTSTATUS
1378 BlpDisplayInitialize (
1379 _In_ ULONG Flags
1380 );
1381
1382 NTSTATUS
1383 BlpDisplayReinitialize (
1384 VOID
1385 );
1386
1387 VOID
1388 BlDestroyLibrary (
1389 VOID
1390 );
1391
1392 NTSTATUS
1393 BcInitialize (
1394 VOID
1395 );
1396
1397 /* FIRMWARE ROUTINES *********************************************************/
1398
1399 VOID
1400 EfiPrintf (
1401 _In_ PWCHAR Format,
1402 ...
1403 );
1404
1405 NTSTATUS
1406 BlFwGetParameters(
1407 _In_ PBL_FIRMWARE_DESCRIPTOR Parameters
1408 );
1409
1410 NTSTATUS
1411 BlFwEnumerateDevice (
1412 _In_ PBL_DEVICE_DESCRIPTOR Device
1413 );
1414
1415 NTSTATUS
1416 EfiAllocatePages (
1417 _In_ ULONG Type,
1418 _In_ ULONG Pages,
1419 _Inout_ EFI_PHYSICAL_ADDRESS* Memory
1420 );
1421
1422 NTSTATUS
1423 EfiStall (
1424 _In_ ULONG StallTime
1425 );
1426
1427 NTSTATUS
1428 EfiConInExReset (
1429 VOID
1430 );
1431
1432 NTSTATUS
1433 EfiConInReset (
1434 VOID
1435 );
1436
1437 NTSTATUS
1438 EfiConOutOutputString (
1439 _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface,
1440 _In_ PWCHAR String
1441 );
1442
1443 NTSTATUS
1444 EfiConOutQueryMode (
1445 _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface,
1446 _In_ ULONG Mode,
1447 _In_ UINTN* Columns,
1448 _In_ UINTN* Rows
1449 );
1450
1451 NTSTATUS
1452 EfiConOutSetMode (
1453 _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface,
1454 _In_ ULONG Mode
1455 );
1456
1457 VOID
1458 EfiConOutReadCurrentMode (
1459 _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface,
1460 _Out_ EFI_SIMPLE_TEXT_OUTPUT_MODE* Mode
1461 );
1462
1463 NTSTATUS
1464 EfiConOutSetAttribute (
1465 _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface,
1466 _In_ ULONG Attribute
1467 );
1468
1469 NTSTATUS
1470 EfiConOutSetCursorPosition (
1471 _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface,
1472 _In_ ULONG Column,
1473 _In_ ULONG Row
1474 );
1475
1476 NTSTATUS
1477 EfiConOutEnableCursor (
1478 _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface,
1479 _In_ BOOLEAN Visible
1480 );
1481
1482 NTSTATUS
1483 EfiLocateHandleBuffer (
1484 _In_ EFI_LOCATE_SEARCH_TYPE SearchType,
1485 _In_ EFI_GUID *Protocol,
1486 _Inout_ PULONG HandleCount,
1487 _Inout_ EFI_HANDLE** Buffer
1488 );
1489
1490 NTSTATUS
1491 EfiOpenProtocol (
1492 _In_ EFI_HANDLE Handle,
1493 _In_ EFI_GUID *Protocol,
1494 _Out_ PVOID* Interface
1495 );
1496
1497 NTSTATUS
1498 EfiCloseProtocol (
1499 _In_ EFI_HANDLE Handle,
1500 _In_ EFI_GUID *Protocol
1501 );
1502
1503 NTSTATUS
1504 EfiGopGetCurrentMode (
1505 _In_ EFI_GRAPHICS_OUTPUT_PROTOCOL *GopInterface,
1506 _Out_ UINTN* Mode,
1507 _Out_ EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Information
1508 );
1509
1510 NTSTATUS
1511 EfiGopSetMode (
1512 _In_ EFI_GRAPHICS_OUTPUT_PROTOCOL *GopInterface,
1513 _In_ ULONG Mode
1514 );
1515
1516 VOID
1517 EfiGopGetFrameBuffer (
1518 _In_ EFI_GRAPHICS_OUTPUT_PROTOCOL *GopInterface,
1519 _Out_ PHYSICAL_ADDRESS* FrameBuffer,
1520 _Out_ UINTN *FrameBufferSize
1521 );
1522
1523 VOID
1524 EfiResetSystem (
1525 _In_ EFI_RESET_TYPE ResetType
1526 );
1527
1528 EFI_DEVICE_PATH*
1529 EfiGetLeafNode (
1530 _In_ EFI_DEVICE_PATH *DevicePath
1531 );
1532
1533 EFI_DEVICE_PATH *
1534 EfiIsDevicePathParent (
1535 _In_ EFI_DEVICE_PATH *DevicePath1,
1536 _In_ EFI_DEVICE_PATH *DevicePath2
1537 );
1538
1539 NTSTATUS
1540 EfipGetRsdt (
1541 _Out_ PPHYSICAL_ADDRESS FoundRsdt
1542 );
1543
1544 /* PLATFORM TIMER ROUTINES ***************************************************/
1545
1546 NTSTATUS
1547 BlpTimeCalibratePerformanceCounter (
1548 VOID
1549 );
1550
1551 ULONGLONG
1552 BlTimeQueryPerformanceCounter (
1553 _Out_opt_ PLARGE_INTEGER Frequency
1554 );
1555
1556 /* RESOURCE LOCALE INTERNATIONALIZATION ROUTINES *****************************/
1557
1558 NTSTATUS
1559 BlpDisplayRegisterLocale (
1560 _In_ PWCHAR Locale
1561 );
1562
1563 /* FONT ROUTINES *************************************************************/
1564
1565 VOID
1566 BfiFreeDeferredFontFile (
1567 _In_ PBL_DEFERRED_FONT_FILE DeferredFontFile
1568 );
1569
1570 NTSTATUS
1571 BfLoadFontFile (
1572 _In_ PBL_DEVICE_DESCRIPTOR Device,
1573 _In_ PWCHAR FontPath
1574 );
1575
1576 NTSTATUS
1577 BfLoadDeferredFontFiles (
1578 VOID
1579 );
1580
1581 NTSTATUS
1582 BfClearScreen (
1583 _In_ PBL_GRAPHICS_CONSOLE Console
1584 );
1585
1586 NTSTATUS
1587 BfClearToEndOfLine (
1588 _In_ PBL_GRAPHICS_CONSOLE Console
1589 );
1590
1591 /* FILESYSTEM ROUTINES *******************************************************/
1592
1593 NTSTATUS
1594 FatInitialize (
1595 VOID
1596 );
1597
1598 NTSTATUS
1599 FatMount (
1600 _In_ ULONG DeviceId,
1601 _In_ ULONG Unknown,
1602 _Out_ PBL_FILE_ENTRY* FileEntry
1603 );
1604
1605 NTSTATUS
1606 EtfsInitialize (
1607 VOID
1608 );
1609
1610 NTSTATUS
1611 EtfsMount (
1612 _In_ ULONG DeviceId,
1613 _In_ ULONG Unknown,
1614 _Out_ PBL_FILE_ENTRY* FileEntry
1615 );
1616
1617 /* DEBUG ROUTINES ************************************************************/
1618
1619
1620 BOOLEAN
1621 BlBdDebuggerEnabled (
1622 VOID
1623 );
1624
1625 NTSTATUS
1626 BlBdPullRemoteFile (
1627 _In_ PWCHAR FilePath,
1628 _Out_ PVOID BaseAddress,
1629 _Out_ PULONGLONG FileSize
1630 );
1631
1632 VOID
1633 BlStatusPrint (
1634 _In_ PCWCH Format,
1635 ...
1636 );
1637
1638 VOID
1639 BlStatusError (
1640 _In_ ULONG ErrorCode,
1641 _In_ ULONG Parameter1,
1642 _In_ ULONG_PTR Parameter2,
1643 _In_ ULONG_PTR Parameter3,
1644 _In_ ULONG_PTR Parameter4
1645 );
1646
1647 /* UTILITY ROUTINES **********************************************************/
1648
1649 VOID
1650 BlUtlUpdateProgress (
1651 _In_ ULONG Percentage,
1652 _Out_opt_ PBOOLEAN Completed
1653 );
1654
1655 NTSTATUS
1656 BlUtlGetAcpiTable (
1657 _Out_ PVOID* TableAddress,
1658 _In_ ULONG Signature
1659 );
1660
1661 NTSTATUS
1662 BlUtlInitialize (
1663 VOID
1664 );
1665
1666 NTSTATUS
1667 BlUtlRegisterProgressRoutine (
1668 VOID
1669 );
1670
1671 ULONG
1672 BlUtlCheckSum (
1673 _In_ ULONG PartialSum,
1674 _In_ PUCHAR Buffer,
1675 _In_ ULONG Length,
1676 _In_ ULONG Flags
1677 );
1678
1679 NTSTATUS
1680 BlGetApplicationBaseAndSize (
1681 _Out_ PVOID* ImageBase,
1682 _Out_ PULONG ImageSize
1683 );
1684
1685 VOID
1686 BlDestroyBootEntry (
1687 _In_ PBL_LOADED_APPLICATION_ENTRY AppEntry
1688 );
1689
1690 NTSTATUS
1691 BlPdQueryData (
1692 _In_ const GUID* DataGuid,
1693 _In_ PVOID Unknown,
1694 _Inout_ PBL_PD_DATA_BLOB DataBlob
1695 );
1696
1697 /* FIRMWARE UTILITY ROUTINES *************************************************/
1698
1699 EFI_STATUS
1700 EfiGetEfiStatusCode(
1701 _In_ NTSTATUS Status
1702 );
1703
1704 NTSTATUS
1705 EfiGetNtStatusCode (
1706 _In_ EFI_STATUS EfiStatus
1707 );
1708
1709 VOID
1710 BlFwReboot (
1711 VOID
1712 );
1713
1714 PGUID
1715 BlGetApplicationIdentifier (
1716 VOID
1717 );
1718
1719 NTSTATUS
1720 BlpSecureBootEFIIsEnabled (
1721 VOID
1722 );
1723
1724 NTSTATUS
1725 BlSecureBootIsEnabled (
1726 _Out_ PBOOLEAN SecureBootEnabled
1727 );
1728
1729 NTSTATUS
1730 BlSecureBootCheckForFactoryReset (
1731 VOID
1732 );
1733
1734 /* RESOURCE ROUTINES *********************************************************/
1735
1736 PWCHAR
1737 BlResourceFindMessage (
1738 _In_ ULONG MsgId
1739 );
1740
1741 PWCHAR
1742 BlResourceFindHtml (
1743 VOID
1744 );
1745
1746 NTSTATUS
1747 BlpResourceInitialize (
1748 VOID
1749 );
1750
1751 /* TABLE ROUTINES ************************************************************/
1752
1753 NTSTATUS
1754 BlTblMap (
1755 _In_ PVOID *Table,
1756 _In_ ULONG Count,
1757 _In_ PBL_TBL_MAP_ROUTINE MapCallback
1758 );
1759
1760 PVOID
1761 BlTblFindEntry (
1762 _In_ PVOID *Table,
1763 _In_ ULONG Count,
1764 _Out_ PULONG EntryIndex,
1765 _In_ PBL_TBL_LOOKUP_ROUTINE Callback,
1766 _In_ PVOID Argument1,
1767 _In_ PVOID Argument2,
1768 _In_ PVOID Argument3,
1769 _In_ PVOID Argument4
1770 );
1771
1772 NTSTATUS
1773 BlTblSetEntry (
1774 _Inout_ PVOID** Table,
1775 _Inout_ PULONG Count,
1776 _In_ PVOID Entry,
1777 _Out_ PULONG EntryIndex,
1778 _In_ PBL_TBL_SET_ROUTINE Callback
1779 );
1780
1781 NTSTATUS
1782 TblDoNotPurgeEntry (
1783 _In_ PVOID Entry
1784 );
1785
1786 /* HASH TABLE ROUTINES *******************************************************/
1787
1788 NTSTATUS
1789 BlHtStore (
1790 _In_ ULONG TableId,
1791 _In_ PBL_HASH_ENTRY Entry,
1792 _In_ PVOID Data,
1793 _In_ ULONG DataSize
1794 );
1795
1796 NTSTATUS
1797 BlHtLookup (
1798 _In_ ULONG TableId,
1799 _In_ PBL_HASH_ENTRY Entry,
1800 _Out_ PBL_HASH_VALUE *Value
1801 );
1802
1803 NTSTATUS
1804 BlHtCreate (
1805 _In_ ULONG Size,
1806 _In_ PBL_HASH_TABLE_HASH_FUNCTION HashFunction,
1807 _In_ PBL_HASH_TABLE_COMPARE_FUNCTION CompareFunction,
1808 _Out_ PULONG Id
1809 );
1810
1811 /* BCD OPTION ROUTINES *******************************************************/
1812
1813 PBL_BCD_OPTION
1814 MiscGetBootOption (
1815 _In_ PBL_BCD_OPTION List,
1816 _In_ ULONG Type
1817 );
1818
1819 ULONG
1820 BlGetBootOptionListSize (
1821 _In_ PBL_BCD_OPTION BcdOption
1822 );
1823
1824 ULONG
1825 BlGetBootOptionSize (
1826 _In_ PBL_BCD_OPTION BcdOption
1827 );
1828
1829 NTSTATUS
1830 BlGetBootOptionString (
1831 _In_ PBL_BCD_OPTION List,
1832 _In_ ULONG Type,
1833 _Out_ PWCHAR* Value
1834 );
1835
1836 NTSTATUS
1837 BlGetBootOptionInteger (
1838 _In_ PBL_BCD_OPTION List,
1839 _In_ ULONG Type,
1840 _Out_ PULONGLONG Value
1841 );
1842
1843 NTSTATUS
1844 BlGetBootOptionBoolean (
1845 _In_ PBL_BCD_OPTION List,
1846 _In_ ULONG Type,
1847 _Out_ PBOOLEAN Value
1848 );
1849
1850 NTSTATUS
1851 BlpGetBootOptionIntegerList (
1852 _In_ PBL_BCD_OPTION List,
1853 _In_ ULONG Type,
1854 _Out_ PULONGLONG* Value,
1855 _Out_ PULONGLONG Count,
1856 _In_ BOOLEAN NoCopy
1857 );
1858
1859 NTSTATUS
1860 BlGetBootOptionDevice (
1861 _In_ PBL_BCD_OPTION List,
1862 _In_ ULONG Type,
1863 _Out_ PBL_DEVICE_DESCRIPTOR* Value,
1864 _In_opt_ PBL_BCD_OPTION* ExtraOptions
1865 );
1866
1867 NTSTATUS
1868 BlGetBootOptionGuid (
1869 _In_ PBL_BCD_OPTION List,
1870 _In_ ULONG Type,
1871 _Out_ PGUID Value
1872 );
1873
1874 NTSTATUS
1875 BlGetBootOptionGuidList (
1876 _In_ PBL_BCD_OPTION List,
1877 _In_ ULONG Type,
1878 _Out_ PGUID *Value,
1879 _In_ PULONG Count
1880 );
1881
1882 NTSTATUS
1883 BlCopyBootOptions (
1884 _In_ PBL_BCD_OPTION OptionList,
1885 _Out_ PBL_BCD_OPTION *CopiedOptions
1886 );
1887
1888 NTSTATUS
1889 BlAppendBootOptionBoolean (
1890 _In_ PBL_LOADED_APPLICATION_ENTRY AppEntry,
1891 _In_ ULONG OptionId
1892 );
1893
1894 NTSTATUS
1895 BlAppendBootOptionInteger (
1896 _In_ PBL_LOADED_APPLICATION_ENTRY AppEntry,
1897 _In_ ULONG OptionId,
1898 _In_ ULONGLONG Value
1899 );
1900
1901 NTSTATUS
1902 BlAppendBootOptionString (
1903 _In_ PBL_LOADED_APPLICATION_ENTRY AppEntry,
1904 _In_ PWCHAR OptionString
1905 );
1906
1907 NTSTATUS
1908 BlAppendBootOptions (
1909 _In_ PBL_LOADED_APPLICATION_ENTRY AppEntry,
1910 _In_ PBL_BCD_OPTION Options
1911 );
1912
1913 VOID
1914 BlRemoveBootOption (
1915 _In_ PBL_BCD_OPTION List,
1916 _In_ ULONG Type
1917 );
1918
1919 NTSTATUS
1920 BlReplaceBootOptions (
1921 _In_ PBL_LOADED_APPLICATION_ENTRY AppEntry,
1922 _In_ PBL_BCD_OPTION NewOptions
1923 );
1924
1925 /* BOOT REGISTRY ROUTINES ****************************************************/
1926
1927 VOID
1928 BiCloseKey (
1929 _In_ HANDLE KeyHandle
1930 );
1931
1932 NTSTATUS
1933 BiOpenKey(
1934 _In_ HANDLE ParentHandle,
1935 _In_ PWCHAR KeyName,
1936 _Out_ PHANDLE Handle
1937 );
1938
1939 NTSTATUS
1940 BiLoadHive (
1941 _In_ PBL_FILE_PATH_DESCRIPTOR FilePath,
1942 _Out_ PHANDLE HiveHandle
1943 );
1944
1945 NTSTATUS
1946 BiGetRegistryValue (
1947 _In_ HANDLE KeyHandle,
1948 _In_ PWCHAR ValueName,
1949 _In_ ULONG Type,
1950 _Out_ PVOID* Buffer,
1951 _Out_ PULONG ValueLength
1952 );
1953
1954 NTSTATUS
1955 BiEnumerateSubKeys (
1956 _In_ HANDLE KeyHandle,
1957 _Out_ PWCHAR** SubKeyList,
1958 _Out_ PULONG SubKeyCount
1959 );
1960
1961 NTSTATUS
1962 BiDeleteKey (
1963 _In_ HANDLE KeyHandle
1964 );
1965
1966 VOID
1967 BiDereferenceHive (
1968 _In_ HANDLE KeyHandle
1969 );
1970
1971 /* CONTEXT ROUTINES **********************************************************/
1972
1973 VOID
1974 BlpArchSwitchContext (
1975 _In_ BL_ARCH_MODE NewMode
1976 );
1977
1978 VOID
1979 Archx86TransferTo32BitApplicationAsm (
1980 VOID
1981 );
1982
1983 /* MEMORY DESCRIPTOR ROUTINES ************************************************/
1984
1985 VOID
1986 MmMdInitializeList (
1987 _In_ PBL_MEMORY_DESCRIPTOR_LIST DescriptorList,
1988 _In_ ULONG Type,
1989 _In_ PLIST_ENTRY ListHead
1990 );
1991
1992 NTSTATUS
1993 MmMdCopyList (
1994 _In_ PBL_MEMORY_DESCRIPTOR_LIST DestinationList,
1995 _In_ PBL_MEMORY_DESCRIPTOR_LIST SourceList,
1996 _In_opt_ PBL_MEMORY_DESCRIPTOR ListDescriptor,
1997 _Out_ PULONG ActualCount,
1998 _In_ ULONG Count,
1999 _In_ ULONG Flags
2000 );
2001
2002 ULONG
2003 MmMdCountList (
2004 _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList
2005 );
2006
2007 VOID
2008 MmMdFreeList(
2009 _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList
2010 );
2011
2012 PBL_MEMORY_DESCRIPTOR
2013 MmMdInitByteGranularDescriptor (
2014 _In_ ULONG Flags,
2015 _In_ BL_MEMORY_TYPE Type,
2016 _In_ ULONGLONG BasePage,
2017 _In_ ULONGLONG VirtualPage,
2018 _In_ ULONGLONG PageCount
2019 );
2020
2021 VOID
2022 MmMdFreeGlobalDescriptors (
2023 VOID
2024 );
2025
2026 NTSTATUS
2027 MmMdAddDescriptorToList (
2028 _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList,
2029 _In_ PBL_MEMORY_DESCRIPTOR MemoryDescriptor,
2030 _In_ ULONG Flags
2031 );
2032
2033 VOID
2034 MmMdRemoveDescriptorFromList (
2035 _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList,
2036 _In_ PBL_MEMORY_DESCRIPTOR Entry
2037 );
2038
2039 BOOLEAN
2040 MmMdFindSatisfyingRegion (
2041 _In_ PBL_MEMORY_DESCRIPTOR Descriptor,
2042 _Out_ PBL_MEMORY_DESCRIPTOR NewDescriptor,
2043 _In_ ULONGLONG Pages,
2044 _In_ PBL_ADDRESS_RANGE BaseRange,
2045 _In_ PBL_ADDRESS_RANGE VirtualRange,
2046 _In_ BOOLEAN TopDown,
2047 _In_ BL_MEMORY_TYPE MemoryType,
2048 _In_ ULONG Flags,
2049 _In_ ULONG Alignment
2050 );
2051
2052 NTSTATUS
2053 MmMdRemoveRegionFromMdlEx (
2054 __in PBL_MEMORY_DESCRIPTOR_LIST MdList,
2055 __in ULONG Flags,
2056 __in ULONGLONG BasePage,
2057 __in ULONGLONG PageCount,
2058 __in PBL_MEMORY_DESCRIPTOR_LIST NewMdList
2059 );
2060
2061 NTSTATUS
2062 MmMdFreeDescriptor (
2063 _In_ PBL_MEMORY_DESCRIPTOR MemoryDescriptor
2064 );
2065
2066 /* PAGE ALLOCATOR ROUTINES ***************************************************/
2067
2068 NTSTATUS
2069 BlMmAllocatePhysicalPages(
2070 _Inout_ PPHYSICAL_ADDRESS Address,
2071 _In_ BL_MEMORY_TYPE MemoryType,
2072 _In_ ULONGLONG PageCount,
2073 _In_ ULONG Attributes,
2074 _In_ ULONG Alignment
2075 );
2076
2077 NTSTATUS
2078 MmPapAllocatePhysicalPagesInRange (
2079 _Inout_ PPHYSICAL_ADDRESS BaseAddress,
2080 _In_ BL_MEMORY_TYPE MemoryType,
2081 _In_ ULONGLONG Pages,
2082 _In_ ULONG Attributes,
2083 _In_ ULONG Alignment,
2084 _In_ PBL_MEMORY_DESCRIPTOR_LIST NewList,
2085 _In_opt_ PBL_ADDRESS_RANGE Range,
2086 _In_ ULONG RangeType
2087 );
2088
2089 NTSTATUS
2090 BlMmFreePhysicalPages (
2091 _In_ PHYSICAL_ADDRESS Address
2092 );
2093
2094 NTSTATUS
2095 MmPapFreePages (
2096 _In_ PVOID Address,
2097 _In_ ULONG WhichList
2098 );
2099
2100 NTSTATUS
2101 MmPapAllocatePagesInRange (
2102 _Inout_ PVOID* PhysicalAddress,
2103 _In_ BL_MEMORY_TYPE MemoryType,
2104 _In_ ULONGLONG Pages,
2105 _In_ ULONG Attributes,
2106 _In_ ULONG Alignment,
2107 _In_opt_ PBL_ADDRESS_RANGE Range,
2108 _In_ ULONG Type
2109 );
2110
2111 NTSTATUS
2112 MmFwGetMemoryMap (
2113 _Out_ PBL_MEMORY_DESCRIPTOR_LIST MemoryMap,
2114 _In_ ULONG Flags
2115 );
2116
2117 NTSTATUS
2118 BlpMmInitializeConstraints (
2119 VOID
2120 );
2121
2122 NTSTATUS
2123 BlMmRemoveBadMemory (
2124 VOID
2125 );
2126
2127 NTSTATUS
2128 BlMmGetMemoryMap (
2129 _In_ PLIST_ENTRY MemoryMap,
2130 _In_ PBL_IMAGE_PARAMETERS MemoryParameters,
2131 _In_ ULONG WhichTypes,
2132 _In_ ULONG Flags
2133 );
2134
2135 /* VIRTUAL MEMORY ROUTINES ***************************************************/
2136
2137 NTSTATUS
2138 BlMmMapPhysicalAddressEx (
2139 _In_ PVOID* VirtualAddress,
2140 _In_ ULONG Attributes,
2141 _In_ ULONGLONG Size,
2142 _In_ PHYSICAL_ADDRESS PhysicalAddress
2143 );
2144
2145 NTSTATUS
2146 BlMmUnmapVirtualAddressEx (
2147 _In_ PVOID VirtualAddress,
2148 _In_ ULONGLONG Size
2149 );
2150
2151 BOOLEAN
2152 BlMmTranslateVirtualAddress (
2153 _In_ PVOID VirtualAddress,
2154 _Out_ PPHYSICAL_ADDRESS PhysicalAddress
2155 );
2156
2157 /* BLOCK ALLOCATOR ROUTINES **************************************************/
2158
2159 NTSTATUS
2160 BlpMmCreateBlockAllocator (
2161 VOID
2162 );
2163
2164 /* HEAP ALLOCATOR ROUTINES ***************************************************/
2165
2166 PVOID
2167 BlMmAllocateHeap (
2168 _In_ ULONG Size
2169 );
2170
2171 NTSTATUS
2172 BlMmFreeHeap (
2173 _In_ PVOID Buffer
2174 );
2175
2176 /* DISPLAY ROUTINES **********************************************************/
2177
2178 VOID
2179 BlDisplayGetTextCellResolution (
2180 _Out_ PULONG TextWidth,
2181 _Out_ PULONG TextHeight
2182 );
2183
2184 NTSTATUS
2185 BlDisplaySetScreenResolution (
2186 VOID
2187 );
2188
2189 NTSTATUS
2190 BlDisplayGetScreenResolution (
2191 _Out_ PULONG HRes,
2192 _Out_ PULONG Vres
2193 );
2194
2195 VOID
2196 BlDisplayInvalidateOemBitmap (
2197 VOID
2198 );
2199
2200 PBITMAP
2201 BlDisplayGetOemBitmap (
2202 _Out_ PCOORD Offset,
2203 _Out_opt_ PULONG Flags
2204 );
2205
2206 BOOLEAN
2207 BlDisplayValidOemBitmap (
2208 VOID
2209 );
2210
2211 NTSTATUS
2212 BlDisplayClearScreen (
2213 VOID
2214 );
2215
2216 NTSTATUS
2217 BlDisplaySetCursorType (
2218 _In_ ULONG Type
2219 );
2220
2221 /* I/O ROUTINES **************************************************************/
2222
2223 NTSTATUS
2224 BlpIoRegisterDestroyRoutine (
2225 _In_ PBL_IO_DESTROY_ROUTINE DestroyRoutine
2226 );
2227
2228 NTSTATUS
2229 BlDeviceClose (
2230 _In_ ULONG DeviceId
2231 );
2232
2233 NTSTATUS
2234 BlpDeviceOpen (
2235 _In_ PBL_DEVICE_DESCRIPTOR Device,
2236 _In_ ULONG Flags,
2237 _In_ ULONG Unknown,
2238 _Out_ PULONG DeviceId
2239 );
2240
2241 NTSTATUS
2242 BlDeviceGetInformation (
2243 _In_ ULONG DeviceId,
2244 _Out_ PBL_DEVICE_INFORMATION DeviceInformation
2245 );
2246
2247 NTSTATUS
2248 BlDeviceSetInformation (
2249 _In_ ULONG DeviceId,
2250 _In_ PBL_DEVICE_INFORMATION DeviceInformation
2251 );
2252
2253 NTSTATUS
2254 BlDeviceReadAtOffset (
2255 _In_ ULONG DeviceId,
2256 _In_ ULONG Size,
2257 _In_ ULONGLONG Offset,
2258 _In_ PVOID Buffer,
2259 _Out_ PULONG BytesRead
2260 );
2261
2262 /* IMAGE ROUTINES ************************************************************/
2263
2264 NTSTATUS
2265 BlImgLoadImageWithProgress2 (
2266 _In_ ULONG DeviceId,
2267 _In_ BL_MEMORY_TYPE MemoryType,
2268 _In_ PWCHAR FileName,
2269 _Inout_ PVOID* MappedBase,
2270 _Inout_ PULONG MappedSize,
2271 _In_ ULONG ImageFlags,
2272 _In_ BOOLEAN ShowProgress,
2273 _Out_opt_ PUCHAR* HashBuffer,
2274 _Out_opt_ PULONG HashSize
2275 );
2276
2277 PIMAGE_SECTION_HEADER
2278 BlImgFindSection (
2279 _In_ PVOID ImageBase,
2280 _In_ ULONG ImageSize
2281 );
2282
2283 NTSTATUS
2284 BlImgLoadBootApplication (
2285 _In_ PBL_LOADED_APPLICATION_ENTRY BootEntry,
2286 _Out_ PULONG AppHandle
2287 );
2288
2289 NTSTATUS
2290 BlImgStartBootApplication (
2291 _In_ ULONG AppHandle,
2292 _Inout_ PBL_RETURN_ARGUMENTS ReturnArguments
2293 );
2294
2295 NTSTATUS
2296 BlImgUnloadBootApplication (
2297 _In_ ULONG AppHandle
2298 );
2299
2300 VOID
2301 BlImgQueryCodeIntegrityBootOptions (
2302 _In_ PBL_LOADED_APPLICATION_ENTRY ApplicationEntry,
2303 _Out_ PBOOLEAN IntegrityChecksDisabled,
2304 _Out_ PBOOLEAN TestSigning
2305 );
2306
2307 /* FILE I/O ROUTINES *********************************************************/
2308
2309 NTSTATUS
2310 BlFileClose (
2311 _In_ ULONG FileId
2312 );
2313
2314 NTSTATUS
2315 BlFileReadAtOffsetEx (
2316 _In_ ULONG FileId,
2317 _In_ ULONG Size,
2318 _In_ ULONGLONG ByteOffset,
2319 _In_ PVOID Buffer,
2320 _Out_ PULONG BytesReturned,
2321 _In_ ULONG Flags
2322 );
2323
2324 NTSTATUS
2325 BlFileGetInformation (
2326 _In_ ULONG FileId,
2327 _In_ PBL_FILE_INFORMATION FileInfo
2328 );
2329
2330 NTSTATUS
2331 BlFileOpen (
2332 _In_ ULONG DeviceId,
2333 _In_ PWCHAR FileName,
2334 _In_ ULONG Flags,
2335 _Out_ PULONG FileId
2336 );
2337
2338 /* BLOCK I/O ROUTINES *******************************************************/
2339
2340 NTSTATUS
2341 BlockIoEfiCompareDevice (
2342 _In_ PBL_DEVICE_DESCRIPTOR Device,
2343 _In_ EFI_HANDLE Handle
2344 );
2345
2346 /* INPUT CONSOLE ROUTINES ****************************************************/
2347
2348 VOID
2349 ConsoleInputLocalDestruct (
2350 _In_ struct _BL_INPUT_CONSOLE* Console
2351 );
2352
2353 NTSTATUS
2354 ConsoleInputBaseReinitialize (
2355 _In_ struct _BL_INPUT_CONSOLE* Console
2356 );
2357
2358 NTSTATUS
2359 ConsoleCreateLocalInputCnsole (
2360 VOID
2361 );
2362
2363 /* TEXT CONSOLE ROUTINES *****************************************************/
2364
2365 VOID
2366 ConsoleGraphicalDestruct (
2367 _In_ struct _BL_GRAPHICS_CONSOLE* Console
2368 );
2369
2370 NTSTATUS
2371 ConsoleGraphicalClearText (
2372 _In_ PBL_GRAPHICS_CONSOLE Console,
2373 _In_ BOOLEAN LineOnly
2374 );
2375
2376 NTSTATUS
2377 ConsoleGraphicalClearPixels (
2378 _In_ PBL_GRAPHICS_CONSOLE Console,
2379 _In_ ULONG Color
2380 );
2381
2382 NTSTATUS
2383 ConsoleGraphicalReinitialize (
2384 _In_ struct _BL_GRAPHICS_CONSOLE* Console
2385 );
2386
2387 NTSTATUS
2388 ConsoleGraphicalSetTextState (
2389 _In_ PBL_GRAPHICS_CONSOLE Console,
2390 _In_ ULONG Mask,
2391 _In_ PBL_DISPLAY_STATE TextState
2392 );
2393
2394 BOOLEAN
2395 ConsoleGraphicalIsEnabled (
2396 _In_ struct _BL_GRAPHICS_CONSOLE* Console
2397 );
2398
2399 NTSTATUS
2400 ConsoleGraphicalGetGraphicalResolution (
2401 _In_ struct _BL_GRAPHICS_CONSOLE* Console,
2402 _In_ PBL_DISPLAY_MODE DisplayMode
2403 );
2404
2405 NTSTATUS
2406 ConsoleGraphicalGetOriginalResolution (
2407 _In_ struct _BL_GRAPHICS_CONSOLE* Console,
2408 _In_ PBL_DISPLAY_MODE DisplayMode
2409 );
2410
2411 NTSTATUS
2412 ConsoleGraphicalEnable (
2413 _In_ struct _BL_GRAPHICS_CONSOLE* Console,
2414 _In_ BOOLEAN Enable
2415 );
2416
2417 VOID
2418 ConsoleTextLocalDestruct (
2419 _In_ struct _BL_TEXT_CONSOLE* Console
2420 );
2421
2422 NTSTATUS
2423 ConsoleTextLocalReinitialize (
2424 _In_ struct _BL_TEXT_CONSOLE* Console
2425 );
2426
2427 NTSTATUS
2428 ConsoleTextBaseGetTextState (
2429 _In_ struct _BL_TEXT_CONSOLE* Console,
2430 _Out_ PBL_DISPLAY_STATE TextState
2431 );
2432
2433 NTSTATUS
2434 ConsoleTextLocalSetTextState (
2435 _In_ struct _BL_TEXT_CONSOLE* Console,
2436 _In_ ULONG Flags,
2437 _In_ PBL_DISPLAY_STATE TextState
2438 );
2439
2440 NTSTATUS
2441 ConsoleTextBaseGetTextResolution (
2442 _In_ struct _BL_TEXT_CONSOLE* Console,
2443 _Out_ PULONG TextResolution
2444 );
2445
2446 NTSTATUS
2447 ConsoleTextLocalSetTextResolution (
2448 _In_ struct _BL_TEXT_CONSOLE* Console,
2449 _In_ ULONG NewTextResolution,
2450 _Out_ PULONG OldTextResolution
2451 );
2452
2453 NTSTATUS
2454 ConsoleTextLocalClearText (
2455 _In_ struct _BL_TEXT_CONSOLE* Console,
2456 _In_ BOOLEAN LineOnly
2457 );
2458
2459 NTSTATUS
2460 ConsoleTextLocalWriteText (
2461 _In_ struct _BL_TEXT_CONSOLE* Console,
2462 _In_ PCHAR Text,
2463 _In_ ULONG Attribute
2464 );
2465
2466 NTSTATUS
2467 ConsoleTextLocalConstruct (
2468 _In_ PBL_TEXT_CONSOLE TextConsole,
2469 _In_ BOOLEAN Activate
2470 );
2471
2472 BOOLEAN
2473 ConsolepFindResolution (
2474 _In_ PBL_DISPLAY_MODE Mode,
2475 _In_ PBL_DISPLAY_MODE List,
2476 _In_ ULONG MaxIndex
2477 );
2478
2479 NTSTATUS
2480 ConsoleFirmwareTextClear (
2481 _In_ PBL_TEXT_CONSOLE Console,
2482 _In_ BOOLEAN LineOnly
2483 );
2484
2485 VOID
2486 ConsoleFirmwareTextClose (
2487 _In_ PBL_TEXT_CONSOLE TextConsole
2488 );
2489
2490 NTSTATUS
2491 ConsoleFirmwareTextOpen (
2492 _In_ PBL_TEXT_CONSOLE TextConsole
2493 );
2494
2495 NTSTATUS
2496 ConsoleFirmwareTextSetState (
2497 _In_ PBL_TEXT_CONSOLE TextConsole,
2498 _In_ UCHAR Mask,
2499 _In_ PBL_DISPLAY_STATE State
2500 );
2501
2502 NTSTATUS
2503 ConsoleGraphicalConstruct (
2504 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
2505 );
2506
2507 NTSTATUS
2508 ConsoleCreateRemoteConsole (
2509 _In_ PBL_TEXT_CONSOLE* TextConsole
2510 );
2511
2512 NTSTATUS
2513 ConsoleEfiGraphicalOpenProtocol (
2514 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole,
2515 _In_ BL_GRAPHICS_CONSOLE_TYPE Type
2516 );
2517
2518 VOID
2519 ConsoleFirmwareGraphicalClose (
2520 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
2521 );
2522
2523 VOID
2524 ConsoleFirmwareGraphicalDisable (
2525 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
2526 );
2527
2528 NTSTATUS
2529 ConsoleFirmwareGraphicalClear (
2530 _In_ PBL_GRAPHICS_CONSOLE Console,
2531 _In_ ULONG Color
2532 );
2533
2534 NTSTATUS
2535 ConsoleFirmwareGraphicalEnable (
2536 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
2537 );
2538
2539 NTSTATUS
2540 ConsoleEfiUgaOpen (
2541 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
2542 );
2543
2544 VOID
2545 ConsoleEfiUgaClose (
2546 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
2547 );
2548
2549 VOID
2550 ConsoleEfiGopClose (
2551 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
2552 );
2553
2554 NTSTATUS
2555 ConsoleEfiGopOpen (
2556 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
2557 );
2558
2559 NTSTATUS
2560 ConsoleEfiGopEnable (
2561 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
2562 );
2563
2564 NTSTATUS
2565 ConsoleEfiUgaSetResolution (
2566 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole,
2567 _In_ PBL_DISPLAY_MODE DisplayMode,
2568 _In_ ULONG DisplayModeCount
2569 );
2570
2571 NTSTATUS
2572 ConsoleCreateLocalInputConsole (
2573 VOID
2574 );
2575
2576 NTSTATUS
2577 ConsoleInputLocalEraseBuffer (
2578 _In_ PBL_INPUT_CONSOLE Console,
2579 _In_opt_ PULONG ValueToFill
2580 );
2581
2582 VOID
2583 ConsolepClearBuffer (
2584 _In_ PUCHAR FrameBuffer,
2585 _In_ ULONG Width,
2586 _In_ PUCHAR FillColor,
2587 _In_ ULONG Height,
2588 _In_ ULONG ScanlineWidth,
2589 _In_ ULONG PixelDepth
2590 );
2591
2592 NTSTATUS
2593 ConsolepConvertColorToPixel (
2594 _In_ BL_COLOR Color,
2595 _Out_ PUCHAR Pixel
2596 );
2597
2598 extern ULONG MmDescriptorCallTreeCount;
2599 extern ULONG BlpApplicationFlags;
2600 extern BL_LIBRARY_PARAMETERS BlpLibraryParameters;
2601 extern BL_TRANSLATION_TYPE MmTranslationType;
2602 extern PBL_ARCH_CONTEXT CurrentExecutionContext;
2603 extern PBL_DEVICE_DESCRIPTOR BlpBootDevice;
2604 extern BL_LOADED_APPLICATION_ENTRY BlpApplicationEntry;
2605 extern EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *EfiConOut;
2606 extern EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *EfiConInEx;
2607 extern EFI_GUID EfiGraphicsOutputProtocol;
2608 extern EFI_GUID EfiUgaDrawProtocol;
2609 extern EFI_GUID EfiLoadedImageProtocol;
2610 extern EFI_GUID EfiDevicePathProtocol;
2611 extern EFI_GUID EfiBlockIoProtocol;
2612 extern EFI_GUID EfiSimpleTextInputExProtocol;
2613 extern EFI_GUID EfiRootAcpiTableGuid;
2614 extern EFI_GUID EfiRootAcpiTable10Guid;
2615 extern EFI_GUID EfiGlobalVariable;
2616 extern ULONG ConsoleGraphicalResolutionListFlags;
2617 extern BL_DISPLAY_MODE ConsoleGraphicalResolutionList[];
2618 extern BL_DISPLAY_MODE ConsoleTextResolutionList[];
2619 extern ULONG ConsoleGraphicalResolutionListSize;
2620 extern PVOID DspRemoteInputConsole;
2621 extern PVOID DspLocalInputConsole;
2622 extern WCHAR BlScratchBuffer[8192];
2623 extern BL_MEMORY_DESCRIPTOR_LIST MmMdlMappedAllocated;
2624 extern BL_MEMORY_DESCRIPTOR_LIST MmMdlMappedUnallocated;
2625 extern BL_MEMORY_DESCRIPTOR_LIST MmMdlFwAllocationTracker;
2626 extern BL_MEMORY_DESCRIPTOR_LIST MmMdlUnmappedAllocated;
2627 extern BL_MEMORY_DESCRIPTOR_LIST MmMdlUnmappedUnallocated;
2628 extern BL_MEMORY_DESCRIPTOR_LIST MmMdlReservedAllocated;
2629 extern BL_MEMORY_DESCRIPTOR_LIST MmMdlBadMemory;
2630 extern BL_MEMORY_DESCRIPTOR_LIST MmMdlTruncatedMemory;
2631 extern BL_MEMORY_DESCRIPTOR_LIST MmMdlPersistentMemory;
2632 extern BL_MEMORY_DESCRIPTOR_LIST MmMdlCompleteBadMemory;
2633 extern BL_MEMORY_DESCRIPTOR_LIST MmMdlFreeVirtual;
2634 extern BL_MEMORY_DESCRIPTOR_LIST MmMdlMappingTrackers;
2635 extern ULONGLONG BlpTimePerformanceFrequency;
2636 extern LIST_ENTRY RegisteredFileSystems;
2637
2638 #endif