IUnmanaged.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Runtime.InteropServices;
  5. using System.Runtime.InteropServices.ComTypes;
  6. using System.Diagnostics.SymbolStore;
  7. namespace QUT.Symbols {
  8. #region HelperInterfaces
  9. /// <summary>
  10. /// This is really just a hook to hang the GUID on,
  11. /// so that we can pass "typeof(IMetadataImport)"
  12. /// to Marshal.GetComInterfaceForObject()
  13. /// </summary>
  14. [
  15. ComVisible(true),
  16. InterfaceType(ComInterfaceType.InterfaceIsIUnknown),
  17. Guid("7DAC8207-D3AE-4c75-9B67-92801A497D44")
  18. ]
  19. public interface IMetadataImport {
  20. void Dummy();
  21. }
  22. /// <summary>
  23. /// Helper interface for the managed reader.
  24. /// This is based on the interface of the same name
  25. /// defined in the C++ header file corsym.h
  26. /// </summary>
  27. [
  28. ComImport,
  29. ComVisible(false),
  30. InterfaceType(ComInterfaceType.InterfaceIsIUnknown),
  31. Guid("B62B923C-B500-3158-A543-24F307A8B7E1")
  32. ]
  33. interface ISymUnmanagedMethod {
  34. void GetToken(out SymbolToken pToken);
  35. void GetSequencePointCount(out int retVal); // used by PERWAPI
  36. void GetRootScope( // used by PERWAPI
  37. [MarshalAs(UnmanagedType.Interface)] out ISymUnmanagedScope retVal);
  38. void GetScopeFromOffset(
  39. int offset,
  40. [MarshalAs(UnmanagedType.Interface)] out ISymUnmanagedScope retVal);
  41. void GetOffset(
  42. ISymUnmanagedDocument document,
  43. int line,
  44. int column,
  45. out int retVal);
  46. void GetRanges(
  47. ISymUnmanagedDocument document,
  48. int line,
  49. int column,
  50. int cRanges,
  51. out int pcRanges,
  52. [In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 3)] int[] ranges);
  53. void GetParameters(
  54. int cParams,
  55. out int pcParams,
  56. [In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] ISymUnmanagedVariable[] parms);
  57. void GetNamespace(
  58. [MarshalAs(UnmanagedType.Interface)] out ISymUnmanagedNamespace retVal);
  59. void GetSourceStartEnd(
  60. ISymUnmanagedDocument[] docs,
  61. [In, Out, MarshalAs(UnmanagedType.LPArray)] int[] lines,
  62. [In, Out, MarshalAs(UnmanagedType.LPArray)] int[] columns,
  63. out Boolean retVal);
  64. void GetSequencePoints( // used by PERWAPI
  65. int cPoints,
  66. out int pcPoints,
  67. [In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] int[] offsets,
  68. [In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] ISymUnmanagedDocument[] documents,
  69. [In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] int[] lines,
  70. [In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] int[] columns,
  71. [In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] int[] endLines,
  72. [In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] int[] endColumns);
  73. }
  74. /// <summary>
  75. /// This definition is a hook for the COM interface.
  76. /// We use [PreserveSig] to call the bare function
  77. /// returning an HRESULT. We only need GetReaderForFile()
  78. /// which is in the first slot of the vtable.
  79. ///
  80. /// The definition is in C++ header corsym.h
  81. /// </summary>
  82. [
  83. ComImport,
  84. ComVisible(false),
  85. InterfaceType(ComInterfaceType.InterfaceIsIUnknown),
  86. Guid("AA544d42-28CB-11d3-bd22-0000f80849bd")
  87. ]
  88. internal interface ISymUnmanagedBinder {
  89. [PreserveSig]
  90. int GetReaderForFile(
  91. IntPtr importer,
  92. [MarshalAs(UnmanagedType.LPWStr)] string filename,
  93. [MarshalAs(UnmanagedType.LPWStr)] string dummyPath,
  94. [MarshalAs(UnmanagedType.Interface)] out object retVal);
  95. }
  96. /// <summary>
  97. /// This interface is a minimal cover of the interface
  98. /// of the same name defined in C++ header corsym.h
  99. /// </summary>
  100. [
  101. ComImport,
  102. ComVisible(false),
  103. InterfaceType(ComInterfaceType.InterfaceIsIUnknown),
  104. Guid("B4CE6286-2A6B-3712-A3B7-1EE1DAD467B5")
  105. ]
  106. internal interface ISymUnmanagedReader {
  107. void GetDocument(
  108. [MarshalAs(UnmanagedType.LPWStr)] String url,
  109. Guid language,
  110. Guid languageVendor,
  111. Guid documentType,
  112. [MarshalAs(UnmanagedType.Interface)] out ISymUnmanagedDocument retVal);
  113. void GetDocuments(
  114. int cDocs,
  115. out int pcDocs,
  116. [In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] ISymUnmanagedDocument[] pDocs);
  117. [PreserveSig]
  118. int GetUserEntryPoint(out SymbolToken EntryPoint);
  119. [PreserveSig]
  120. int GetMethod(
  121. SymbolToken methodToken,
  122. [MarshalAs(UnmanagedType.Interface)] out ISymUnmanagedMethod retVal);
  123. [PreserveSig]
  124. int GetMethodByVersion(
  125. SymbolToken methodToken,
  126. int version,
  127. [MarshalAs(UnmanagedType.Interface)] out ISymUnmanagedMethod retVal);
  128. void GetVariables(
  129. SymbolToken parent,
  130. int cVars,
  131. out int pcVars,
  132. [In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] ISymUnmanagedVariable[] vars);
  133. void GetGlobalVariablesDummy();
  134. void GetMethodFromDocumentPosition(
  135. ISymUnmanagedDocument document,
  136. int line,
  137. int column,
  138. [MarshalAs(UnmanagedType.Interface)] out ISymUnmanagedMethod retVal);
  139. void GetSymAttributeDummy();
  140. void GetNamespacesDummy();
  141. void Initialize(
  142. IntPtr importer,
  143. [MarshalAs(UnmanagedType.LPWStr)] string filename,
  144. [MarshalAs(UnmanagedType.LPWStr)] string searchPath,
  145. IStream stream);
  146. void UpdateSymbolStoreDummy();
  147. void ReplaceSymbolStoreDummy();
  148. void GetSymbolStoreFileNameDummy();
  149. void GetMethodsFromDocumentPositionDummy();
  150. void GetDocumentVersionDummy();
  151. void GetMethodVersionDummy();
  152. }
  153. /// <summary>
  154. /// A minimal subset of the COM IMetaDataDispenser interface
  155. /// </summary>
  156. [
  157. ComVisible(true),
  158. InterfaceType(ComInterfaceType.InterfaceIsIUnknown),
  159. Guid("809c652e-7396-11d2-9771-00a0c9b4d50c")
  160. ]
  161. internal interface IMetaDataDispenserSubset {
  162. void DefineScope_Dummy(); // Put here to index vtable correctly
  163. void OpenScope(
  164. [In, MarshalAs(UnmanagedType.LPWStr)] string szScope,
  165. [In] int dwOpenFlags,
  166. [In] ref Guid riid,
  167. [MarshalAs(UnmanagedType.IUnknown)] out object pUnk);
  168. }
  169. /// <summary>
  170. /// This interface is defined in C++ header corsym.h
  171. /// </summary>
  172. [
  173. ComImport,
  174. ComVisible(false),
  175. InterfaceType(ComInterfaceType.InterfaceIsIUnknown),
  176. Guid("9F60EEBE-2D9A-3F7C-BF58-80BC991C60BB")
  177. ]
  178. internal interface ISymUnmanagedVariable {
  179. void GetName(
  180. int cchName,
  181. out int pcchName,
  182. [MarshalAs(UnmanagedType.LPWStr)] StringBuilder szName);
  183. void GetAttributes(out int pRetVal);
  184. void GetSignature(
  185. int cSig,
  186. out int pcSig,
  187. [In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] byte[] sig);
  188. void GetAddressKind(out int pRetVal);
  189. void GetAddressField1(out int pRetVal);
  190. void GetAddressField2(out int pRetVal);
  191. void GetAddressField3(out int pRetVal);
  192. void GetStartOffset(out int pRetVal);
  193. void GetEndOffset(out int pRetVal);
  194. }
  195. /// <summary>
  196. /// This interface defined in C++ header file CorSym.h
  197. /// </summary>
  198. [
  199. ComImport,
  200. ComVisible(false),
  201. InterfaceType(ComInterfaceType.InterfaceIsIUnknown),
  202. Guid("40DE4037-7C81-3E1E-B022-AE1ABFF2CA08"),
  203. ]
  204. internal interface ISymUnmanagedDocument // needed by PERWAPI
  205. {
  206. void GetURL(
  207. int cchUrl,
  208. out int pcchUrl,
  209. [MarshalAs(UnmanagedType.LPWStr)] StringBuilder szUrl);
  210. void GetDocumentType(ref Guid pRetVal);
  211. void GetLanguage(ref Guid pRetVal);
  212. void GetLanguageVendor(ref Guid pRetVal);
  213. void GetCheckSumAlgorithmId(ref Guid pRetVal);
  214. void GetCheckSum(
  215. int cData,
  216. out int pcData,
  217. [In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] byte[] data);
  218. void FindClosestLine(
  219. int line,
  220. out int pRetVal);
  221. void HasEmbeddedSource(out Boolean pRetVal);
  222. void GetSourceLength(out int pRetVal);
  223. void GetSourceRange(
  224. int startLine,
  225. int startColumn,
  226. int endLine,
  227. int endColumn,
  228. int cSourceBytes,
  229. out int pcSourceBytes,
  230. [In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 4)] byte[] source);
  231. };
  232. // =====================================================================================
  233. /// <summary>
  234. /// This interface defined in C++ header file CorSym.h
  235. /// </summary>
  236. [
  237. ComImport,
  238. ComVisible(false),
  239. InterfaceType(ComInterfaceType.InterfaceIsIUnknown),
  240. Guid("68005D0F-B8E0-3B01-84D5-A11A94154942")
  241. ]
  242. internal interface ISymUnmanagedScope // needed by PERWAPI
  243. {
  244. void GetMethod(
  245. [MarshalAs(UnmanagedType.Interface)] out ISymUnmanagedMethod pRetVal);
  246. void GetParent(
  247. [MarshalAs(UnmanagedType.Interface)] out ISymUnmanagedScope pRetVal);
  248. void GetChildren(
  249. int cChildren,
  250. out int pcChildren,
  251. [In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] ISymUnmanagedScope[] children);
  252. void GetStartOffset(out int pRetVal);
  253. void GetEndOffset(out int pRetVal);
  254. void GetLocalCount(out int pRetVal);
  255. void GetLocals(
  256. int cLocals,
  257. out int pcLocals,
  258. [In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] ISymUnmanagedVariable[] locals);
  259. void GetNamespaces(
  260. int cNameSpaces,
  261. out int pcNameSpaces,
  262. [In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] ISymUnmanagedNamespace[] namespaces);
  263. };
  264. /// <summary>
  265. /// This interface defined in C++ header file CorSym.h
  266. /// </summary>
  267. [
  268. ComImport,
  269. ComVisible(false),
  270. InterfaceType(ComInterfaceType.InterfaceIsIUnknown),
  271. Guid("0DFF7289-54F8-11d3-BD28-0000F80849BD")
  272. ]
  273. internal interface ISymUnmanagedNamespace {
  274. void GetName(
  275. int cchName,
  276. out int pcchName,
  277. [MarshalAs(UnmanagedType.LPWStr)] StringBuilder szName);
  278. void GetNamespaces(
  279. int cNameSpaces,
  280. out int pcNameSpaces,
  281. [In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] ISymUnmanagedNamespace[] namespaces);
  282. void GetVariables(
  283. int cVars,
  284. out int pcVars,
  285. [In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] ISymUnmanagedVariable[] pVars);
  286. }
  287. #endregion // Helper Interfaces
  288. #region SymbolWriterExtras
  289. /// <summary>
  290. /// This interface is a minimal cover of the interface
  291. /// of the same name defined in C++ header corsym.h
  292. /// </summary>
  293. [
  294. ComImport,
  295. ComVisible(false),
  296. InterfaceType(ComInterfaceType.InterfaceIsIUnknown),
  297. Guid("0B97726E-9E6D-4f05-9A26-424022093CAA")
  298. ]
  299. internal interface ISymUnmanagedWriter2 {
  300. void DefineDocument( // used
  301. [MarshalAs(UnmanagedType.LPWStr)] string url,
  302. ref Guid language,
  303. ref Guid languageVendor,
  304. ref Guid documentType,
  305. [MarshalAs(UnmanagedType.Interface)] out ISymUnmanagedDocumentWriter RetVal);
  306. void SetUserEntryPoint(SymbolToken entryMethod); // used
  307. void OpenMethod(SymbolToken method); // used
  308. void CloseMethod(); // used
  309. void OpenScope(int startOffset, out int pRetVal); // used
  310. void CloseScope(int endOffset); // used
  311. void SetScopeRange(int scopeID, int startOffset, int endOffset);
  312. void DefineLocalVariable(
  313. [MarshalAs(UnmanagedType.LPWStr)] string name,
  314. int attributes, int cSig,
  315. [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] byte[] signature,
  316. int addressKind,
  317. int addr1,
  318. int addr2,
  319. int addr3,
  320. int startOffset,
  321. int endOffset);
  322. void DefineParameter(
  323. [MarshalAs(UnmanagedType.LPWStr)] string name,
  324. int attributes,
  325. int sequence,
  326. int addressKind,
  327. int addr1,
  328. int addr2,
  329. int addr3);
  330. void DefineField(
  331. SymbolToken parent,
  332. [MarshalAs(UnmanagedType.LPWStr)] string name,
  333. int attributes, int cSig,
  334. [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 3)] byte[] signature,
  335. int addressKind,
  336. int addr1,
  337. int addr2,
  338. int addr3);
  339. void DefineGlobalVariable(
  340. [MarshalAs(UnmanagedType.LPWStr)] string name,
  341. int attributes, int cSig,
  342. [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] byte[] signature,
  343. int addressKind,
  344. int addr1,
  345. int addr2,
  346. int addr3);
  347. void Close(); // used
  348. void SetSymAttribute(
  349. SymbolToken parent,
  350. [MarshalAs(UnmanagedType.LPWStr)] string name,
  351. int cData,
  352. [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] byte[] data);
  353. void OpenNamespace([MarshalAs(UnmanagedType.LPWStr)] string name);
  354. void CloseNamespace();
  355. void UsingNamespace([MarshalAs(UnmanagedType.LPWStr)] string fullName);
  356. void SetMethodSourceRange(
  357. ISymUnmanagedDocumentWriter startDoc,
  358. int startLine, int startColumn,
  359. ISymUnmanagedDocumentWriter endDoc,
  360. int endLine,
  361. int endColumn);
  362. void Initialize( // used
  363. IntPtr emitter,
  364. [MarshalAs(UnmanagedType.LPWStr)] string filename,
  365. IStream stream,
  366. bool fullBuild);
  367. void GetDebugInfo( // used
  368. out ImageDebugDirectory iDD,
  369. int cData,
  370. out int pcData,
  371. [In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] byte[] data);
  372. void DefineSequencePoints( // used
  373. ISymUnmanagedDocumentWriter document,
  374. int spCount,
  375. [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] int[] offsets,
  376. [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] int[] lines,
  377. [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] int[] columns,
  378. [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] int[] endLines,
  379. [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] int[] endColumns);
  380. void RemapToken(SymbolToken oldToken, SymbolToken newToken);
  381. void Initialize2(
  382. IntPtr emitter,
  383. [MarshalAs(UnmanagedType.LPWStr)] string tempfilename,
  384. IStream stream,
  385. bool fullBuild, [
  386. MarshalAs(UnmanagedType.LPWStr)] string finalfilename);
  387. void DefineConstant(
  388. [MarshalAs(UnmanagedType.LPWStr)] string name,
  389. object value,
  390. int cSig,
  391. [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] byte[] signature);
  392. void Abort();
  393. void DefineLocalVariable2( // used
  394. [MarshalAs(UnmanagedType.LPWStr)] string name,
  395. int attributes,
  396. SymbolToken sigToken,
  397. int addressKind,
  398. int addr1,
  399. int addr2,
  400. int addr3,
  401. int startOffset,
  402. int endOffset);
  403. void DefineGlobalVariable2(
  404. [MarshalAs(UnmanagedType.LPWStr)] string name,
  405. int attributes,
  406. SymbolToken sigToken,
  407. int addressKind,
  408. int addr1,
  409. int addr2,
  410. int addr3);
  411. void DefineConstant2(
  412. [MarshalAs(UnmanagedType.LPWStr)] string name,
  413. object value,
  414. SymbolToken sigToken);
  415. }
  416. /// <summary>
  417. /// This interface is a minimal cover of the interface
  418. /// of the same name defined in C++ header corsym.h
  419. /// </summary>
  420. [
  421. ComImport,
  422. ComVisible(false),
  423. Guid("B01FAFEB-C450-3A4D-BEEC-B4CEEC01E006"),
  424. InterfaceType(ComInterfaceType.InterfaceIsIUnknown)
  425. ]
  426. internal interface ISymUnmanagedDocumentWriter {
  427. void SetSource(
  428. int sourceSize,
  429. [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] byte[] source);
  430. void SetCheckSum(
  431. Guid algorithmId,
  432. int checkSumSize,
  433. [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] byte[] checkSum);
  434. }
  435. #endregion // SymbolWriterExtras
  436. }