#include "nt.h" #include "ntrtl.h" #include "nturtl.h" #include "windows.h" #include #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(buffFlags), static_cast(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(buffNS), static_cast(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(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(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(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(buffNS), static_cast(buffN), static_cast(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(buffNS), PerLinePrefix, Attributes[i].NameString, static_cast(buffN), PerLinePrefix, Attributes[i].ValueString, static_cast(buffV)); #endif } }