222 lines
6.7 KiB
C++
222 lines
6.7 KiB
C++
|
#include "nt.h"
|
||
|
#include "ntrtl.h"
|
||
|
#include "nturtl.h"
|
||
|
#include "windows.h"
|
||
|
#include <sxsapi.h>
|
||
|
#include "fusionxml.h"
|
||
|
#include "debmacro.h"
|
||
|
#include "fusionbuffer.h"
|
||
|
#include "util.h"
|
||
|
|
||
|
void
|
||
|
SxspCopyXmlStringToBuffer(
|
||
|
PCSXS_XML_DOCUMENT Document,
|
||
|
ULONG String,
|
||
|
CBaseStringBuffer *Buffer
|
||
|
)
|
||
|
{
|
||
|
if (String != 0)
|
||
|
{
|
||
|
if (String < Document->StringCount)
|
||
|
{
|
||
|
Buffer->Win32Assign(L"\"", 1);
|
||
|
Buffer->Win32Append(Document->Strings[String].Buffer, Document->Strings[String].Length / sizeof(WCHAR));
|
||
|
Buffer->Win32Append(L"\"", 1);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
Buffer->Win32Assign(L"invalid index", 13);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
Buffer->Win32Assign(L"none", 4);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void
|
||
|
SxspDumpXmlAttributes(
|
||
|
PCWSTR PerLinePrefix,
|
||
|
PCSXS_XML_DOCUMENT Document,
|
||
|
ULONG AttributeCount,
|
||
|
PCSXS_XML_ATTRIBUTE Attributes
|
||
|
);
|
||
|
|
||
|
void
|
||
|
SxspDumpXmlSubTree(
|
||
|
PCWSTR PerLinePrefix,
|
||
|
PCSXS_XML_DOCUMENT Document,
|
||
|
PCSXS_XML_NODE Node
|
||
|
)
|
||
|
{
|
||
|
if (Node == NULL)
|
||
|
{
|
||
|
FusionpDbgPrintEx(FUSION_DBG_LEVEL_XMLTREE, "%lsSXS_XML_NODE (NULL)\n");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
CSmallStringBuffer buffFlags;
|
||
|
CStringBuffer buffType;
|
||
|
const SIZE_T cchPLP = (PerLinePrefix != NULL) ? wcslen(PerLinePrefix) : 0;
|
||
|
|
||
|
#if 0
|
||
|
static const FUSION_FLAG_FORMAT_MAP_ENTRY s_rgXmlNodeFlags[] =
|
||
|
{
|
||
|
};
|
||
|
|
||
|
::FusionpFormatFlags(Node->Flags, true, NUMBER_OF(s_rgXmlNodeFlags), s_rgXmlNodeFlags, &buffFlags);
|
||
|
#endif
|
||
|
|
||
|
#define TYPE_ENTRY(x) case x: buffType.Win32Assign(L ## #x, NUMBER_OF( #x ) - 1); break;
|
||
|
|
||
|
switch (Node->Type)
|
||
|
{
|
||
|
default: buffType.Win32Assign(L"unknown", 7); break;
|
||
|
TYPE_ENTRY(SXS_XML_NODE_TYPE_XML_DECL)
|
||
|
TYPE_ENTRY(SXS_XML_NODE_TYPE_ELEMENT)
|
||
|
TYPE_ENTRY(SXS_XML_NODE_TYPE_PCDATA)
|
||
|
TYPE_ENTRY(SXS_XML_NODE_TYPE_CDATA)
|
||
|
}
|
||
|
#undef TYPE_ENTRY
|
||
|
|
||
|
FusionpDbgPrintEx(
|
||
|
FUSION_DBG_LEVEL_XMLTREE,
|
||
|
"%lsSXS_XML_NODE (%p) (Flags, Type, Parent) = (%08lx : %ls, %ls , %p)\n",
|
||
|
PerLinePrefix, Node, Node->Flags, static_cast<PCWSTR>(buffFlags), static_cast<PCWSTR>(buffType), Node->Parent);
|
||
|
|
||
|
switch (Node->Type)
|
||
|
{
|
||
|
default:
|
||
|
break;
|
||
|
|
||
|
case SXS_XML_NODE_TYPE_XML_DECL:
|
||
|
if (Node->XMLDecl.AttributeCount == 0)
|
||
|
{
|
||
|
FusionpDbgPrintEx(
|
||
|
FUSION_DBG_LEVEL_XMLTREE,
|
||
|
"%ls XMLDecl.AttributeCount: %lu\n",
|
||
|
PerLinePrefix, Node->XMLDecl.AttributeCount);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
CStringBuffer buffNewPLP;
|
||
|
|
||
|
buffNewPLP.Win32Assign(PerLinePrefix, cchPLP);
|
||
|
buffNewPLP.Win32Append(L" ", 3);
|
||
|
|
||
|
SxspDumpXmlAttributes(buffNewPLP, Document, Node->XMLDecl.AttributeCount, Node->XMLDecl.Attributes);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case SXS_XML_NODE_TYPE_ELEMENT:
|
||
|
{
|
||
|
CStringBuffer buffNewPLP;
|
||
|
CStringBuffer buffNS, buffN;
|
||
|
LIST_ENTRY *ple = NULL;
|
||
|
|
||
|
buffNewPLP.Win32Assign(PerLinePrefix, cchPLP);
|
||
|
buffNewPLP.Win32Append(L" ", 3);
|
||
|
|
||
|
SxspCopyXmlStringToBuffer(Document, Node->Element.NamespaceString, &buffNS);
|
||
|
SxspCopyXmlStringToBuffer(Document, Node->Element.NameString, &buffN);
|
||
|
|
||
|
FusionpDbgPrintEx(
|
||
|
FUSION_DBG_LEVEL_XMLTREE,
|
||
|
"%ls Element (.Namespace, .Name): ( %ls , %ls )\n",
|
||
|
PerLinePrefix, static_cast<PCWSTR>(buffNS), static_cast<PCWSTR>(buffN));
|
||
|
|
||
|
if (Node->Element.AttributeCount != 0)
|
||
|
SxspDumpXmlAttributes(buffNewPLP, Document, Node->Element.AttributeCount, Node->Element.Attributes);
|
||
|
|
||
|
ple = Node->Element.ChildListHead.Flink;
|
||
|
|
||
|
while (ple != &Node->Element.ChildListHead)
|
||
|
{
|
||
|
SxspDumpXmlSubTree(buffNewPLP, Document, reinterpret_cast<PSXS_XML_NODE>(CONTAINING_RECORD(ple, SXS_XML_NODE, SiblingLink)));
|
||
|
ple = ple->Flink;
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
case SXS_XML_NODE_TYPE_PCDATA:
|
||
|
{
|
||
|
CStringBuffer buff;
|
||
|
|
||
|
SxspCopyXmlStringToBuffer(Document, Node->PCDataString, &buff);
|
||
|
|
||
|
FusionpDbgPrintEx(
|
||
|
FUSION_DBG_LEVEL_XMLTREE,
|
||
|
"%ls PCDataString: %lu (%ls)\n",
|
||
|
PerLinePrefix, Node->PCDataString, static_cast<PCWSTR>(buff));
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
case SXS_XML_NODE_TYPE_CDATA:
|
||
|
{
|
||
|
CStringBuffer buff;
|
||
|
|
||
|
SxspCopyXmlStringToBuffer(Document, Node->CDataString, &buff);
|
||
|
|
||
|
FusionpDbgPrintEx(
|
||
|
FUSION_DBG_LEVEL_XMLTREE,
|
||
|
"%ls CDataString: %lu (%ls)\n",
|
||
|
PerLinePrefix, Node->CDataString, static_cast<PCWSTR>(buff));
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void
|
||
|
SxspDumpXmlTree(
|
||
|
ULONG Flags,
|
||
|
PCSXS_XML_DOCUMENT Document
|
||
|
)
|
||
|
{
|
||
|
LIST_ENTRY *ple = Document->ElementListHead.Flink;
|
||
|
|
||
|
while (ple != &Document->ElementListHead)
|
||
|
{
|
||
|
SxspDumpXmlSubTree(L"", Document, CONTAINING_RECORD(ple, SXS_XML_NODE, SiblingLink));
|
||
|
ple = ple->Flink;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void
|
||
|
SxspDumpXmlAttributes(
|
||
|
PCWSTR PerLinePrefix,
|
||
|
PCSXS_XML_DOCUMENT Document,
|
||
|
ULONG AttributeCount,
|
||
|
PCSXS_XML_ATTRIBUTE Attributes
|
||
|
)
|
||
|
{
|
||
|
ULONG i;
|
||
|
CStringBuffer buffNS, buffN, buffV;
|
||
|
|
||
|
for (i=0; i<AttributeCount; i++)
|
||
|
{
|
||
|
SxspCopyXmlStringToBuffer(Document, Attributes[i].NamespaceString, &buffNS);
|
||
|
SxspCopyXmlStringToBuffer(Document, Attributes[i].NameString, &buffN);
|
||
|
SxspCopyXmlStringToBuffer(Document, Attributes[i].ValueString, &buffV);
|
||
|
|
||
|
FusionpDbgPrintEx(
|
||
|
FUSION_DBG_LEVEL_XMLTREE,
|
||
|
"%lsSXS_XML_ATTRIBUTE %lu of %lu (at %p): Flags: %08lx; (NS, N, V) = (%ls , %ls , %ls)\n",
|
||
|
PerLinePrefix, i + 1, AttributeCount, &Attributes[i], Attributes[i].Flags, static_cast<PCWSTR>(buffNS), static_cast<PCWSTR>(buffN), static_cast<PCWSTR>(buffV));
|
||
|
#if 0
|
||
|
"%ls Flags: %08lx\n"
|
||
|
"%ls NamespaceString: %lu (%ls)\n"
|
||
|
"%ls NameString: %lu (%ls)\n"
|
||
|
"%ls ValueString: %lu (%ls)\n",
|
||
|
PerLinePrefix, i + 1, AttributeCount, &Attributes[i],
|
||
|
PerLinePrefix, Attributes[i].Flags,
|
||
|
PerLinePrefix, Attributes[i].NamespaceString, static_cast<PCWSTR>(buffNS),
|
||
|
PerLinePrefix, Attributes[i].NameString, static_cast<PCWSTR>(buffN),
|
||
|
PerLinePrefix, Attributes[i].ValueString, static_cast<PCWSTR>(buffV));
|
||
|
#endif
|
||
|
}
|
||
|
}
|