3 Copyright (c) 2004 - 2010, Intel Corporation. All rights reserved.<BR>
4 This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
18 Basic Ascii AvSPrintf() function named VSPrint(). VSPrint() enables very
19 simple implemenation of SPrint() and Print() to support debug.
21 You can not Print more than EFI_DRIVER_LIB_MAX_PRINT_BUFFER characters at a
22 time. This makes the implementation very simple.
24 VSPrint, Print, SPrint format specification has the follwoing form
32 ',' - Place commas in numberss
33 '0' - Prefix for width with zeros
38 '*' - Get width from a UINTN argumnet from the argument list
39 Decimal number that represents width of print
42 'X' - argument is a UINTN hex number, prefix '0'
43 'x' - argument is a hex number
44 'd' - argument is a decimal number
45 'a' - argument is an ascii string
46 'S','s' - argument is an Unicode string
47 'g' - argument is a pointer to an EFI_GUID
48 't' - argument is a pointer to an EFI_TIME structure
49 'c' - argument is an ascii character
50 'r' - argument is EFI_STATUS
56 #include "EfiDriverLib.h"
57 #include "TianoCommon.h"
58 #include "EfiCommonLib.h"
59 #include "PrintWidth.h"
60 #include "EfiPrintLib.h"
62 #if (EFI_SPECIFICATION_VERSION >= 0x0002000A)
63 #include EFI_PROTOCOL_DEFINITION (HiiFont)
65 #include EFI_PROTOCOL_DEFINITION (Hii)
74 IN OUT VA_LIST
*Marker
81 IN OUT CHAR_W
*Buffer
,
89 IN OUT CHAR_W
*Buffer
,
101 static EFI_GRAPHICS_OUTPUT_BLT_PIXEL mEfiColors
[16] = {
102 {0x00, 0x00, 0x00, 0x00},
103 {0x98, 0x00, 0x00, 0x00},
104 {0x00, 0x98, 0x00, 0x00},
105 {0x98, 0x98, 0x00, 0x00},
106 {0x00, 0x00, 0x98, 0x00},
107 {0x98, 0x00, 0x98, 0x00},
108 {0x00, 0x98, 0x98, 0x00},
109 {0x98, 0x98, 0x98, 0x00},
110 {0x10, 0x10, 0x10, 0x00},
111 {0xff, 0x10, 0x10, 0x00},
112 {0x10, 0xff, 0x10, 0x00},
113 {0xff, 0xff, 0x10, 0x00},
114 {0x10, 0x10, 0xff, 0x00},
115 {0xf0, 0x10, 0xff, 0x00},
116 {0x10, 0xff, 0xff, 0x00},
117 {0xff, 0xff, 0xff, 0x00},
123 IN EFI_GRAPHICS_OUTPUT_PROTOCOL
*GraphicsOutput
,
124 IN EFI_UGA_DRAW_PROTOCOL
*UgaDraw
,
125 IN EFI_SIMPLE_TEXT_OUT_PROTOCOL
*Sto
,
128 IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL
*Foreground
,
129 IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL
*Background
,
137 Display string worker for: Print, PrintAt, IPrint, IPrintAt
141 GraphicsOutput - Graphics output protocol interface
143 UgaDraw - UGA draw protocol interface
145 Sto - Simple text out protocol interface
147 X - X coordinate to start printing
149 Y - Y coordinate to start printing
151 Foreground - Foreground color
153 Background - Background color
157 args - Print arguments
161 Length of string printed to the console
168 CHAR16
*UnicodeWeight
;
169 UINT32 HorizontalResolution
;
170 UINT32 VerticalResolution
;
175 #if (EFI_SPECIFICATION_VERSION >= 0x0002000A)
176 EFI_HII_FONT_PROTOCOL
*HiiFont
;
177 EFI_IMAGE_OUTPUT
*Blt
;
178 EFI_FONT_DISPLAY_INFO
*FontInfo
;
180 EFI_HII_PROTOCOL
*Hii
;
184 EFI_NARROW_GLYPH
*Glyph
;
185 EFI_GRAPHICS_OUTPUT_BLT_PIXEL
*LineBuffer
;
189 // For now, allocate an arbitrarily long buffer
191 Buffer
= EfiLibAllocateZeroPool (0x10000);
192 if (Buffer
== NULL
) {
196 if (GraphicsOutput
!= NULL
) {
197 HorizontalResolution
= GraphicsOutput
->Mode
->Info
->HorizontalResolution
;
198 VerticalResolution
= GraphicsOutput
->Mode
->Info
->VerticalResolution
;
200 UgaDraw
->GetMode (UgaDraw
, &HorizontalResolution
, &VerticalResolution
, &ColorDepth
, &RefreshRate
);
202 ASSERT ((HorizontalResolution
!= 0) && (VerticalResolution
!=0));
204 #if (EFI_SPECIFICATION_VERSION >= 0x0002000A)
207 ASSERT (GraphicsOutput
!= NULL
);
208 Status
= gBS
->LocateProtocol (&gEfiHiiFontProtocolGuid
, NULL
, (VOID
**) &HiiFont
);
209 if (EFI_ERROR (Status
)) {
214 Status
= gBS
->LocateProtocol (&gEfiHiiProtocolGuid
, NULL
, (VOID
**)&Hii
);
215 if (EFI_ERROR (Status
)) {
218 LineBufferLen
= sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL
) * HorizontalResolution
* GLYPH_HEIGHT
;
219 LineBuffer
= EfiLibAllocatePool (LineBufferLen
);
220 if (LineBuffer
== NULL
) {
221 Status
= EFI_OUT_OF_RESOURCES
;
226 VSPrint (Buffer
, 0x10000, fmt
, args
);
228 UnicodeWeight
= (CHAR16
*) Buffer
;
230 for (Index
= 0; UnicodeWeight
[Index
] != 0; Index
++) {
231 if (UnicodeWeight
[Index
] == CHAR_BACKSPACE
||
232 UnicodeWeight
[Index
] == CHAR_LINEFEED
||
233 UnicodeWeight
[Index
] == CHAR_CARRIAGE_RETURN
) {
234 UnicodeWeight
[Index
] = 0;
238 BufferLen
= EfiStrLen (Buffer
);
241 #if (EFI_SPECIFICATION_VERSION >= 0x0002000A)
242 LineBufferLen
= sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL
) * HorizontalResolution
* EFI_GLYPH_HEIGHT
;
243 if (EFI_GLYPH_WIDTH
* EFI_GLYPH_HEIGHT
* sizeof(EFI_GRAPHICS_OUTPUT_BLT_PIXEL
) * BufferLen
> LineBufferLen
) {
244 Status
= EFI_INVALID_PARAMETER
;
248 Blt
= (EFI_IMAGE_OUTPUT
*) EfiLibAllocateZeroPool (sizeof (EFI_IMAGE_OUTPUT
));
250 Status
= EFI_OUT_OF_RESOURCES
;
254 Blt
->Width
= (UINT16
) (HorizontalResolution
);
255 Blt
->Height
= (UINT16
) (VerticalResolution
);
256 Blt
->Image
.Screen
= GraphicsOutput
;
258 FontInfo
= (EFI_FONT_DISPLAY_INFO
*) EfiLibAllocateZeroPool (sizeof (EFI_FONT_DISPLAY_INFO
));
259 if (FontInfo
== NULL
) {
260 Status
= EFI_OUT_OF_RESOURCES
;
263 if (Foreground
!= NULL
) {
264 EfiCopyMem (&FontInfo
->ForegroundColor
, Foreground
, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL
));
267 &FontInfo
->ForegroundColor
,
268 &mEfiColors
[Sto
->Mode
->Attribute
& 0x0f],
269 sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL
)
272 if (Background
!= NULL
) {
273 EfiCopyMem (&FontInfo
->BackgroundColor
, Background
, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL
));
276 &FontInfo
->BackgroundColor
,
277 &mEfiColors
[Sto
->Mode
->Attribute
>> 4],
278 sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL
)
282 Status
= HiiFont
->StringToImage (
284 EFI_HII_IGNORE_IF_NO_GLYPH
| EFI_HII_DIRECT_TO_SCREEN
,
298 if (GLYPH_WIDTH
* GLYPH_HEIGHT
* sizeof(EFI_GRAPHICS_OUTPUT_BLT_PIXEL
) * BufferLen
> LineBufferLen
) {
299 Status
= EFI_INVALID_PARAMETER
;
303 for (Index
= 0; Index
< BufferLen
; Index
++) {
304 StringIndex
= (UINT16
) Index
;
305 Status
= Hii
->GetGlyph (Hii
, UnicodeWeight
, &StringIndex
, (UINT8
**) &Glyph
, &GlyphWidth
, &GlyphStatus
);
306 if (EFI_ERROR (Status
)) {
310 if (Foreground
== NULL
|| Background
== NULL
) {
311 Status
= Hii
->GlyphToBlt (
314 mEfiColors
[Sto
->Mode
->Attribute
& 0x0f],
315 mEfiColors
[Sto
->Mode
->Attribute
>> 4],
319 &LineBuffer
[Index
* GLYPH_WIDTH
]
322 Status
= Hii
->GlyphToBlt (
330 &LineBuffer
[Index
* GLYPH_WIDTH
]
336 // Blt a character to the screen
338 if (GraphicsOutput
!= NULL
) {
339 Status
= GraphicsOutput
->Blt (
347 GLYPH_WIDTH
* BufferLen
,
349 GLYPH_WIDTH
* BufferLen
* sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL
)
352 Status
= UgaDraw
->Blt (
354 (EFI_UGA_PIXEL
*) LineBuffer
,
355 EfiUgaBltBufferToVideo
,
360 GLYPH_WIDTH
* BufferLen
,
362 GLYPH_WIDTH
* BufferLen
* sizeof (EFI_UGA_PIXEL
)
369 #if (EFI_SPECIFICATION_VERSION >= 0x0002000A)
370 EfiLibSafeFreePool (Blt
);
371 EfiLibSafeFreePool (FontInfo
);
373 EfiLibSafeFreePool (LineBuffer
);
375 gBS
->FreePool (Buffer
);
377 if (EFI_ERROR (Status
)) {
389 IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL
*ForeGround
, OPTIONAL
390 IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL
*BackGround
, OPTIONAL
398 Prints a formatted unicode string to the default console
402 X - X coordinate to start printing
404 Y - Y coordinate to start printing
406 ForeGround - Foreground color
408 BackGround - Background color
412 ... - Print arguments
416 Length of string printed to the console
421 EFI_GRAPHICS_OUTPUT_PROTOCOL
*GraphicsOutput
;
422 EFI_UGA_DRAW_PROTOCOL
*UgaDraw
;
423 EFI_SIMPLE_TEXT_OUT_PROTOCOL
*Sto
;
427 VA_START (Args
, Fmt
);
429 Handle
= gST
->ConsoleOutHandle
;
431 Status
= gBS
->HandleProtocol (
433 &gEfiGraphicsOutputProtocolGuid
,
434 (VOID
**)&GraphicsOutput
438 if (EFI_ERROR (Status
)) {
439 GraphicsOutput
= NULL
;
441 Status
= gBS
->HandleProtocol (
443 &gEfiUgaDrawProtocolGuid
,
447 if (EFI_ERROR (Status
) || (UgaDraw
== NULL
)) {
453 Status
= gBS
->HandleProtocol (
455 &gEfiSimpleTextOutProtocolGuid
,
459 if (EFI_ERROR (Status
) || (Sto
== NULL
)) {
463 return _IPrint (GraphicsOutput
, UgaDraw
, Sto
, X
, Y
, ForeGround
, BackGround
, Fmt
, Args
);
471 IN CONST CHAR_W
*Format
,
478 SPrint function to process format and place the results in Buffer.
482 Buffer - Wide char buffer to print the results of the parsing of Format into.
484 BufferSize - Maximum number of characters to put into buffer. Zero means no
487 Format - Format string see file header for more details.
489 ... - Vararg list consumed by processing Format.
493 Number of characters printed.
500 VA_START (Marker
, Format
);
501 Return
= VSPrint (Buffer
, BufferSize
, Format
, Marker
);
510 OUT CHAR_W
*StartOfBuffer
,
512 IN CONST CHAR_W
*FormatString
,
519 VSPrint function to process format and place the results in Buffer. Since a
520 VA_LIST is used this rountine allows the nesting of Vararg routines. Thus
521 this is the main print working routine
525 StartOfBuffer - Unicode buffer to print the results of the parsing of Format into.
527 BufferSize - Maximum number of characters to put into buffer. Zero means
530 FormatString - Unicode format string see file header for more details.
532 Marker - Vararg list consumed by processing Format.
536 Number of characters printed.
540 CHAR16 TempBuffer
[CHARACTER_NUMBER_FOR_VALUE
];
549 UINTN NumberOfCharacters
;
555 // Process the format string. Stop if Buffer is over run.
558 Buffer
= StartOfBuffer
;
559 Format
= (CHAR_W
*) FormatString
;
560 NumberOfCharacters
= BufferSize
/ sizeof (CHAR_W
);
561 BufferLeft
= BufferSize
;
562 for (Index
= 0; (*Format
!= '\0') && (Index
< NumberOfCharacters
- 1); Format
++) {
563 if (*Format
!= '%') {
564 if ((*Format
== '\n') && (Index
< NumberOfCharacters
- 2)) {
566 // If carage return add line feed
568 Buffer
[Index
++] = '\r';
569 BufferLeft
-= sizeof (CHAR_W
);
572 Buffer
[Index
++] = *Format
;
573 BufferLeft
-= sizeof (CHAR_W
);
577 // Now it's time to parse what follows after %
579 Format
= GetFlagsAndWidth (Format
, &Flags
, &Width
, &Marker
);
583 // Flag space, +, 0, L & l are invalid for type p.
585 Flags
&= ~(PREFIX_BLANK
| PREFIX_SIGN
| LONG_TYPE
);
586 if (sizeof (VOID
*) > 4) {
588 Value
= VA_ARG (Marker
, UINT64
);
590 Value
= VA_ARG (Marker
, UINTN
);
592 Flags
|= PREFIX_ZERO
;
594 EfiValueToHexStr (TempBuffer
, Value
, Flags
, Width
);
595 UnicodeStr
= TempBuffer
;
597 for ( ;(*UnicodeStr
!= '\0') && (Index
< NumberOfCharacters
- 1); UnicodeStr
++) {
598 Buffer
[Index
++] = *UnicodeStr
;
603 Flags
|= PREFIX_ZERO
;
604 Width
= sizeof (UINT64
) * 2;
607 // break skiped on purpose
610 if ((Flags
& LONG_TYPE
) == LONG_TYPE
) {
611 Value
= VA_ARG (Marker
, UINT64
);
613 Value
= VA_ARG (Marker
, UINTN
);
616 EfiValueToHexStr (TempBuffer
, Value
, Flags
, Width
);
617 UnicodeStr
= TempBuffer
;
619 for (; (*UnicodeStr
!= '\0') && (Index
< NumberOfCharacters
- 1); UnicodeStr
++) {
620 Buffer
[Index
++] = *UnicodeStr
;
625 if ((Flags
& LONG_TYPE
) == LONG_TYPE
) {
626 Value
= VA_ARG (Marker
, UINT64
);
628 Value
= (UINTN
) VA_ARG (Marker
, UINTN
);
631 EfiValueToString (TempBuffer
, Value
, Flags
, Width
);
632 UnicodeStr
= TempBuffer
;
634 for (; (*UnicodeStr
!= '\0') && (Index
< NumberOfCharacters
- 1); UnicodeStr
++) {
635 Buffer
[Index
++] = *UnicodeStr
;
641 UnicodeStr
= (CHAR16
*) VA_ARG (Marker
, CHAR_W
*);
642 if (UnicodeStr
== NULL
) {
643 UnicodeStr
= L
"<null string>";
646 for (Count
= 0; (*UnicodeStr
!= '\0') && (Index
< NumberOfCharacters
- 1); UnicodeStr
++, Count
++) {
647 Buffer
[Index
++] = *UnicodeStr
;
650 // Add padding if needed
652 for (; (Count
< Width
) && (Index
< NumberOfCharacters
- 1); Count
++) {
653 Buffer
[Index
++] = ' ';
659 AsciiStr
= (CHAR8
*) VA_ARG (Marker
, CHAR8
*);
660 if (AsciiStr
== NULL
) {
661 AsciiStr
= (CHAR8
*) "<null string>";
664 for (Count
= 0; (*AsciiStr
!= '\0') && (Index
< NumberOfCharacters
- 1); AsciiStr
++, Count
++) {
665 Buffer
[Index
++] = (CHAR_W
) * AsciiStr
;
668 // Add padding if needed
670 for (; (Count
< Width
) && (Index
< NumberOfCharacters
- 1); Count
++) {
671 Buffer
[Index
++] = ' ';
676 Buffer
[Index
++] = (CHAR_W
) VA_ARG (Marker
, UINTN
);
680 TmpGUID
= VA_ARG (Marker
, EFI_GUID
*);
681 if (TmpGUID
!= NULL
) {
682 Index
+= GuidToString (
691 Index
+= TimeToString (
692 VA_ARG (Marker
, EFI_TIME
*),
699 Index
+= EfiStatusToString (
700 VA_ARG (Marker
, EFI_STATUS
),
707 Buffer
[Index
++] = *Format
;
712 // if the type is unknown print it to the screen
714 Buffer
[Index
++] = *Format
;
717 BufferLeft
= BufferSize
- Index
* sizeof (CHAR_W
);
721 Buffer
[Index
++] = '\0';
723 return &Buffer
[Index
] - StartOfBuffer
;
732 IN OUT VA_LIST
*Marker
738 VSPrint worker function that parses flag and width information from the
739 Format string and returns the next index into the Format string that needs
740 to be parsed. See file headed for details of Flag and Width.
744 Format - Current location in the VSPrint format string.
746 Flags - Returns flags
748 Width - Returns width of element
750 Marker - Vararg list that may be paritally consumed and returned.
754 Pointer indexed into the Format string for all the information parsed
764 for (Done
= FALSE
; !Done
;) {
770 *Flags
|= LEFT_JUSTIFY
;
774 *Flags
|= PREFIX_SIGN
;
778 *Flags
|= PREFIX_BLANK
;
782 *Flags
|= COMMA_TYPE
;
791 *Width
= VA_ARG (*Marker
, UINTN
);
795 *Flags
|= PREFIX_ZERO
;
808 Count
= (Count
* 10) +*Format
- '0';
810 } while ((*Format
>= '0') && (*Format
<= '9'));
834 VSPrint worker function that prints an EFI_GUID.
838 Guid - Pointer to GUID to print.
840 Buffer - Buffe to print Guid into.
842 BufferSize - Size of Buffer.
846 Number of characters printed.
855 STRING_W ("%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x"),
859 (UINTN
)Guid
->Data4
[0],
860 (UINTN
)Guid
->Data4
[1],
861 (UINTN
)Guid
->Data4
[2],
862 (UINTN
)Guid
->Data4
[3],
863 (UINTN
)Guid
->Data4
[4],
864 (UINTN
)Guid
->Data4
[5],
865 (UINTN
)Guid
->Data4
[6],
866 (UINTN
)Guid
->Data4
[7]
870 // SPrint will null terminate the string. The -1 skips the null
887 VSPrint worker function that prints EFI_TIME.
891 Time - Pointer to EFI_TIME sturcture to print.
893 Buffer - Buffer to print Time into.
895 BufferSize - Size of Buffer.
899 Number of characters printed.
908 STRING_W ("%02d/%02d/%04d %02d:%02d"),
917 // SPrint will null terminate the string. The -1 skips the null
925 IN EFI_STATUS Status
,
933 VSPrint worker function that prints EFI_STATUS as a string. If string is
934 not known a hex value will be printed.
938 Status - EFI_STATUS sturcture to print.
940 Buffer - Buffer to print EFI_STATUS message string into.
942 BufferSize - Size of Buffer.
946 Number of characters printed.
956 // Can't use global Status String Array as UINTN is not constant for EBC
958 if (Status
== EFI_SUCCESS
) { Desc
= (CHAR8
*) "Success"; } else
959 if (Status
== EFI_LOAD_ERROR
) { Desc
= (CHAR8
*) "Load Error"; } else
960 if (Status
== EFI_INVALID_PARAMETER
) { Desc
= (CHAR8
*) "Invalid Parameter"; } else
961 if (Status
== EFI_UNSUPPORTED
) { Desc
= (CHAR8
*) "Unsupported"; } else
962 if (Status
== EFI_BAD_BUFFER_SIZE
) { Desc
= (CHAR8
*) "Bad Buffer Size"; } else
963 if (Status
== EFI_BUFFER_TOO_SMALL
) { Desc
= (CHAR8
*) "Buffer Too Small"; } else
964 if (Status
== EFI_NOT_READY
) { Desc
= (CHAR8
*) "Not Ready"; } else
965 if (Status
== EFI_DEVICE_ERROR
) { Desc
= (CHAR8
*) "Device Error"; } else
966 if (Status
== EFI_WRITE_PROTECTED
) { Desc
= (CHAR8
*) "Write Protected"; } else
967 if (Status
== EFI_OUT_OF_RESOURCES
) { Desc
= (CHAR8
*) "Out of Resources"; } else
968 if (Status
== EFI_VOLUME_CORRUPTED
) { Desc
= (CHAR8
*) "Volume Corrupt"; } else
969 if (Status
== EFI_VOLUME_FULL
) { Desc
= (CHAR8
*) "Volume Full"; } else
970 if (Status
== EFI_NO_MEDIA
) { Desc
= (CHAR8
*) "No Media"; } else
971 if (Status
== EFI_MEDIA_CHANGED
) { Desc
= (CHAR8
*) "Media changed"; } else
972 if (Status
== EFI_NOT_FOUND
) { Desc
= (CHAR8
*) "Not Found"; } else
973 if (Status
== EFI_ACCESS_DENIED
) { Desc
= (CHAR8
*) "Access Denied"; } else
974 if (Status
== EFI_NO_RESPONSE
) { Desc
= (CHAR8
*) "No Response"; } else
975 if (Status
== EFI_NO_MAPPING
) { Desc
= (CHAR8
*) "No mapping"; } else
976 if (Status
== EFI_TIMEOUT
) { Desc
= (CHAR8
*) "Time out"; } else
977 if (Status
== EFI_NOT_STARTED
) { Desc
= (CHAR8
*) "Not started"; } else
978 if (Status
== EFI_ALREADY_STARTED
) { Desc
= (CHAR8
*) "Already started"; } else
979 if (Status
== EFI_ABORTED
) { Desc
= (CHAR8
*) "Aborted"; } else
980 if (Status
== EFI_ICMP_ERROR
) { Desc
= (CHAR8
*) "ICMP Error"; } else
981 if (Status
== EFI_TFTP_ERROR
) { Desc
= (CHAR8
*) "TFTP Error"; } else
982 if (Status
== EFI_PROTOCOL_ERROR
) { Desc
= (CHAR8
*) "Protocol Error"; } else
983 if (Status
== EFI_WARN_UNKNOWN_GLYPH
) { Desc
= (CHAR8
*) "Warning Unknown Glyph"; } else
984 if (Status
== EFI_WARN_DELETE_FAILURE
) { Desc
= (CHAR8
*) "Warning Delete Failure"; } else
985 if (Status
== EFI_WARN_WRITE_FAILURE
) { Desc
= (CHAR8
*) "Warning Write Failure"; } else
986 if (Status
== EFI_WARN_BUFFER_TOO_SMALL
) { Desc
= (CHAR8
*) "Warning Buffer Too Small"; }
989 // If we found a match, copy the message to the user's buffer. Otherwise
990 // sprint the hex status code to their buffer.
993 Size
= SPrint (Buffer
, BufferSize
, STRING_W ("%a"), Desc
);
995 Size
= SPrint (Buffer
, BufferSize
, STRING_W ("%X"), Status
);