43#include <Library/BaseLib.h>
44#include <Library/BaseMemoryLib.h>
45#include <Library/DebugLib.h>
46#include <Library/MemoryAllocationLib.h>
53#define XML_EXPORT_MIN_ALLOCATION_SIZE 4096
55#define XML_PLIST_HEADER "<?xml version=\"1.0\" encoding=\"UTF-8\"?><!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">"
150 IN CONST CHAR8 *Attributes,
151 IN CONST CHAR8 *Argument,
152 IN UINT32 ArgumentLength,
153 OUT UINT32 *ArgumentValue
156 CONST CHAR8 *ArgumentStart;
157 CONST CHAR8 *ArgumentEnd;
161 ASSERT (Attributes != NULL);
162 ASSERT (Argument != NULL);
163 ASSERT (ArgumentValue != NULL);
169 ArgumentStart = AsciiStrStr (Attributes, Argument);
170 if (ArgumentStart == NULL) {
174 ArgumentStart += ArgumentLength;
175 ArgumentEnd = AsciiStrStr (ArgumentStart,
"\"");
176 Number = ArgumentEnd - ArgumentStart;
178 if ((ArgumentEnd == NULL) || (Number >
sizeof (NumberStr) - 1)) {
182 CopyMem (&NumberStr, ArgumentStart, Number);
183 NumberStr[Number] =
'\0';
184 *ArgumentValue = (UINT32)AsciiStrDecimalToUint64 (NumberStr);
203 IN CONST CHAR8 *Name,
204 IN CONST CHAR8 *Attributes OPTIONAL,
205 IN CONST CHAR8 *Content OPTIONAL,
214 Node = AllocatePool (
sizeof (
XML_NODE));
255 if (Node->Children != NULL) {
256 NodeCount = Node->Children->NodeCount;
257 AllocCount = Node->Children->AllocCount;
260 Node->Children->NodeList[NodeCount] = Child;
261 ++Node->Children->NodeCount;
283 if (NewList == NULL) {
290 if (Node->Children != NULL) {
294 sizeof (NewList->
NodeList[0]) * NodeCount
297 FreePool (Node->Children);
300 NewList->
NodeList[NodeCount] = Child;
320 IN UINT32 ReferenceNumber
324 UINT32 NewRefAllocCount;
326 ASSERT (References != NULL);
333 if (ReferenceNumber >= References->RefAllocCount) {
334 if (BaseOverflowAddMulU32 (ReferenceNumber, 1, 2, &NewRefAllocCount)) {
338 NewReferences = AllocateZeroPool (NewRefAllocCount *
sizeof (References->RefList[0]));
339 if (NewReferences == NULL) {
343 if (References->RefList != NULL) {
346 &References->RefList[0],
347 References->RefCount * sizeof (References->RefList[0])
349 FreePool (References->RefList);
352 References->RefList = NewReferences;
353 References->RefAllocCount = NewRefAllocCount;
356 References->RefList[ReferenceNumber] = Node;
357 if (ReferenceNumber >= References->RefCount) {
358 References->RefCount = ReferenceNumber + 1;
376 IN CONST CHAR8 *Attributes OPTIONAL
382 if ((References == NULL) || (Attributes == NULL)) {
393 if (!HasArgument || (Number >= References->RefCount)) {
397 return References->RefList[Number];
415 if (Node->Children != NULL) {
416 for (Index = 0; Index < Node->Children->NodeCount; ++Index) {
420 FreePool (Node->Children);
437 ASSERT (References != NULL);
439 if (References->RefList != NULL) {
440 FreePool (References->RefList);
441 References->RefList = NULL;
448#ifdef XML_PARSER_VERBOSE
449#define XML_PARSER_INFO(Parser, Message) \
450 DEBUG ((DEBUG_VERBOSE, "OCXML: XML_PARSER_INFO %a\n", Message));
451#define XML_PARSER_TAG(Parser, Tag) \
452 DEBUG ((DEBUG_VERBOSE, "OCXML: XML_PARSER_TAG %a\n", Tag));
454#define XML_PARSER_INFO(Parser, Message) do {} while (0)
455#define XML_PARSER_TAG(Parser, Tag) do {} while (0)
469 IN CONST CHAR8 *Message
484 if ((Parser->Length > 0) && ((Parser->Position > 0) || (
NO_CHARACTER != Offset))) {
485 Character = Parser->Position + Offset;
486 if (Character > Parser->Length-1) {
487 Character = Parser->Length-1;
490 for (Position = 0; Position <= Character; ++Position) {
493 if (
'\n' == Parser->Buffer[Position]) {
503 "OCXML: XmlParserError at %u:%u (is %c): %a\n",
506 Parser->Buffer[Character],
512 "OCXML: XmlParserError at %u:%u: %a\n",
523#ifdef XML_PRINT_ERRORS
524#define XML_PARSER_ERROR(Parser, Offset, Message) \
525 XmlParserError (Parser, Offset, Message)
526#define XML_USAGE_ERROR(Message) \
527 DEBUG ((DEBUG_VERBOSE, "OCXML: %a\n", Message));
529#define XML_PARSER_ERROR(Parser, Offset, Message) do {} while (0)
530#define XML_USAGE_ERROR(X) do {} while (0)
552 if ( !BaseOverflowAddU32 (Parser->Position,
N, &Position)
553 && (Position < Parser->
Length))
555 return Parser->Buffer[Position];
577 #ifdef XML_PARSER_VERBOSE
579 CHAR8 *MessageBuffer;
586 Consumed = AllocatePool ((
N + 1) *
sizeof (CHAR8));
587 MessageBuffer = AllocatePool (512 *
sizeof (CHAR8));
588 if ((Consumed != NULL) && (MessageBuffer != NULL)) {
590 if (Left > Parser->Length - Parser->Position) {
591 Left = Parser->Length - Parser->Position;
594 CopyMem (Consumed, &Parser->Buffer[Parser->Position], Left);
597 AsciiSPrint (MessageBuffer, 512,
"Consuming %u bytes \"%a\"",
N, Consumed);
601 if (Consumed != NULL) {
605 if (MessageBuffer != NULL) {
606 FreePool (MessageBuffer);
614 if ( BaseOverflowAddU32 (Parser->Position,
N, &Parser->Position)
615 || (Parser->Position > Parser->Length))
617 Parser->Position = Parser->Length;
636 while ( Parser->Position < Parser->Length
660 OUT BOOLEAN *SelfClosing OPTIONAL,
661 OUT CONST CHAR8 **Attributes OPTIONAL
666 UINT32 AttributeStart;
668 UINT32 NameLength = 0;
675 Start = Parser->Position;
681 if ((
'/' == Current) || (
'>' == Current)) {
688 if (NameLength == 0) {
703 if (NameLength != 0) {
704 if ((Attributes != NULL) && ((Current ==
'/') || (Current ==
'>'))) {
705 *Attributes = &Parser->Buffer[
Start + NameLength];
706 AttributeStart = NameLength;
721 if (
'/' == Current) {
722 if (SelfClosing == NULL) {
735 if (
'>' != Current) {
745 Parser->Buffer[
Start + NameLength] = 0;
747 return &Parser->Buffer[
Start];
767 OUT BOOLEAN *SelfClosing OPTIONAL,
768 OUT CONST CHAR8 **Attributes
776 ASSERT (Attributes != NULL);
798 if (Current ==
'/') {
805 if ((Current !=
'?') && (Current !=
'!')) {
817 if (Current ==
'!') {
825 if ((Current ==
'-') && (Next ==
'-')) {
838 while (Parser->Position < Parser->Length) {
868 }
while (Parser->Position < Parser->Length);
892 IN BOOLEAN Unprefixed
967 Start = Parser->Position;
976 if (
'<' == Current) {
1004 return &Parser->Buffer[
Start];
1020 IN OUT UINT32 *AllocSize,
1021 IN OUT UINT32 *CurrentSize,
1022 IN CONST CHAR8 *Data,
1023 IN UINT32 DataLength
1030 ASSERT (AllocSize != NULL);
1031 ASSERT (CurrentSize != NULL);
1034 NewSize = *AllocSize;
1036 if (NewSize - *CurrentSize <= DataLength) {
1040 NewSize += DataLength + 1;
1043 NewBuffer = AllocatePool (NewSize);
1044 if (NewBuffer == NULL) {
1052 *AllocSize = NewSize;
1056 *CurrentSize += DataLength;
1073 IN OUT UINT32 *AllocSize,
1074 IN OUT UINT32 *CurrentSize,
1083 ASSERT (AllocSize != NULL);
1084 ASSERT (CurrentSize != NULL);
1087 if (Node->Children != NULL) {
1088 for (Index = 0; Index < Node->Children->NodeCount; ++Index) {
1096 NameLength = (UINT32)AsciiStrLen (Node->Name);
1101 if (Node->Attributes != NULL) {
1103 XmlBufferAppend (
Buffer, AllocSize, CurrentSize, Node->Attributes, (UINT32)AsciiStrLen (Node->Attributes));
1106 if ((Node->Children != NULL) || (Node->Content != NULL)) {
1109 if (Node->Children != NULL) {
1110 for (Index = 0; Index < Node->Children->NodeCount; ++Index) {
1114 XmlBufferAppend (
Buffer, AllocSize, CurrentSize, Node->Content, (UINT32)AsciiStrLen (Node->Content));
1152 CONST CHAR8 *TagOpen;
1153 CONST CHAR8 *TagClose;
1154 CONST CHAR8 *Attributes;
1157 UINT32 ReferenceNumber;
1158 BOOLEAN IsReference;
1159 BOOLEAN SelfClosing;
1168 SelfClosing = FALSE;
1170 IsReference = FALSE;
1171 ReferenceNumber = 0;
1177 if (TagOpen == NULL) {
1215 if ((References != NULL) && (Node->
Attributes != NULL)) {
1245 if (Child == NULL) {
1269 if (!
HasChildren && (References != NULL) && (Attributes != NULL)) {
1283 if (TagClose == NULL) {
1292 if (AsciiStrCmp (TagOpen, TagClose) != 0) {
1298 if (IsReference && !
XmlPushReference (References, Node, ReferenceNumber)) {
1324 ZeroMem (&Parser,
sizeof (Parser));
1327 ZeroMem (&References,
sizeof (References));
1340 Root =
XmlParseNode (&Parser, WithRefs ? &References : NULL);
1351 if (Document == NULL) {
1360 Document->
Root = Root;
1369 OUT UINT32 *
Length OPTIONAL,
1371 IN BOOLEAN PrependPlistInfo
1380 ASSERT (Document != NULL);
1382 AllocSize = Document->Buffer.Length + 1;
1383 Buffer = AllocatePool (AllocSize);
1392 if (PrependPlistInfo) {
1403 NewBuffer = AllocatePool (NewSize);
1404 if (NewBuffer == NULL) {
1417 CurrentSize = NewSize - 1;
1429 Buffer[CurrentSize] =
'\0';
1439 ASSERT (Document != NULL);
1443 FreePool (Document);
1451 ASSERT (Document != NULL);
1453 return Document->Root;
1473 return Node->Real != NULL ? Node->Real->Content : Node->Content;
1479 IN CONST CHAR8 *Content
1483 ASSERT (Content != NULL);
1485 if (Node->Real != NULL) {
1486 Node->Real->Content = Content;
1489 Node->Content = Content;
1499 return Node->Children ? Node->Children->NodeCount : 0;
1510 return Node->Children->NodeList[Child];
1517 IN CONST CHAR8 *ChildName,
1527 ASSERT (ChildName != NULL);
1529 VA_START (Arguments, ChildName);
1534 while (ChildName != NULL) {
1543 if (AsciiStrCmp (
XmlNodeName (Child), ChildName) != 0) {
1569 ChildName = VA_ARG (Arguments, CONST CHAR8 *);
1583 IN CONST CHAR8 *Name,
1584 IN CONST CHAR8 *Attributes OPTIONAL,
1585 IN CONST CHAR8 *Content OPTIONAL
1593 NewNode =
XmlNodeCreate (Name, Attributes, Content, NULL, NULL);
1594 if (NewNode == NULL) {
1609 IN CONST CHAR8 *Name,
1610 IN CONST CHAR8 *Attributes,
1611 IN CONST CHAR8 *Content
1618 ASSERT (Attributes != NULL);
1619 ASSERT (Content != NULL);
1622 if (NewNode == NULL) {
1626 CopyMem (&Node->Children->NodeList[1], &Node->Children->NodeList[0], (Node->Children->NodeCount - 1) * sizeof (Node->Children->NodeList[0]));
1627 Node->Children->NodeList[0] = NewNode;
1639 ASSERT (Node->Children != NULL);
1640 ASSERT (Index < Node->Children->NodeCount);
1651 &Node->Children->NodeList[Index],
1652 &Node->Children->NodeList[Index+1],
1653 (Node->Children->NodeCount - 1 - Index) * sizeof (*Node->Children->NodeList)
1659 ZeroMem (&Node->Children->NodeList[Node->Children->NodeCount-1], sizeof (*Node->Children->NodeList));
1660 --Node->Children->NodeCount;
1672 ASSERT (Node->Children != NULL);
1673 ASSERT (ChildNode != NULL);
1675 for (Index = 0;
CompareMem (Node->Children->NodeList[Index], ChildNode, sizeof (
XML_NODE)) != 0; ++Index) {
1681 ASSERT (Index < Node->Children->NodeCount);
1688 IN CONST CHAR8 *String
1697 StringSize = AsciiStrSize (String);
1698 Pointer = (CHAR8 *)AllocatePool (StringSize);
1699 if (Pointer == NULL) {
1705 while (*String !=
'\0') {
1706 if (*String ==
'&') {
1707 if (AsciiStrnCmp (String + 1,
"apos;",
L_STR_LEN (
"apos;")) == 0) {
1710 }
else if (AsciiStrnCmp (String + 1,
"quot;",
L_STR_LEN (
"quot;")) == 0) {
1713 }
else if (AsciiStrnCmp (String + 1,
"amp;",
L_STR_LEN (
"amp;")) == 0) {
1716 }
else if (AsciiStrnCmp (String + 1,
"lt;",
L_STR_LEN (
"lt;")) == 0) {
1719 }
else if (AsciiStrnCmp (String + 1,
"gt;",
L_STR_LEN (
"gt;")) == 0) {
1723 *Pointer++ = *String++;
1726 *Pointer++ = *String++;
1732 return (CONST CHAR8 *)
Buffer;
1742 ASSERT (Document != NULL);
1744 Node = Document->Root;
1746 if (AsciiStrCmp (
XmlNodeName (Node),
"plist") != 0) {
1780 if (ChildrenNum % 2 != 0) {
1801 if (ChildrenNum > 0) {
1833 if (Value != NULL) {
1859 CONST CHAR8 *Content;
1870 if (Content == NULL) {
1876 Length = AsciiStrLen (Content);
1881 AsciiStrnCpyS (Value, *
Size, Content,
Length);
1892 CONST CHAR8 *Content;
1904 if (Content == NULL) {
1910 Status = Base64Decode (Content, AsciiStrLen (Content),
Buffer, &
Length);
1912 if (!EFI_ERROR (Status) && ((UINT32)
Length ==
Length)) {
1951 CONST CHAR8 *TempStr;
1962 while (*TempStr ==
' ' || *TempStr ==
'\t') {
1966 Negate = *TempStr ==
'-';
1972 if (Hex && (TempStr[0] !=
'0') && (TempStr[1] !=
'x')) {
1977 Temp = AsciiStrHexToUint64 (TempStr);
1979 Temp = AsciiStrDecimalToUint64 (TempStr);
1990 case sizeof (UINT64):
1991 *(UINT64 *)Value = Temp;
1993 case sizeof (UINT32):
1994 *(UINT32 *)Value = (UINT32)Temp;
1996 case sizeof (UINT16):
1997 *(UINT16 *)Value = (UINT16)Temp;
1999 case sizeof (UINT8):
2000 *(UINT8 *)Value = (UINT8)Temp;
2014 CONST CHAR8 *Content;
2023 if (Content != NULL) {
2025 Status = Base64Decode (Content, AsciiStrLen (Content),
Buffer, &
Length);
2027 if (!EFI_ERROR (Status) && ((UINT32)
Length ==
Length)) {
2041 if (Content != NULL) {
2042 Length = AsciiStrLen (Content);
2058 *
Size =
sizeof (UINT32);
2064 *
Size =
sizeof (UINT8);
2070 *
Size =
sizeof (UINT8);
2083 CONST CHAR8 *Content;
2092 if (Content != NULL) {
2093 *
Size = (UINT32)AsciiStrSize (Content);
2107 CONST CHAR8 *Content;
2116 if (Content != NULL) {
2117 *
Size = (UINT32)AsciiStrLen (Content);
2131 CONST CHAR8 *Content;
2137 if (Content != NULL) {
2138 *
Size = (UINT32)AsciiStrLen (Content);
2148 if (Content != NULL) {
2149 *
Size = (UINT32)(AsciiStrLen (Content) + 1);
2158 *
Size =
sizeof (UINT32);
2165 *
Size =
sizeof (UINT8);
DMG_SIZE_DEVICE_PATH Size
#define L_STR_LEN(String)
INTN IsAsciiSpace(IN CHAR8 Char)
#define L_STR_SIZE(String)
#define L_STR_SIZE_NT(String)
OC_TYPING_BUFFER_ENTRY Buffer[OC_TYPING_BUFFER_SIZE]
XML_NODE * XmlDocumentRoot(IN CONST XML_DOCUMENT *Document)
VOID XmlParserError(IN CONST XML_PARSER *Parser, IN XML_PARSER_OFFSET Offset, IN CONST CHAR8 *Message)
STATIC XML_NODE * XmlNodeCreate(IN CONST CHAR8 *Name, IN CONST CHAR8 *Attributes OPTIONAL, IN CONST CHAR8 *Content OPTIONAL, IN XML_NODE *Real OPTIONAL, IN XML_NODE_LIST *Children OPTIONAL)
STATIC BOOLEAN XmlParseAttributeNumber(IN CONST CHAR8 *Attributes, IN CONST CHAR8 *Argument, IN UINT32 ArgumentLength, OUT UINT32 *ArgumentValue)
STATIC BOOLEAN XmlPushReference(IN OUT XML_REFLIST *References, IN XML_NODE *Node, IN UINT32 ReferenceNumber)
STATIC CONST CHAR8 * XmlParseTagEnd(IN OUT XML_PARSER *Parser, OUT BOOLEAN *SelfClosing OPTIONAL, OUT CONST CHAR8 **Attributes OPTIONAL)
BOOLEAN PlistDataSize(IN XML_NODE *Node OPTIONAL, OUT UINT32 *Size)
STATIC XML_NODE * XmlParseNode(IN OUT XML_PARSER *Parser, IN OUT XML_REFLIST *References OPTIONAL)
#define XML_PARSER_ERROR(Parser, Offset, Message)
XML_DOCUMENT * XmlDocumentParse(IN OUT CHAR8 *Buffer, IN UINT32 Length, IN BOOLEAN WithRefs)
CONST CHAR8 * PlistKeyValue(IN XML_NODE *Node OPTIONAL)
BOOLEAN PlistMultiDataSize(IN XML_NODE *Node OPTIONAL, OUT UINT32 *Size)
enum XML_PARSER_OFFSET_ XML_PARSER_OFFSET
#define XML_PARSER_INFO(Parser, Message)
STATIC VOID XmlParserConsume(IN OUT XML_PARSER *Parser, IN UINT32 N)
CONST CHAR8 * PlistNodeTypes[PLIST_NODE_TYPE_MAX]
UINT32 XmlNodeChildren(IN CONST XML_NODE *Node)
VOID XmlNodeRemoveByIndex(IN OUT XML_NODE *Node, IN UINT32 Index)
#define XML_EXPORT_MIN_ALLOCATION_SIZE
XML_NODE *EFIAPI XmlEasyChild(IN OUT XML_NODE *Node, IN CONST CHAR8 *ChildName,...)
#define XML_USAGE_ERROR(X)
CHAR8 * XmlDocumentExport(IN CONST XML_DOCUMENT *Document, OUT UINT32 *Length OPTIONAL, IN UINT32 Skip, IN BOOLEAN PrependPlistInfo)
STATIC CONST CHAR8 * XmlParseTagOpen(IN OUT XML_PARSER *Parser, OUT BOOLEAN *SelfClosing OPTIONAL, OUT CONST CHAR8 **Attributes)
CONST CHAR8 * XmlNodeContent(IN CONST XML_NODE *Node)
STATIC XML_NODE * XmlNodeReal(IN CONST XML_REFLIST *References OPTIONAL, IN CONST CHAR8 *Attributes OPTIONAL)
UINT32 PlistDictChildren(IN CONST XML_NODE *Node)
BOOLEAN PlistStringSize(IN XML_NODE *Node OPTIONAL, OUT UINT32 *Size)
BOOLEAN PlistStringValue(IN XML_NODE *Node OPTIONAL, OUT CHAR8 *Value, IN OUT UINT32 *Size)
BOOLEAN PlistIntegerValue(IN XML_NODE *Node OPTIONAL, OUT VOID *Value, IN UINT32 Size, IN BOOLEAN Hex)
XML_NODE * PlistNodeCast(IN XML_NODE *Node OPTIONAL, IN PLIST_NODE_TYPE Type)
XML_NODE * XmlNodeAppend(IN OUT XML_NODE *Node, IN CONST CHAR8 *Name, IN CONST CHAR8 *Attributes OPTIONAL, IN CONST CHAR8 *Content OPTIONAL)
CONST CHAR8 * XmlNodeName(IN CONST XML_NODE *Node)
STATIC VOID XmlSkipWhitespace(IN OUT XML_PARSER *Parser)
STATIC VOID XmlBufferAppend(IN OUT CHAR8 **Buffer, IN OUT UINT32 *AllocSize, IN OUT UINT32 *CurrentSize, IN CONST CHAR8 *Data, IN UINT32 DataLength)
VOID XmlNodeRemove(IN OUT XML_NODE *Node, IN XML_NODE *ChildNode)
XML_NODE * XmlNodePrepend(IN OUT XML_NODE *Node, IN CONST CHAR8 *Name, IN CONST CHAR8 *Attributes, IN CONST CHAR8 *Content)
XML_NODE * PlistDocumentRoot(IN CONST XML_DOCUMENT *Document)
BOOLEAN PlistDataValue(IN XML_NODE *Node OPTIONAL, OUT UINT8 *Buffer, IN OUT UINT32 *Size)
CONST CHAR8 * XmlUnescapeString(IN CONST CHAR8 *String)
XML_NODE * XmlNodeChild(IN CONST XML_NODE *Node, IN UINT32 Child)
BOOLEAN PlistBooleanValue(IN XML_NODE *Node OPTIONAL, OUT BOOLEAN *Value)
STATIC CONST CHAR8 * XmlParseContent(IN OUT XML_PARSER *Parser)
STATIC VOID XmlNodeFree(IN OUT XML_NODE *Node)
STATIC VOID XmlNodeExportRecursive(IN CONST XML_NODE *Node, IN OUT CHAR8 **Buffer, IN OUT UINT32 *AllocSize, IN OUT UINT32 *CurrentSize, IN UINT32 Skip)
VOID XmlDocumentFree(IN OUT XML_DOCUMENT *Document)
VOID XmlNodeChangeContent(IN OUT XML_NODE *Node, IN CONST CHAR8 *Content)
STATIC CHAR8 XmlParserPeek(IN CONST XML_PARSER *Parser, IN UINT32 N)
BOOLEAN PlistMultiDataValue(IN XML_NODE *Node OPTIONAL, OUT VOID *Buffer, IN OUT UINT32 *Size)
XML_NODE * PlistDictChild(IN CONST XML_NODE *Node, IN UINT32 Child, OUT XML_NODE **Value OPTIONAL)
STATIC BOOLEAN XmlNodeChildPush(IN OUT XML_NODE *Node, IN XML_NODE *Child)
STATIC CONST CHAR8 * XmlParseTagClose(IN OUT XML_PARSER *Parser, IN BOOLEAN Unprefixed)
STATIC VOID XmlFreeRefs(IN OUT XML_REFLIST *References)
#define XML_PARSER_TAG(Parser, Tag)
@ PLIST_NODE_TYPE_INTEGER
#define XML_PARSER_MAX_SIZE
#define XML_PARSER_NODE_COUNT
#define XML_PARSER_MAX_REFERENCE_COUNT
#define XML_PARSER_NEST_LEVEL
enum PLIST_NODE_TYPE_ PLIST_NODE_TYPE
BOOLEAN HasChildren(IN EFI_HANDLE ControllerHandle)
INTN EFIAPI CompareMem(IN CONST VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)