mirror of
https://github.com/acidanthera/OpenCorePkg.git
synced 2025-12-08 19:25:01 +00:00
Implement attribute parsing in xml and add plist regenerate test
This commit is contained in:
parent
9ce5f7b29d
commit
515f0a8f85
@ -64,6 +64,7 @@ typedef struct XML_PARSER_ XML_PARSER;
|
||||
//
|
||||
struct XML_NODE_ {
|
||||
CONST CHAR8 *Name;
|
||||
CONST CHAR8 *Attributes;
|
||||
CONST CHAR8 *Content;
|
||||
XML_NODE_LIST *Children;
|
||||
};
|
||||
@ -130,6 +131,7 @@ STATIC
|
||||
XML_NODE *
|
||||
XmlNodeCreate (
|
||||
CONST CHAR8 *Name,
|
||||
CONST CHAR8 *Attributes,
|
||||
CONST CHAR8 *Content,
|
||||
XML_NODE_LIST *Children
|
||||
)
|
||||
@ -139,9 +141,10 @@ XmlNodeCreate (
|
||||
Node = AllocatePool (sizeof (XML_NODE));
|
||||
|
||||
if (Node != NULL) {
|
||||
Node->Name = Name;
|
||||
Node->Content = Content;
|
||||
Node->Children = Children;
|
||||
Node->Name = Name;
|
||||
Node->Attributes = Attributes;
|
||||
Node->Content = Content;
|
||||
Node->Children = Children;
|
||||
}
|
||||
|
||||
return Node;
|
||||
@ -409,11 +412,13 @@ STATIC
|
||||
CONST CHAR8 *
|
||||
XmlParseTagEnd (
|
||||
XML_PARSER *Parser,
|
||||
BOOLEAN *SelfClosing
|
||||
BOOLEAN *SelfClosing,
|
||||
CONST CHAR8 **Attributes
|
||||
)
|
||||
{
|
||||
CHAR8 Current;
|
||||
UINT32 Start;
|
||||
UINT32 AttributeStart;
|
||||
UINT32 Length = 0;
|
||||
UINT32 NameLength = 0;
|
||||
|
||||
@ -446,9 +451,22 @@ XmlParseTagEnd (
|
||||
}
|
||||
|
||||
//
|
||||
// No attributes besides name.
|
||||
// Handle attributes.
|
||||
//
|
||||
if (NameLength == 0) {
|
||||
if (NameLength != 0) {
|
||||
if (Attributes != NULL) {
|
||||
*Attributes = &Parser->Buffer[Start + NameLength];
|
||||
AttributeStart = NameLength;
|
||||
while (IsAsciiSpace (**Attributes) && AttributeStart < Length) {
|
||||
(*Attributes)++;
|
||||
AttributeStart++;
|
||||
}
|
||||
Parser->Buffer[Start + Length] = '\0';
|
||||
}
|
||||
} else {
|
||||
//
|
||||
// No attributes besides name.
|
||||
//
|
||||
NameLength = Length;
|
||||
}
|
||||
|
||||
@ -491,7 +509,8 @@ STATIC
|
||||
CONST CHAR8 *
|
||||
XmlParseTagOpen (
|
||||
XML_PARSER *Parser,
|
||||
BOOLEAN *SelfClosing
|
||||
BOOLEAN *SelfClosing,
|
||||
CONST CHAR8 **Attributes
|
||||
)
|
||||
{
|
||||
CHAR8 Current;
|
||||
@ -539,7 +558,7 @@ XmlParseTagOpen (
|
||||
//
|
||||
// Consume tag name.
|
||||
//
|
||||
return XmlParseTagEnd (Parser, SelfClosing);
|
||||
return XmlParseTagEnd (Parser, SelfClosing, Attributes);
|
||||
}
|
||||
|
||||
//
|
||||
@ -589,7 +608,7 @@ XmlParseTagClose (
|
||||
//
|
||||
// Consume tag name.
|
||||
//
|
||||
return XmlParseTagEnd(Parser, NULL);
|
||||
return XmlParseTagEnd(Parser, NULL, NULL);
|
||||
}
|
||||
|
||||
//
|
||||
@ -721,6 +740,11 @@ XmlNodeExportRecursive (
|
||||
XmlBufferAppend (Buffer, AllocSize, CurrentSize, "<", L_STR_LEN ("<"));
|
||||
XmlBufferAppend (Buffer, AllocSize, CurrentSize, Node->Name, NameLength);
|
||||
|
||||
if (Node->Attributes != NULL) {
|
||||
XmlBufferAppend (Buffer, AllocSize, CurrentSize, " ", L_STR_LEN (" "));
|
||||
XmlBufferAppend (Buffer, AllocSize, CurrentSize, Node->Attributes, AsciiStrLen (Node->Attributes));
|
||||
}
|
||||
|
||||
if (Node->Children != NULL || Node->Content != NULL) {
|
||||
XmlBufferAppend (Buffer, AllocSize, CurrentSize, ">", L_STR_LEN (">"));
|
||||
|
||||
@ -763,17 +787,22 @@ XmlParseNode (
|
||||
{
|
||||
CONST CHAR8 *TagOpen;
|
||||
CONST CHAR8 *TagClose;
|
||||
CONST CHAR8 *Attributes;
|
||||
XML_NODE *Node;
|
||||
XML_NODE *Child;
|
||||
BOOLEAN SelfClosing = FALSE;
|
||||
BOOLEAN Unprefixed = FALSE;
|
||||
BOOLEAN SelfClosing;
|
||||
BOOLEAN Unprefixed;
|
||||
|
||||
XML_PARSER_INFO (Parser, "node");
|
||||
|
||||
Attributes = NULL;
|
||||
SelfClosing = FALSE;
|
||||
Unprefixed = FALSE;
|
||||
|
||||
//
|
||||
// Parse open tag.
|
||||
//
|
||||
TagOpen = XmlParseTagOpen (Parser, &SelfClosing);
|
||||
TagOpen = XmlParseTagOpen (Parser, &SelfClosing, &Attributes);
|
||||
if (TagOpen == NULL) {
|
||||
if ('/' != XmlParserPeek (Parser, CURRENT_CHARACTER)) {
|
||||
XML_PARSER_ERROR (Parser, NO_CHARACTER, "XmlParseNode::tag_open");
|
||||
@ -783,7 +812,7 @@ XmlParseNode (
|
||||
|
||||
XmlSkipWhitespace (Parser);
|
||||
|
||||
Node = XmlNodeCreate (TagOpen, NULL, NULL);
|
||||
Node = XmlNodeCreate (TagOpen, Attributes, NULL, NULL);
|
||||
if (Node == NULL) {
|
||||
XML_PARSER_ERROR (Parser, NO_CHARACTER, "XmlParseNode::node alloc fail");
|
||||
return NULL;
|
||||
|
||||
@ -31,6 +31,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
#include <Library/OcStringLib.h>
|
||||
#include <Library/OcVirtualFsLib.h>
|
||||
#include <Library/OcAppleKernelLib.h>
|
||||
#include <Library/OcMachoLib.h>
|
||||
#include <Library/OcXmlLib.h>
|
||||
|
||||
#include <Protocol/AppleBootPolicy.h>
|
||||
#include <Protocol/DevicePathPropertyDatabase.h>
|
||||
@ -46,6 +48,64 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
#include <Protocol/SimpleTextInEx.h>
|
||||
#include <Protocol/SimpleFileSystem.h>
|
||||
|
||||
STATIC
|
||||
INT32
|
||||
CheckPrelinked (
|
||||
IN OUT UINT8 *Kernel,
|
||||
IN UINT32 KernelSize
|
||||
)
|
||||
{
|
||||
OC_MACHO_CONTEXT Context;
|
||||
MACH_HEADER_64 *Hdr;
|
||||
MACH_SEGMENT_COMMAND_64 *InfoSegment;
|
||||
MACH_SECTION_64 *InfoSection;
|
||||
XML_DOCUMENT *InfoDocument;
|
||||
CHAR8 *NewInfo;
|
||||
UINT32 NewInfoSize;
|
||||
|
||||
if (!MachoInitializeContext (&Context, Kernel, KernelSize)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
Hdr = MachoGetMachHeader64 (&Context);
|
||||
if (Hdr == NULL) {
|
||||
return -2;
|
||||
}
|
||||
|
||||
InfoSegment = MachoGetSegmentByName64(&Context, "__PRELINK_INFO");
|
||||
if (InfoSegment == NULL) {
|
||||
return -3;
|
||||
}
|
||||
|
||||
InfoSection = MachoGetSectionByName64 (&Context, InfoSegment, "__info");
|
||||
if (InfoSection == NULL) {
|
||||
return -4;
|
||||
}
|
||||
|
||||
InfoDocument = XmlDocumentParse ((CHAR8 *) &Kernel[InfoSection->Offset], InfoSection->Size);
|
||||
if (InfoDocument == NULL) {
|
||||
return -5;
|
||||
}
|
||||
|
||||
NewInfo = XmlDocumentExport(InfoDocument, &NewInfoSize);
|
||||
|
||||
XmlDocumentFree (InfoDocument);
|
||||
|
||||
if (NewInfo == NULL) {
|
||||
return -6;
|
||||
}
|
||||
|
||||
if (InfoSection->Size < NewInfoSize) {
|
||||
FreePool (NewInfo);
|
||||
return -7;
|
||||
}
|
||||
|
||||
CopyMem (&Kernel[InfoSection->Offset], NewInfo, NewInfoSize);
|
||||
ZeroMem (&Kernel[InfoSection->Offset + NewInfoSize], InfoSection->Size - NewInfoSize);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
STATIC
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
@ -63,6 +123,7 @@ TestFileOpen (
|
||||
UINT32 AllocatedSize;
|
||||
CHAR16 *FileNameCopy;
|
||||
EFI_FILE_PROTOCOL *VirtualFileHandle;
|
||||
INT32 PrelinkedCode;
|
||||
|
||||
Status = This->Open (This, NewHandle, FileName, OpenMode, Attributes);
|
||||
|
||||
@ -94,6 +155,10 @@ TestFileOpen (
|
||||
// TODO: patches, dropping, and injection here.
|
||||
//
|
||||
|
||||
PrelinkedCode = CheckPrelinked (Kernel, KernelSize);
|
||||
|
||||
DEBUG ((DEBUG_WARN, "Prelinked code is %u\n", PrelinkedCode));
|
||||
|
||||
ApplyPatch (
|
||||
(UINT8 *) "Darwin Kernel Version",
|
||||
NULL,
|
||||
|
||||
@ -52,7 +52,6 @@
|
||||
UefiLib
|
||||
PcdLib
|
||||
IoLib
|
||||
# PrintLib
|
||||
OcGuardLib
|
||||
DevicePathLib
|
||||
OcDevicePropertyLib
|
||||
@ -64,3 +63,5 @@
|
||||
OcAppleKernelLib
|
||||
OcCompressionLib
|
||||
OcVirtualFsLib
|
||||
OcXmlLib
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user