#ifdef __cplusplus extern "C" { #endif enum XMLDOC_THING_TYPE { XMLDOC_THING_ERROR, XMLDOC_THING_END_OF_STREAM, XMLDOC_THING_XMLDECL, XMLDOC_THING_ELEMENT, XMLDOC_THING_END_ELEMENT, XMLDOC_THING_PROCESSINGINSTRUCTION, XMLDOC_THING_ATTRIBUTE, XMLDOC_THING_HYPERSPACE, XMLDOC_THING_CDATA, }; typedef enum { XMLERROR_XMLDECL_NOT_FIRST_THING, XMLERROR_PI_TARGET_NOT_FOUND, XMLERROR_PI_EOF_BEFORE_CLOSE, XMLERROR_PI_CONTENT_ERROR, // There was a problem with the content of the processing instruction XMLERROR_ELEMENT_NS_PREFIX_MISSING_COLON, XMLERROR_ELEMENT_NAME_NOT_FOUND, // < binky="bleep"> or - element name not found XMLERROR_ATTRIBUTE_NAME_NOT_FOUND, // or - Attribute name part not found XMLERROR_ATTRIBUTE_NS_PREFIX_MISSING_COLON, // - Somehow we got into a state where we thought we had a namespace prefix, but it wasn't followed by a colon XMLERROR_XMLDECL_INVALID_FORMAT, // Something rotten in the XMLERROR_ENDELEMENT_NAME_NOT_FOUND, // Missing the name part of a tag. XMLERROR_ENDELEMENT_MALFORMED_NAME, // The name was malformed .. ns missing or something like that XMLERROR_ENDELEMENT_MALFORMED, // EOF before end of element found, or other problem XMLERROR_CDATA_MALFORMED, // CDATA not properly formed? } LOGICAL_XML_ERROR; typedef struct _XMLDOC_ELEMENT { // // Name of this element tag // XML_EXTENT Name; // // Namespace prefix // XML_EXTENT NsPrefix; // // How many attributes are there? // ULONG ulAttributeCount; // // Is this element empty? // BOOLEAN fElementEmpty; } XMLDOC_ELEMENT, *PXMLDOC_ELEMENT; typedef struct _XMLDOC_ERROR { // // The erroneous extent // XML_EXTENT BadExtent; // // What was the error? // LOGICAL_XML_ERROR Code; } XMLDOC_ERROR, *PXMLDOC_ERROR; typedef struct _XMLDOC_ATTRIBUTE { // // Name of this attribute // XML_EXTENT Name; // // Namespace prefix thereof // XML_EXTENT NsPrefix; // // The value of this attribute // XML_EXTENT Value; } XMLDOC_ATTRIBUTE, *PXMLDOC_ATTRIBUTE; typedef struct _XMLDOC_ENDELEMENT { // // End-element namespace prefix // XML_EXTENT NsPrefix; // // End-element tag name // XML_EXTENT Name; // // Original element pointer // XMLDOC_ELEMENT OpeningElement; } XMLDOC_ENDELEMENT, *PXMLDOC_ENDELEMENT; typedef struct _XMLDOC_XMLDECL { XML_EXTENT Encoding; XML_EXTENT Version; XML_EXTENT Standalone; } XMLDOC_XMLDECL, *PXMLDOC_XMLDECL; typedef struct _XMLDOC_PROCESSING { XML_EXTENT Target; XML_EXTENT Instruction; } XMLDOC_PROCESSING, *PXMLDOC_PROCESSING; typedef struct _XMLDOC_THING { // // What kind of thing is this? // enum XMLDOC_THING_TYPE ulThingType; // // How deep down the document is it? // ULONG ulDocumentDepth; // // Have the namespaces been fixed up yet? // BOOLEAN fNamespacesExpanded; // // The caller should be passing in a pointer to an attribute // list that they have initialized to contain XMLDOC_ATTRIBUTE // objects. // PRTL_GROWING_LIST AttributeList; // // The total extent of this thing in the document // XML_EXTENT TotalExtent; union { XMLDOC_ERROR Error; XMLDOC_ELEMENT Element; // // The tag // XMLDOC_ENDELEMENT EndElement; // // The pcdata that was found in this segment of the document // XML_EXTENT CDATA; // // The hyperspace found in this section of the document // XML_EXTENT Hyperspace; // // Information about the section of the document // XMLDOC_XMLDECL XmlDecl; // // A processing instruction has a target and an actual instruction // XMLDOC_PROCESSING ProcessingInstruction; }; } XMLDOC_THING, *PXMLDOC_THING; typedef NTSTATUS (*PFN_CALLBACK_PER_LOGICAL_XML)( struct _tagXML_LOGICAL_STATE* pLogicalState, PXMLDOC_THING pLogicalThing, PRTL_GROWING_LIST pAttributes, PVOID pvCallbackContext ); typedef struct _tagXML_LOGICAL_STATE{ // // The overall state of parsing // XML_TOKENIZATION_STATE ParseState; // // Have we found the first element yet? // BOOLEAN fFirstElementFound; // // When sifting through the document, this is the thing that we found // indicating the encoding. We should process and set the values in // ParseState before going too far, but for the moment we just hold // onto it. // XML_EXTENT EncodingMarker; // // Depth of the 'element stack' that we're building up. // ULONG ulElementStackDepth; // // Growing list that backs up the stack of elements. // RTL_GROWING_LIST ElementStack; // // Inline stuff to save some heap allocations. // XMLDOC_THING InlineElements[20]; } XML_LOGICAL_STATE, *PXML_LOGICAL_STATE; typedef struct _XML_ATTRIBUTE_DEFINITION { PCXML_SPECIAL_STRING Namespace; XML_SPECIAL_STRING Name; } XML_ATTRIBUTE_DEFINITION, *PXML_ATTRIBUTE_DEFINITION; typedef const XML_ATTRIBUTE_DEFINITION *PCXML_ATTRIBUTE_DEFINITION; NTSTATUS RtlXmlInitializeNextLogicalThing( PXML_LOGICAL_STATE pParseState, PVOID pvDataPointer, SIZE_T cbData, PRTL_ALLOCATOR Allocator ); // // This mini-tokenizer allows you to pick up the logical analysis // from any arbitrary point in another document (handy for when you // want to go back and re-read something, like in xmldsig...). If you // are cloning an active logical parse, then it's imperative that // you pass along the same namespace management object. // NTSTATUS RtlXmlInitializeNextLogicalThingEx( OUT PXML_LOGICAL_STATE pParseState, IN PXML_TOKENIZATION_STATE pBaseTokenizationState, IN PVOID pvDataPointer, IN SIZE_T cbData, PRTL_ALLOCATOR Allocator ); NTSTATUS RtlXmlNextLogicalThing( PXML_LOGICAL_STATE pParseState, PNS_MANAGER pNamespaceManager, PXMLDOC_THING pDocumentPiece, PRTL_GROWING_LIST pAttributeList ); NTSTATUS RtlXmlDestroyNextLogicalThing( PXML_LOGICAL_STATE pState ); NTSTATUS RtlXmlExtentToString( PXML_RAWTOKENIZATION_STATE pParseState, PXML_EXTENT pExtent, PUNICODE_STRING pString, PSIZE_T pchString ); NTSTATUS RtlXmlMatchLogicalElement( IN PXML_TOKENIZATION_STATE pState, IN PXMLDOC_ELEMENT pElement, IN PCXML_SPECIAL_STRING pNamespace, IN PCXML_SPECIAL_STRING pElementName, OUT PBOOLEAN pfMatches ); NTSTATUS RtlXmlFindAttributesInElement( IN PXML_TOKENIZATION_STATE pState, IN PRTL_GROWING_LIST pAttributeList, IN ULONG ulAttributeCountInElement, IN ULONG ulFindCount, IN PCXML_ATTRIBUTE_DEFINITION pAttributeNames, OUT PXMLDOC_ATTRIBUTE *ppAttributes, OUT PULONG pulUnmatchedAttributes ); NTSTATUS RtlXmlSkipElement( PXML_LOGICAL_STATE pState, PXMLDOC_ELEMENT TheElement ); NTSTATUS RtlXmlMatchAttribute( IN PXML_TOKENIZATION_STATE State, IN PXMLDOC_ATTRIBUTE Attribute, IN PCXML_SPECIAL_STRING Namespace, IN PCXML_SPECIAL_STRING AttributeName, OUT XML_STRING_COMPARE *CompareResult ); #ifdef __cplusplus }; #endif