using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; using System.Runtime.InteropServices.ComTypes; using System.Diagnostics.SymbolStore; namespace QUT.Symbols { #region HelperInterfaces /// /// This is really just a hook to hang the GUID on, /// so that we can pass "typeof(IMetadataImport)" /// to Marshal.GetComInterfaceForObject() /// [ ComVisible(true), InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("7DAC8207-D3AE-4c75-9B67-92801A497D44") ] public interface IMetadataImport { void Dummy(); } /// /// Helper interface for the managed reader. /// This is based on the interface of the same name /// defined in the C++ header file corsym.h /// [ ComImport, ComVisible(false), InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("B62B923C-B500-3158-A543-24F307A8B7E1") ] interface ISymUnmanagedMethod { void GetToken(out SymbolToken pToken); void GetSequencePointCount(out int retVal); // used by PERWAPI void GetRootScope( // used by PERWAPI [MarshalAs(UnmanagedType.Interface)] out ISymUnmanagedScope retVal); void GetScopeFromOffset( int offset, [MarshalAs(UnmanagedType.Interface)] out ISymUnmanagedScope retVal); void GetOffset( ISymUnmanagedDocument document, int line, int column, out int retVal); void GetRanges( ISymUnmanagedDocument document, int line, int column, int cRanges, out int pcRanges, [In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 3)] int[] ranges); void GetParameters( int cParams, out int pcParams, [In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] ISymUnmanagedVariable[] parms); void GetNamespace( [MarshalAs(UnmanagedType.Interface)] out ISymUnmanagedNamespace retVal); void GetSourceStartEnd( ISymUnmanagedDocument[] docs, [In, Out, MarshalAs(UnmanagedType.LPArray)] int[] lines, [In, Out, MarshalAs(UnmanagedType.LPArray)] int[] columns, out Boolean retVal); void GetSequencePoints( // used by PERWAPI int cPoints, out int pcPoints, [In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] int[] offsets, [In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] ISymUnmanagedDocument[] documents, [In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] int[] lines, [In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] int[] columns, [In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] int[] endLines, [In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] int[] endColumns); } /// /// This definition is a hook for the COM interface. /// We use [PreserveSig] to call the bare function /// returning an HRESULT. We only need GetReaderForFile() /// which is in the first slot of the vtable. /// /// The definition is in C++ header corsym.h /// [ ComImport, ComVisible(false), InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("AA544d42-28CB-11d3-bd22-0000f80849bd") ] internal interface ISymUnmanagedBinder { [PreserveSig] int GetReaderForFile( IntPtr importer, [MarshalAs(UnmanagedType.LPWStr)] string filename, [MarshalAs(UnmanagedType.LPWStr)] string dummyPath, [MarshalAs(UnmanagedType.Interface)] out object retVal); } /// /// This interface is a minimal cover of the interface /// of the same name defined in C++ header corsym.h /// [ ComImport, ComVisible(false), InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("B4CE6286-2A6B-3712-A3B7-1EE1DAD467B5") ] internal interface ISymUnmanagedReader { void GetDocument( [MarshalAs(UnmanagedType.LPWStr)] String url, Guid language, Guid languageVendor, Guid documentType, [MarshalAs(UnmanagedType.Interface)] out ISymUnmanagedDocument retVal); void GetDocuments( int cDocs, out int pcDocs, [In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] ISymUnmanagedDocument[] pDocs); [PreserveSig] int GetUserEntryPoint(out SymbolToken EntryPoint); [PreserveSig] int GetMethod( SymbolToken methodToken, [MarshalAs(UnmanagedType.Interface)] out ISymUnmanagedMethod retVal); [PreserveSig] int GetMethodByVersion( SymbolToken methodToken, int version, [MarshalAs(UnmanagedType.Interface)] out ISymUnmanagedMethod retVal); void GetVariables( SymbolToken parent, int cVars, out int pcVars, [In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] ISymUnmanagedVariable[] vars); void GetGlobalVariablesDummy(); void GetMethodFromDocumentPosition( ISymUnmanagedDocument document, int line, int column, [MarshalAs(UnmanagedType.Interface)] out ISymUnmanagedMethod retVal); void GetSymAttributeDummy(); void GetNamespacesDummy(); void Initialize( IntPtr importer, [MarshalAs(UnmanagedType.LPWStr)] string filename, [MarshalAs(UnmanagedType.LPWStr)] string searchPath, IStream stream); void UpdateSymbolStoreDummy(); void ReplaceSymbolStoreDummy(); void GetSymbolStoreFileNameDummy(); void GetMethodsFromDocumentPositionDummy(); void GetDocumentVersionDummy(); void GetMethodVersionDummy(); } /// /// A minimal subset of the COM IMetaDataDispenser interface /// [ ComVisible(true), InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("809c652e-7396-11d2-9771-00a0c9b4d50c") ] internal interface IMetaDataDispenserSubset { void DefineScope_Dummy(); // Put here to index vtable correctly void OpenScope( [In, MarshalAs(UnmanagedType.LPWStr)] string szScope, [In] int dwOpenFlags, [In] ref Guid riid, [MarshalAs(UnmanagedType.IUnknown)] out object pUnk); } /// /// This interface is defined in C++ header corsym.h /// [ ComImport, ComVisible(false), InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("9F60EEBE-2D9A-3F7C-BF58-80BC991C60BB") ] internal interface ISymUnmanagedVariable { void GetName( int cchName, out int pcchName, [MarshalAs(UnmanagedType.LPWStr)] StringBuilder szName); void GetAttributes(out int pRetVal); void GetSignature( int cSig, out int pcSig, [In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] byte[] sig); void GetAddressKind(out int pRetVal); void GetAddressField1(out int pRetVal); void GetAddressField2(out int pRetVal); void GetAddressField3(out int pRetVal); void GetStartOffset(out int pRetVal); void GetEndOffset(out int pRetVal); } /// /// This interface defined in C++ header file CorSym.h /// [ ComImport, ComVisible(false), InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("40DE4037-7C81-3E1E-B022-AE1ABFF2CA08"), ] internal interface ISymUnmanagedDocument // needed by PERWAPI { void GetURL( int cchUrl, out int pcchUrl, [MarshalAs(UnmanagedType.LPWStr)] StringBuilder szUrl); void GetDocumentType(ref Guid pRetVal); void GetLanguage(ref Guid pRetVal); void GetLanguageVendor(ref Guid pRetVal); void GetCheckSumAlgorithmId(ref Guid pRetVal); void GetCheckSum( int cData, out int pcData, [In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] byte[] data); void FindClosestLine( int line, out int pRetVal); void HasEmbeddedSource(out Boolean pRetVal); void GetSourceLength(out int pRetVal); void GetSourceRange( int startLine, int startColumn, int endLine, int endColumn, int cSourceBytes, out int pcSourceBytes, [In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 4)] byte[] source); }; // ===================================================================================== /// /// This interface defined in C++ header file CorSym.h /// [ ComImport, ComVisible(false), InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("68005D0F-B8E0-3B01-84D5-A11A94154942") ] internal interface ISymUnmanagedScope // needed by PERWAPI { void GetMethod( [MarshalAs(UnmanagedType.Interface)] out ISymUnmanagedMethod pRetVal); void GetParent( [MarshalAs(UnmanagedType.Interface)] out ISymUnmanagedScope pRetVal); void GetChildren( int cChildren, out int pcChildren, [In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] ISymUnmanagedScope[] children); void GetStartOffset(out int pRetVal); void GetEndOffset(out int pRetVal); void GetLocalCount(out int pRetVal); void GetLocals( int cLocals, out int pcLocals, [In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] ISymUnmanagedVariable[] locals); void GetNamespaces( int cNameSpaces, out int pcNameSpaces, [In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] ISymUnmanagedNamespace[] namespaces); }; /// /// This interface defined in C++ header file CorSym.h /// [ ComImport, ComVisible(false), InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("0DFF7289-54F8-11d3-BD28-0000F80849BD") ] internal interface ISymUnmanagedNamespace { void GetName( int cchName, out int pcchName, [MarshalAs(UnmanagedType.LPWStr)] StringBuilder szName); void GetNamespaces( int cNameSpaces, out int pcNameSpaces, [In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] ISymUnmanagedNamespace[] namespaces); void GetVariables( int cVars, out int pcVars, [In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] ISymUnmanagedVariable[] pVars); } #endregion // Helper Interfaces #region SymbolWriterExtras /// /// This interface is a minimal cover of the interface /// of the same name defined in C++ header corsym.h /// [ ComImport, ComVisible(false), InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("0B97726E-9E6D-4f05-9A26-424022093CAA") ] internal interface ISymUnmanagedWriter2 { void DefineDocument( // used [MarshalAs(UnmanagedType.LPWStr)] string url, ref Guid language, ref Guid languageVendor, ref Guid documentType, [MarshalAs(UnmanagedType.Interface)] out ISymUnmanagedDocumentWriter RetVal); void SetUserEntryPoint(SymbolToken entryMethod); // used void OpenMethod(SymbolToken method); // used void CloseMethod(); // used void OpenScope(int startOffset, out int pRetVal); // used void CloseScope(int endOffset); // used void SetScopeRange(int scopeID, int startOffset, int endOffset); void DefineLocalVariable( [MarshalAs(UnmanagedType.LPWStr)] string name, int attributes, int cSig, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] byte[] signature, int addressKind, int addr1, int addr2, int addr3, int startOffset, int endOffset); void DefineParameter( [MarshalAs(UnmanagedType.LPWStr)] string name, int attributes, int sequence, int addressKind, int addr1, int addr2, int addr3); void DefineField( SymbolToken parent, [MarshalAs(UnmanagedType.LPWStr)] string name, int attributes, int cSig, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 3)] byte[] signature, int addressKind, int addr1, int addr2, int addr3); void DefineGlobalVariable( [MarshalAs(UnmanagedType.LPWStr)] string name, int attributes, int cSig, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] byte[] signature, int addressKind, int addr1, int addr2, int addr3); void Close(); // used void SetSymAttribute( SymbolToken parent, [MarshalAs(UnmanagedType.LPWStr)] string name, int cData, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] byte[] data); void OpenNamespace([MarshalAs(UnmanagedType.LPWStr)] string name); void CloseNamespace(); void UsingNamespace([MarshalAs(UnmanagedType.LPWStr)] string fullName); void SetMethodSourceRange( ISymUnmanagedDocumentWriter startDoc, int startLine, int startColumn, ISymUnmanagedDocumentWriter endDoc, int endLine, int endColumn); void Initialize( // used IntPtr emitter, [MarshalAs(UnmanagedType.LPWStr)] string filename, IStream stream, bool fullBuild); void GetDebugInfo( // used out ImageDebugDirectory iDD, int cData, out int pcData, [In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] byte[] data); void DefineSequencePoints( // used ISymUnmanagedDocumentWriter document, int spCount, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] int[] offsets, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] int[] lines, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] int[] columns, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] int[] endLines, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] int[] endColumns); void RemapToken(SymbolToken oldToken, SymbolToken newToken); void Initialize2( IntPtr emitter, [MarshalAs(UnmanagedType.LPWStr)] string tempfilename, IStream stream, bool fullBuild, [ MarshalAs(UnmanagedType.LPWStr)] string finalfilename); void DefineConstant( [MarshalAs(UnmanagedType.LPWStr)] string name, object value, int cSig, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] byte[] signature); void Abort(); void DefineLocalVariable2( // used [MarshalAs(UnmanagedType.LPWStr)] string name, int attributes, SymbolToken sigToken, int addressKind, int addr1, int addr2, int addr3, int startOffset, int endOffset); void DefineGlobalVariable2( [MarshalAs(UnmanagedType.LPWStr)] string name, int attributes, SymbolToken sigToken, int addressKind, int addr1, int addr2, int addr3); void DefineConstant2( [MarshalAs(UnmanagedType.LPWStr)] string name, object value, SymbolToken sigToken); } /// /// This interface is a minimal cover of the interface /// of the same name defined in C++ header corsym.h /// [ ComImport, ComVisible(false), Guid("B01FAFEB-C450-3A4D-BEEC-B4CEEC01E006"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown) ] internal interface ISymUnmanagedDocumentWriter { void SetSource( int sourceSize, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] byte[] source); void SetCheckSum( Guid algorithmId, int checkSumSize, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] byte[] checkSum); } #endregion // SymbolWriterExtras }