Skip to content
lordmilko edited this page Feb 28, 2023 · 3 revisions

Suppose you're attempting to develop a Visual Studio extension, and would like to take a peek into where some of Visual Studio's core interfaces such as IVsSolution are implemented. This interface is implemented by some native COM component...but which one, and where?

DebugTools can help you track down the underlying type of a COM object in any system wide process, without needing to attach a debugger.

C:\> Get-ComObject -ProcessId 21356 IVsSolution

Module    Symbol               RVA     LoadedAddress OriginalAddress Interfaces
------    ------               ---     ------------- --------------- ----------
msenv.dll CSolution::`vftable' 0xD97B0 0x3DB97B0     0x100D97B0      {IVsDiagnosticsItem, IVsFileChangeEvents, IVsHi...

From this information, we can see that asingle RCW within Visual Studio implements the IVsSolution interface, the underlying type of which is msenv!CSolution. In addition, there are a number of other interfaces that this particular RCW has been asked to QueryInterface for, including IVsHierarchy and IVsSolution 2, 3 and 5.

We can do even better than this however: we can also list all of the methods defined on the CSolution vtable

C:\> Get-ComObject -ProcessId 21356 IVsSolution | Get-ComObjectMethod

Module    Symbol                         RVA      LoadedAddress OriginalAddress
------    ------                         ---      ------------- ---------------
msenv.dll CSolution::QueryInterface      0xD9E74  0x38D9E74     0x100D9E74
msenv.dll CSolution::AddRef              0xD988C  0x38D988C     0x100D988C
msenv.dll CSolution::Release             0xD9850  0x38D9850     0x100D9850
msenv.dll CSolution::GetProjectEnum      0x20190E 0x3A0190E     0x1020190E
msenv.dll CSolution::CreateProject       0x1AEA80 0x39AEA80     0x101AEA80
...

Using this information you can now easily open up IDA Pro, hit g and paste in the OriginalAddress of the method you want to look at to jump straight to it.

Both the Get-ComObject and Get-ComObjectMethod cmdlets allow specifying wildcard parameters to filter down the list of results.

Get-ComObject can be used to filter either by the name of the interface you're looking for, or the name of the native symbol the interface is implemented in

# Get all COM objects that implement an interface containing "solution"
Get-ComObject *solution*

# Get all COM objects whose native symbol contains "solution"
Get-ComObject -SymbolName *solution*

Similarly, Get-ComObjectMethod can also be used to filter for methods matching a specific pattern

# Get all methods on objects that implement the IVsSolution interface containing the word "project"
C:\> Get-ComObject -ProcessId 21356 IVsSolution | Get-ComObjectMethod *project*

When using the Get-ComObject cmdlet, there are several ways to specify the process that should be queried

  • If a -ProcessId is specified, that process will be targeted
  • Otherwise, DebugTools will attempt to search for a singular active Profiler or SOS session (in that order). In the event multiple active sessions of a given type are found, an error will be thrown and the implicit session search will not continue.

Project Overview

User Guide

Clone this wiki locally