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