Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

221 lines
6.7 KiB

#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
}
}