windows-nt/Source/XPSP1/NT/base/win32/fusion/sxs/nodefactory.h
2020-09-26 16:20:57 +08:00

279 lines
12 KiB
C++

#if !defined(_FUSION_SXS_NODEFACTORY_H_INCLUDED_)
#define _FUSION_SXS_NODEFACTORY_H_INCLUDED_
#pragma once
#include "FusionEventLog.h"
#include <windows.h>
#include <sxsp.h>
#include <ole2.h>
#include <xmlparser.h>
#include "fusionbuffer.h"
#include "partialassemblyversion.h"
#include "xmlns.h"
#include "stringpool.h"
#include "policystatement.h"
#define ELEMENT_LEGAL_ATTRIBUTE_FLAG_IGNORE (0x00000001)
#define ELEMENT_LEGAL_ATTRIBUTE_FLAG_REQUIRED (0x00000002)
typedef struct _ELEMENT_LEGAL_ATTRIBUTE
{
DWORD m_dwFlags;
PCATTRIBUTE_NAME_DESCRIPTOR m_pName;
SXSP_GET_ATTRIBUTE_VALUE_VALIDATION_ROUTINE m_pfnValidator;
DWORD m_dwValidatorFlags;
} ELEMENT_LEGAL_ATTRIBUTE, PELEMENT_LEGAL_ATTRIBUTE;
typedef const struct _ELEMENT_LEGAL_ATTRIBUTE *PCELEMENT_LEGAL_ATTRIBUTE;
class __declspec(uuid("832ff3cf-05bd-4eda-962f-d0a5307d55ae"))
CNodeFactory : public IXMLNodeFactory
{
public:
CNodeFactory();
~CNodeFactory();
BOOL Initialize(
PACTCTXGENCTX ActCtxGenCtx,
PASSEMBLY Assembly,
PACTCTXCTB_ASSEMBLY_CONTEXT AssemblyContext
);
BOOL SetParseType(ULONG ParseType, ULONG PathType, const CBaseStringBuffer &buffFileName, const FILETIME &rftLastWriteTime);
VOID ResetParseState();
// IUnknown methods:
STDMETHODIMP_(ULONG) AddRef() { return 1; }
STDMETHODIMP_(ULONG) Release() { return 1; }
STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppvObj);
// IXMLNodeFactory methods:
STDMETHODIMP NotifyEvent(IXMLNodeSource *pSource, XML_NODEFACTORY_EVENT iEvt);
STDMETHODIMP BeginChildren(IXMLNodeSource *pSource, XML_NODE_INFO *pNodeInfo);
STDMETHODIMP EndChildren(IXMLNodeSource *pSource, BOOL fEmpty, XML_NODE_INFO *pNodeInfo);
STDMETHODIMP Error(IXMLNodeSource *pSource, HRESULT hrErrorCode, USHORT cNumRecs, XML_NODE_INFO **apNodeInfo);
STDMETHODIMP CreateNode(IXMLNodeSource *pSource, PVOID pNodeParent, USHORT cNumRecs, XML_NODE_INFO **apNodeInfo);
HRESULT FirstCreateNodeCall(IXMLNodeSource *pSource, PVOID pNodeParent, USHORT NodeCount, const SXS_NODE_INFO *prgNodeInfo);
enum
{
eValidateIdentity_VersionRequired = 0x00000001,
eValidateIdentity_PoliciesNotAllowed = 0x00000002,
eValidateIdentity_VersionNotAllowed = 0x00000008,
};
enum
{
eActualParseType_Undetermined,
eActualParseType_Manifest,
eActualParseType_PolicyManifest
} m_IntuitedParseType;
BOOL ValidateIdentity(DWORD Flags, ULONG Type, PCASSEMBLY_IDENTITY AssemblyIdentity);
BOOL ValidateElementAttributes(PCSXS_NODE_INFO prgNodes, SIZE_T cNodes, PCELEMENT_LEGAL_ATTRIBUTE prgAttributes, UCHAR cAttributes);
PCACTCTXCTB_PARSE_CONTEXT GetParseContext() const { return &m_ParseContext; }
#if FUSION_XML_TREE
HRESULT CreateXmlNode(PSXS_XML_NODE pParent, ULONG cNodes, XML_NODE_INFO **prgpNodes, PSXS_XML_NODE &rpNewNode);
#endif // FUSION_XML_TREE
// protected:
PACTCTXGENCTX m_ActCtxGenCtx;
PASSEMBLY m_Assembly;
CXMLNamespaceManager m_XMLNamespaceManager;
ULONG m_ParseType;
bool m_fFirstCreateNodeCall;
// We only track the state of the parse with respect to the tags that
// we're interested in for metadata purposes. This amounts to just the
// <ASSEMBLY> tag, and the dependencies. We ignore the rest.
enum XMLParseState
{
eNotParsing,
eParsing_doc,
eParsing_doc_assembly,
eParsing_doc_assembly_assemblyIdentity,
eParsing_doc_assembly_comInterfaceExternalProxyStub,
eParsing_doc_assembly_description,
eParsing_doc_assembly_dependency,
eParsing_doc_assembly_dependency_dependentAssembly,
eParsing_doc_assembly_dependency_dependentAssembly_assemblyIdentity,
eParsing_doc_assembly_dependency_dependentAssembly_bindingRedirect,
eParsing_doc_assembly_file,
eParsing_doc_assembly_file_comClass,
eParsing_doc_assembly_file_comClass_progid,
eParsing_doc_assembly_file_comInterfaceProxyStub,
eParsing_doc_assembly_file_typelib,
eParsing_doc_assembly_file_windowClass,
eParsing_doc_assembly_clrSurrogate,
eParsing_doc_assembly_clrClass,
eParsing_doc_assembly_clrClass_progid,
eParsing_doc_assembly_noInherit,
eParsing_doc_assembly_noInheritable,
eParsing_doc_configuration,
eParsing_doc_configuration_windows,
eParsing_doc_configuration_windows_assemblyBinding,
eParsing_doc_configuration_windows_assemblyBinding_assemblyIdentity,
eParsing_doc_configuration_windows_assemblyBinding_dependentAssembly,
eParsing_doc_configuration_windows_assemblyBinding_dependentAssembly_assemblyIdentity,
eParsing_doc_configuration_windows_assemblyBinding_dependentAssembly_bindingRedirect,
eFatalParseError,
} m_xpsParseState;
ULONG m_cUnknownChildDepth;
PACTCTXCTB_ASSEMBLY_CONTEXT m_AssemblyContext;
ACTCTXCTB_PARSE_CONTEXT m_ParseContext;
CSmallStringBuffer m_buffElementPath;
CStringBuffer m_buffCurrentFileName;
PASSEMBLY_IDENTITY m_CurrentPolicyDependentAssemblyIdentity;
CPolicyStatement *m_CurrentPolicyStatement;
CCaseInsensitiveUnicodeStringPtrTable<CPolicyStatement> *m_pApplicationPolicyTable;
CStringBuffer m_buffCurrentApplicationPolicyIdentityKey;
bool m_fAssemblyFound;
bool m_fIdentityFound;
bool m_fIsDependencyOptional;
bool m_fDependencyChildHit;
bool m_fAssemblyIdentityChildOfDependenctAssemblyHit;
bool m_fIsMetadataSatellite;
bool m_fMetadataSatelliteAlreadyFound;
bool m_fNoInheritableFound;
HRESULT ConvertXMLNodeInfoToSXSNodeInfo(const XML_NODE_INFO *pNodeInfo, SXS_NODE_INFO & sxsNodeInfo);
#if FUSION_XML_TREE
CStringPool m_ParseTreeStringPool;
SXS_XML_DOCUMENT m_XmlDocument;
SXS_XML_NODE *m_CurrentNode;
SXS_XML_NODE *m_CurrentParent;
SXS_XML_STRING m_InlineStringArray[64];
SXS_XML_STRING *m_ActualStringArray;
#endif
//
// XML Parsing worker functions:
//
typedef BOOL (CNodeFactory::*XMLParserWorkerFunctionPtr)(USHORT cNumRecs, PCSXS_NODE_INFO prgNodeInfo);
BOOL XMLParser_Element_doc_assembly(USHORT cNumRecs, PCSXS_NODE_INFO prgNodeInfo);
BOOL XMLParser_Element_doc_assembly_noInherit(USHORT cNumRecs, PCSXS_NODE_INFO prgNodeInfo);
BOOL XMLParser_Element_doc_assembly_noInheritable(USHORT cNumRecs, PCSXS_NODE_INFO prgNodeInfo);
BOOL XMLParser_Element_doc_assembly_assemblyIdentity(USHORT cNumRecs, PCSXS_NODE_INFO prgNodeInfo);
BOOL XMLParser_Element_doc_assembly_dependency(USHORT cNumRecs, PCSXS_NODE_INFO prgNodeInfo);
BOOL XMLParser_Element_doc_assembly_dependency_dependentAssembly(USHORT cNumRecs, PCSXS_NODE_INFO prgNodeInfo);
BOOL XMLParser_Element_doc_assembly_dependency_dependentAssembly_assemblyIdentity(USHORT cNumRecs, PCSXS_NODE_INFO prgNodeInfo);
BOOL XMLParser_Element_doc_assembly_dependency_dependentAssembly_bindingRedirect(USHORT cNumRecs, PCSXS_NODE_INFO prgNodeInfo);
BOOL XMLParser_Element_doc_configuration(USHORT cNumRecs, PCSXS_NODE_INFO prgNodeInfo);
BOOL XMLParser_Element_doc_configuration_windows(USHORT cNumRecs, PCSXS_NODE_INFO prgNodeInfo);
BOOL XMLParser_Element_doc_configuration_windows_assemblyBinding(USHORT cNumRecs, PCSXS_NODE_INFO prgNodeInfo);
BOOL XMLParser_Element_doc_configuration_windows_assemblyBinding_assemblyIdentity(USHORT cNumRecs, PCSXS_NODE_INFO prgNodeInfo);
BOOL XMLParser_Element_doc_configuration_windows_assemblyBinding_dependentAssembly(USHORT cNumRecs, PCSXS_NODE_INFO prgNodeInfo);
BOOL XMLParser_Element_doc_configuration_windows_assemblyBinding_dependentAssembly_assemblyIdentity(USHORT cNumRecs, PCSXS_NODE_INFO prgNodeInfo);
BOOL XMLParser_Element_doc_configuration_windows_assemblyBinding_dependentAssembly_bindingRedirect(USHORT cNumRecs, PCSXS_NODE_INFO prgNodeInfo);
//
// Parsing helper functions:
//
enum XMLAttributeType
{
eAttributeTypeString, // represented by a CStringBuffer
eAttributeTypeVersion, // represented by a ASSEMBLY_VERSION
};
//
// Parser datatype specific worker functions. The first two parameters
// are combined to refer the member to actually modify. The third is the
// character string to be used as the value of the attribute.
//
// As an optimization, the datatype worker function may modify/destroy
// the value in the third parameter. For example, the worker function
// which just copies a CStringBuffer to another CStringBuffer actually
// uses the CStringBuffer::TakeValue() member which avoids performing
// a dynamic allocation if the attribute value exceeded the non-dynamically
// allocated portion of the CStringBuffer.
//
typedef BOOL (CNodeFactory::*XMLParserValueParserFunctionPtr)(LPVOID pvDatum, BOOL fAlreadyFound, CBaseStringBuffer &rbuff);
BOOL XMLParser_Parse_String(LPVOID pvDatum, BOOL fAlreadyFound, CBaseStringBuffer &rbuff);
BOOL XMLParser_Parse_Version(LPVOID pvDatum, BOOL fAlreadyFound, CBaseStringBuffer &rbuff);
BOOL XMLParser_Parse_ULARGE_INTEGER(LPVOID pvDatum, BOOL fAlreadyFound, CBaseStringBuffer &rbuff);
BOOL XMLParser_Parse_FILETIME(LPVOID pvDatum, BOOL fAlreadyFound, CBaseStringBuffer &rbuff);
BOOL XMLParser_Parse_GUID(LPVOID pvDatum, BOOL fAlreadyFound, CBaseStringBuffer &rbuff);
BOOL XMLParser_Parse_BLOB(LPVOID pvDatum, BOOL fAlreadyFound, CBaseStringBuffer &rbuff);
BOOL XMLParser_Parse_InstallAction(LPVOID pvDatum, BOOL fAlreadyFound, CBaseStringBuffer &rbuff);
BOOL XMLParser_Parse_Boolean(LPVOID pvDatum, BOOL fAlreadyFound, CBaseStringBuffer &rbuff);
BOOL XMLParser_Parse_PartialAssemblyVersion(LPVOID pvDatum, BOOL fAlreadyFound, CBaseStringBuffer &rbuff);
struct AttributeMapEntry
{
LPCWSTR m_pszAttributeName;
SIZE_T m_cchAttributeName;
SIZE_T m_offsetData;
SIZE_T m_offsetIndicator;
XMLParserValueParserFunctionPtr m_pfn;
};
BOOL ParseElementAttributes(
USHORT cNumRecs,
XML_NODE_INFO **prgpNodeInfo,
SIZE_T cAttributeMapEntries,
const AttributeMapEntry *prgEntries);
HRESULT LogParseError(
DWORD dwLastParseError,
const UNICODE_STRING *p1 = NULL,
const UNICODE_STRING *p2 = NULL,
const UNICODE_STRING *p3 = NULL,
const UNICODE_STRING *p4 = NULL,
const UNICODE_STRING *p5 = NULL,
const UNICODE_STRING *p6 = NULL,
const UNICODE_STRING *p7 = NULL,
const UNICODE_STRING *p8 = NULL,
const UNICODE_STRING *p9 = NULL,
const UNICODE_STRING *p10 = NULL,
const UNICODE_STRING *p11 = NULL,
const UNICODE_STRING *p12 = NULL,
const UNICODE_STRING *p13 = NULL,
const UNICODE_STRING *p14 = NULL,
const UNICODE_STRING *p15 = NULL,
const UNICODE_STRING *p16 = NULL,
const UNICODE_STRING *p17 = NULL,
const UNICODE_STRING *p18 = NULL,
const UNICODE_STRING *p19 = NULL,
const UNICODE_STRING *p20 = NULL
);
static VOID WINAPI ParseErrorCallback_MissingRequiredAttribute(
PCACTCTXCTB_PARSE_CONTEXT ParseContext,
IN PCATTRIBUTE_NAME_DESCRIPTOR AttributeName
);
static VOID WINAPI ParseErrorCallback_AttributeNotAllowed(
IN PCACTCTXCTB_PARSE_CONTEXT ParseContext,
IN PCATTRIBUTE_NAME_DESCRIPTOR AttributeName
);
static VOID WINAPI ParseErrorCallback_InvalidAttributeValue(
IN PCACTCTXCTB_PARSE_CONTEXT ParseContext,
IN PCATTRIBUTE_NAME_DESCRIPTOR AttributeName
);
private:
CNodeFactory(const CNodeFactory &);
void operator =(const CNodeFactory &);
};
#endif