#pragma once #ifdef __cplusplus extern "C" { #endif typedef enum { eManifestState_DocumentRoot = 0, eManifestState_assembly, eManifestState_assembly_assemblyIdentity, eManifestState_assembly_description, eManifestState_assembly_dependency, eManifestState_assembly_file, eManifestState_assembly_noInherit, eManifestState_assembly_noInheritable, eManifestState_assembly_comInterfaceExternalProxyStub, eManifestState_assembly_dependency_dependentAssembly, eManifestState_assembly_dependency_dependentAssembly_assemblyIdentity, eManifestState_assembly_dependency_dependentAssembly_bindingRedirect, eManifestState_assembly_file_windowClass, eManifestState_assembly_file_comClass, eManifestState_assembly_file_typelib, eManifestState_assembly_file_comInterfaceProxyStub, eManifestState_assembly_file_comClass_progId, // // All this defines the structure of an XMLDSIG block // for validationd // eManifestState_Signature, eManifestState_Signature_SignatureValue, eManifestState_Signature_SignedInfo, eManifestState_Signature_SignedInfo_CanonicalizationMethod, eManifestState_Signature_SignedInfo_SignatureMethod, eManifestState_Signature_SignedInfo_Reference, eManifestState_Signature_SignedInfo_Reference_Transforms, eManifestState_Signature_SignedInfo_Reference_DigestMethod, eManifestState_Signature_SignedInfo_Reference_DigestValue, eManifestState_Signature_KeyInfo, eManifestState_Signature_KeyInfo_KeyName, eManifestState_Signature_KeyInfo_KeyValue, eManifestState_Signature_KeyInfo_KeyValue_DSAKeyValue, eManifestState_Signature_KeyInfo_KeyValue_DSAKeyValue_P, eManifestState_Signature_KeyInfo_KeyValue_DSAKeyValue_Q, eManifestState_Signature_KeyInfo_KeyValue_DSAKeyValue_G, eManifestState_Signature_KeyInfo_KeyValue_DSAKeyValue_Y, eManifestState_Signature_KeyInfo_KeyValue_DSAKeyValue_J, eManifestState_Signature_KeyInfo_KeyValue_DSAKeyValue_Seed, eManifestState_Signature_KeyInfo_KeyValue_DSAKeyValue_PgenCounter, eManifestState_Signature_KeyInfo_KeyValue_RSAKeyValue, eManifestState_Signature_KeyInfo_KeyValue_RSAKeyValue_Modulus, eManifestState_Signature_KeyInfo_KeyValue_RSAKeyValue_Exponent, eManifestState_Signature_Object, eManifestState_State_Count } MANIFEST_PARSE_STATE; typedef struct _tagASSEMBLY_MEMBER_FILE_RAW { XML_EXTENT FileName; XML_EXTENT HashAlg; XML_EXTENT HashValue; XML_EXTENT LoadFrom; XML_EXTENT DigestMethod; XML_EXTENT Size; } ASSEMBLY_MEMBER_FILE_RAW, *PASSEMBLY_MEMBER_FILE_RAW; typedef struct _tagCOMINTERFACE_REDIRECTION_RAW { ULONG ulFileTag; XML_EXTENT Iid; XML_EXTENT Name; XML_EXTENT TlbId; XML_EXTENT MethodCount; XML_EXTENT ProxyStubClsid32; XML_EXTENT BaseInterface; } COMINTERFACE_REDIRECTION_RAW, *PCOMINTERFACE_REDIRECTION_RAW; typedef struct _tagCOMCLASS_REDIRECTION_RAW { ULONG ulFileTag; XML_EXTENT Description; XML_EXTENT clsid; XML_EXTENT tlbident; XML_EXTENT ThreadModel; XML_EXTENT DefaultProgid; } COMCLASS_REDIRECTION_RAW, *PCOMCLASS_REDIRECTION_RAW; typedef struct _tagCOMCLASS_PROGID_RAW { ULONG ulComClass; XML_EXTENT ProgId; } COMCLASS_PROGID_RAW, *PCOMCLASS_PROGID_RAW; typedef struct _tagWINDOWCLASS_REDIRECT_RAW { ULONG ulFileTag; XML_EXTENT WindowClass; XML_EXTENT Versioned; } WINDOWCLASS_REDIRECTION_RAW, *PWINDOWCLASS_REDIRECTION_RAW; typedef struct _tagTYPELIB_REDIRECT_RAW { ULONG ulFileTag; XML_EXTENT tlbident; XML_EXTENT Version; XML_EXTENT HelpDirectory; XML_EXTENT ResourceIdent; XML_EXTENT Flags; } TYPELIB_REDIRECT_RAW, *PTYPELIB_REDIRECT_RAW; typedef struct _tagASSEMBLY_IDENTITY_ATTRIBUTE_RAW { ULONG ulIdentityIndex; XML_EXTENT Namespace; XML_EXTENT Attribute; XML_EXTENT Value; } ASSEMBLY_IDENTITY_ATTRIBUTE_RAW, *PASSEMBLY_IDENTITY_ATTRIBUTE_RAW; #define MANIFEST_CONTENT_SELF_ALLOCATED (0x80000000) #define INVALID_ASSEMBLY_IDENTITY_INDEX ((ULONG)-1) typedef struct _tagRTL_MANIFEST_CONTENT_RAW { ULONG ulFlags; ULONG ulFileMembers; ULONG ulWindowClasses; ULONG ulComClasses; ULONG ulTypeLibraries; ULONG ulInterfaceProxyStubs; ULONG ulExternalInterfaceProxyStubs; ULONG ulDocumentSignatures; // How many assembly identity attributes did we find? ULONG ulAssemblyIdentityAttributes; // How many assembly identities is that total? ULONG ulAssemblyIdentitiesFound; // And which one is the 'root' identity element? (-1 if not present) ULONG ulRootIdentityIndex; RTL_GROWING_LIST FileMembers; RTL_GROWING_LIST AssemblyIdentityAttributes; PRTL_GROWING_LIST pWindowClasses; PRTL_GROWING_LIST pComClasses; PRTL_GROWING_LIST pTypeLibraries; PRTL_GROWING_LIST pInterfaceProxyStubs; PRTL_GROWING_LIST pExternalInterfaceProxyStubs; PRTL_GROWING_LIST pManifestSignatures; PRTL_GROWING_LIST pProgIds; } RTL_MANIFEST_CONTENT_RAW, *PRTL_MANIFEST_CONTENT_RAW; NTSTATUS RtlInspectManifestStream( ULONG ulFlags, PVOID pvManifest, SIZE_T cbManifest, PRTL_MANIFEST_CONTENT_RAW pContent, PXML_TOKENIZATION_STATE pTargetTokenState ); EXTERN_C const XML_SPECIAL_STRING sc_ss_xmldecl_version_10; EXTERN_C const XML_SPECIAL_STRING sc_ss_xmldecl_yes; EXTERN_C const XML_SPECIAL_STRING sc_ss_xmlnamespace_default; NTSTATUS RtlSxsInitializeManifestRawContent( ULONG ulRequestedContent, PRTL_MANIFEST_CONTENT_RAW *pRawContentOut, PVOID pvOriginalBuffer, SIZE_T cbOriginalBuffer ); NTSTATUS RtlSxsDestroyManifestContent( PRTL_MANIFEST_CONTENT_RAW pRawContent ); // // This section gives definitions for how to describe an XML document to // be processed in a nicely generic way. Currently the only client of these definitions // is the manifest inspector itself, but one can imagine using these to create // recognizers for various xml document formats. // typedef NTSTATUS (*pfnRtlXmlValidateAttributeValue)( ULONG ulFlags, PXML_TOKENIZATION_STATE LogicalState, PRTL_MANIFEST_CONTENT_RAW RawContentBlob, const struct _XML_ELEMENT_DEFINITION* ParentElement, const struct _XML_VALID_ELEMENT_ATTRIBUTE* CurrentAttribDef, BOOLEAN *IsValid ); #define XML_ATTRIBUTE_FLAG_REQUIRED (0x00000001) typedef struct _XML_VALID_ELEMENT_ATTRIBUTE { ULONG ulFlags; XML_ATTRIBUTE_DEFINITION Attribute; pfnRtlXmlValidateAttributeValue pfnValidator; } XML_VALID_ELEMENT_ATTRIBUTE, *PXML_VALID_ELEMENT_ATTRIBUTE; typedef const XML_VALID_ELEMENT_ATTRIBUTE *PCXML_VALID_ELEMENT_ATTRIBUTE; // This element must not contain non-whitespace PCData #define XML_ELEMENT_FLAG_NO_PCDATA (0x00000001) // This element must not contain children of any sort #define XML_ELEMENT_FLAG_NO_ELEMENTS (0x00000002) // Allow arbitrary attributes on this element, not just those defined #define XML_ELEMENT_FLAG_ALLOW_ANY_ATTRIBUTES (0x00000004) // Allow arbitrary children of this element, not just those defined // (Child elements will not be sent to the notification function) #define XML_ELEMENT_FLAG_ALLOW_ANY_CHILDREN (0x00000008) typedef enum { eElementNotify_Open, eElementNotify_Close, eElementNotify_Hyperspace } MANIFEST_ELEMENT_CALLBACK_REASON; typedef NTSTATUS (*pfnManifestElementCallback)( PXML_LOGICAL_STATE pLogicalState, PRTL_MANIFEST_CONTENT_RAW pManifestContent, PXMLDOC_THING pElement, PRTL_GROWING_LIST pAttributes, MANIFEST_ELEMENT_CALLBACK_REASON Reason, const struct _XML_ELEMENT_DEFINITION *pElementDefinition ); #pragma warning(disable:4200) typedef struct _XML_ELEMENT_DEFINITION { ULONG ulFlags; ULONG StateIdentifier; const struct _XML_ELEMENT_DEFINITION *ParentElement; // The name of this element (not path, just name) PCXML_SPECIAL_STRING Namespace; const XML_SPECIAL_STRING Name; // // Who should be notified? // pfnManifestElementCallback pfnWorkerCallback; // // The children of this element, terminated with a NULL pointer. // const struct _XML_ELEMENT_DEFINITION **ChildElements; // // Potential attributes of this element // ULONG AttributeCount; const XML_VALID_ELEMENT_ATTRIBUTE AttributeList[]; } XML_ELEMENT_DEFINITION, *PXML_ELEMENT_DEFINITION; typedef const XML_ELEMENT_DEFINITION *PCXML_ELEMENT_DEFINITION; #define ELEMENT_DEFINITION_NS(parentpath, thisname, ns, validator, flags) \ extern PCXML_ELEMENT_DEFINITION rgs_Element_##parentpath##_##thisname##_Children[]; \ XML_ELEMENT_DEFINITION rgs_Element_##parentpath##_##thisname = { \ (flags), \ eManifestState_##parentpath##_##thisname, \ &rgs_Element_##parentpath, \ &ns, \ MAKE_SPECIAL_STRING(#thisname), \ (validator), \ rgs_Element_##parentpath##_##thisname##_Children, \ eAttribs_##parentpath##_##thisname##_Count, \ { #define ELEMENT_DEFINITION_DEFNS(parentpath, thisname, validator, flags) ELEMENT_DEFINITION_NS(parentpath, thisname, sc_ss_xmlnamespace_default, validator, flags) #define ELEMENT_DEFINITION_DEFNS_END() } }; #define ELEMENT_DEFINITION_DEFNS_NOCB(p, t) ELEMENT_DEFINITION_DEFNS(p, t, Rtl_Default_Validator) #define ATTRIBUTE_DEFINITION_NONS_NODEFAULT(attribname) { XML_ATTRIBUTE_FLAG_REQUIRED, { NULL, MAKE_SPECIAL_STRING(#attribname) } } #define ATTRIBUTE_DEFINITION_NONS_NODEFAULT_OPTIONAL(attribname) { 0, { NULL, MAKE_SPECIAL_STRING(#attribname) } } #define NO_CHILD_ELEMENTS() #define ELEMENT_DEFINITION_CHILD_ELEMENTS(parentpath, thisname) PCXML_ELEMENT_DEFINITION rgs_Element_##parentpath##_##thisname##_Children[] = { #define ELEMENT_CHILD(path, child) (&rgs_Element_##path##_##child) #define ELEMENT_DEFINITION_CHILD_ELEMENTS_END() NULL }; #define ELEMENT_NAMED(path) (&rgs_Element_##path) #define DECLARE_ELEMENT(path) \ extern PCXML_ELEMENT_DEFINITION rgs_Element_##path##_Children[]; \ extern XML_ELEMENT_DEFINITION rgs_Element_##path NTSTATUS RtlConvertRawToCookedContent( PRTL_MANIFEST_CONTENT_RAW pRawContent, PXML_RAWTOKENIZATION_STATE pState, PVOID pvOriginalRegion, SIZE_T cbRegionSize, PSIZE_T pcbRequired ); NTSTATUS RtlValidateAttributesAndOrganize( PXML_TOKENIZATION_STATE State, PXMLDOC_ELEMENT Element, PRTL_GROWING_LIST Attributes, PCXML_ELEMENT_DEFINITION ThisElement, PXMLDOC_ATTRIBUTE *OrderedList ); #ifdef __cplusplus }; #endif