Leaked source code of windows server 2003
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.
 
 
 
 
 
 

252 lines
8.5 KiB

using System;
using System.Text;
using System.Net;
using System.IO;
using System.Text.RegularExpressions;
using System.Runtime.Remoting;
using System.Globalization;
using System.Security;
using System.Security.Policy;
using System.Security.Permissions;
using System.Collections;
using System.Runtime.InteropServices;
using System.Reflection;
using System.Configuration.Assemblies;
using System.Threading;
using System.Xml;
using System.Xml.XPath;
namespace Microsoft.Fusion.ADF
{
public enum FileType : int
{
Unknown = 0,
RawFile = 1,
ApplicationManifest = 2,
ComponentManifest = 3
}
public interface IAssemblyManifestImport
{
AssemblyIdentity GetAssemblyIdentity();
DependentFileInfo GetNextDependentFileInfo();
DependentAssemblyInfo GetNextDependentAssemblyInfo();
void ResetIterators();
FileType GetFileType();
}
//----------------------------------------------------------
// ApplicationManifestImport
//----------------------------------------------------------
public class ApplicationManifestImport : IAssemblyManifestImport
{
XmlDocument _xmlDocument;
XPathNodeIterator _xPathFileIterator;
XPathNodeIterator _xPathAssemblyIterator;
AssemblyIdentity _assemblyIdentity;
Uri _manifestUri;
//----------------------------------------------------------
// ctor
//----------------------------------------------------------
public ApplicationManifestImport(Uri manifestUri)
{
_manifestUri = manifestUri;
_xmlDocument = new XmlDocument();
_xmlDocument.Load(_manifestUri.ToString());
_assemblyIdentity = GetAssemblyIdentity();
_xPathFileIterator = null;
_xPathAssemblyIterator = null;
}
//----------------------------------------------------------
// GetActivationInfo
//----------------------------------------------------------
public ActivationInfo GetActivationInfo()
{
XPathNavigator xPathNavigator = _xmlDocument.CreateNavigator();
XPathNodeIterator xPathNodeIterator = xPathNavigator.Select ("/assembly/application/activation");
if (xPathNodeIterator.MoveNext() == false)
return null;
ActivationInfo ai = new ActivationInfo();
string assemblyName = xPathNodeIterator.Current.GetAttribute("assemblyName", "");
string assemblyClass = xPathNodeIterator.Current.GetAttribute("assemblyClass", "");
string assemblyMethod = xPathNodeIterator.Current.GetAttribute("assemblyMethod", "");
string assemblyMethodArgs = xPathNodeIterator.Current.GetAttribute("assemblyMethodArgs", "");
ai["assemblyName"] = assemblyName;
ai["assemblyClass"] = assemblyClass;
ai["assemblyMethod"] = assemblyMethod;
ai["assemblyMethodArgs"] = assemblyMethodArgs;
return ai;
}
//----------------------------------------------------------
// GetAssemblyIdentity
//----------------------------------------------------------
public AssemblyIdentity GetAssemblyIdentity()
{
if (_assemblyIdentity != null)
goto exit;
XPathNavigator myXPathNavigator = _xmlDocument.CreateNavigator();
XPathNodeIterator myXPathNodeIterator = myXPathNavigator.Select ("/assembly/assemblyIdentity");
myXPathNodeIterator.MoveNext();
_assemblyIdentity = XMLToAssemblyId(myXPathNodeIterator);
exit:
return _assemblyIdentity;
}
//----------------------------------------------------------
// GetNextDependentFileInfo
//----------------------------------------------------------
public DependentFileInfo GetNextDependentFileInfo()
{
if (_xPathFileIterator == null)
{
XPathNavigator myXPathNavigator = _xmlDocument.CreateNavigator();
_xPathFileIterator = myXPathNavigator.Select ("/assembly/file");
}
if (_xPathFileIterator.MoveNext() == false)
return null;
DependentFileInfo dfi = new DependentFileInfo();
dfi["name"] = _xPathFileIterator.Current.GetAttribute("name", "");
dfi["hash"] = _xPathFileIterator.Current.GetAttribute("hash", "");
return dfi;
}
//----------------------------------------------------------
// GetNextDependentAssemblyInfo
//----------------------------------------------------------
public DependentAssemblyInfo GetNextDependentAssemblyInfo()
{
if (_xPathAssemblyIterator == null)
{
XPathNavigator myXPathNavigator = _xmlDocument.CreateNavigator();
_xPathAssemblyIterator = myXPathNavigator.Select ("/assembly/dependency/dependentAssembly");
}
if (_xPathAssemblyIterator.MoveNext() == false)
return null;
XPathNodeIterator asmIter = _xPathAssemblyIterator.Current.Select("assemblyIdentity");
asmIter.MoveNext();
DependentAssemblyInfo dai = new DependentAssemblyInfo();
dai.assemblyIdentity = XMLToAssemblyId(asmIter);
XPathNodeIterator installIter = _xPathAssemblyIterator.Current.Select("install");
installIter.MoveNext();
dai["codeBase"] = installIter.Current.GetAttribute("codebase", "");
return dai;
}
//----------------------------------------------------------
// XMLToAssemblyId
//----------------------------------------------------------
private AssemblyIdentity XMLToAssemblyId(XPathNodeIterator xPathNodeIterator)
{
AssemblyIdentity assemblyIdentity = new AssemblyIdentity();
assemblyIdentity["name"] =xPathNodeIterator.Current.GetAttribute("name", "");
assemblyIdentity["version"] =xPathNodeIterator.Current.GetAttribute("version", "");
assemblyIdentity["processorArchitecture"] =xPathNodeIterator.Current.GetAttribute("processorArchitecture", "");
assemblyIdentity["publicKeyToken"] =xPathNodeIterator.Current.GetAttribute("publicKeyToken", "");
assemblyIdentity["language"] =xPathNodeIterator.Current.GetAttribute("language", "");
return assemblyIdentity;
}
//----------------------------------------------------------
// ResetIterators
//----------------------------------------------------------
public void ResetIterators()
{
_xPathAssemblyIterator = null;
_xPathFileIterator = null;
}
//----------------------------------------------------------
// GetFileType()
//----------------------------------------------------------
public FileType GetFileType()
{
return FileType.ApplicationManifest;
}
//----------------------------------------------------------
// GetSecurityInfo
//----------------------------------------------------------
public SecurityInfo GetSecurityInfo()
{
XPathNavigator xPathNavigator = _xmlDocument.CreateNavigator();
XPathNodeIterator xPathNodeIterator = xPathNavigator.Select ("/assembly/Security");
if (xPathNodeIterator.MoveNext() == false)
return null;
SecurityInfo si = new SecurityInfo();
XPathNavigator xp = xPathNodeIterator.Current;
// XmlNode xmlNode = ((IHasXmlNode) xp).GetNode();
XmlNode xmlNode = ((IHasXmlNode) xp).GetNode();
si["Security"] = xmlNode.OuterXml;
return si;
}
}
//----------------------------------------------------------
// AssemblyIdentity
//----------------------------------------------------------
public class AssemblyIdentity : Hashtable
{
public string GetDirectoryName()
{
string pa = (string) this["processorArchitecture"];
string name = (string) this["name"];
string version = (string) this["version"];
string pkt = (string) this["publicKeyToken"];
string lan = (string) this["language"];
string appDirName = pa + '_' + name + '_' + version + '_' + pkt + '_' + lan;
return appDirName;
}
}
//----------------------------------------------------------
// StringTable
//----------------------------------------------------------
public class StringTable : Hashtable
{
public string this [string index]
{
get { return (string) this[(object) index]; }
set { this[(object) index] = value; }
}
}
//----------------------------------------------------------
// DependentFileInfo
//----------------------------------------------------------
public class DependentFileInfo : StringTable
{ }
//----------------------------------------------------------
// DependentAssemblyInfo
//----------------------------------------------------------
public class DependentAssemblyInfo : StringTable
{
public AssemblyIdentity assemblyIdentity;
}
//----------------------------------------------------------
// ActivationInfo
//----------------------------------------------------------
public class ActivationInfo : StringTable
{}
public class SecurityInfo : StringTable
{}
}