public static void ProcessRDTDocuments(RDTDocumentsDelegate processAction)
        {
            var runningDocumentTable = (IVsRunningDocumentTable)GetService(typeof(SVsRunningDocumentTable));
            IEnumRunningDocuments ppenum;

            runningDocumentTable.GetRunningDocumentsEnum(out ppenum);
            var  rgelt = new uint[10];
            uint pceltFetched;

            while (HResult.Succeeded(ppenum.Next((uint)rgelt.Length, rgelt, out pceltFetched)) && pceltFetched > 0U)
            {
                for (var index = 0; (long)index < (long)pceltFetched; ++index)
                {
                    uint         pgrfRDTFlags;
                    uint         pdwReadLocks;
                    uint         pdwEditLocks;
                    string       pbstrMkDocument;
                    IVsHierarchy ppHier;
                    uint         pitemid;
                    IntPtr       ppunkDocData;
                    var          documentInfo = runningDocumentTable.GetDocumentInfo(rgelt[index], out pgrfRDTFlags, out pdwReadLocks,
                                                                                     out pdwEditLocks, out pbstrMkDocument, out ppHier, out pitemid, out ppunkDocData);
                    try
                    {
                        if (HResult.Succeeded(documentInfo))
                        {
                            if (!(ppunkDocData == IntPtr.Zero))
                            {
                                processAction(pgrfRDTFlags, pdwReadLocks, pdwEditLocks, pbstrMkDocument, ppHier, pitemid, ppunkDocData);
                            }
                        }
                    }
                    finally
                    {
                        TFCommonUtil.SafeRelease(ppunkDocData);
                    }
                }
            }
        }
        public static IVsHierarchy GetNestedHierarchy(IVsHierarchy hierarchy, uint itemId, out uint nestedItemId)
        {
            var    iidHierarchyNested = IID_IVsHierarchy;
            IntPtr ppHierarchyNested;
            var    nestedHierarchy = hierarchy.GetNestedHierarchy(itemId, ref iidHierarchyNested, out ppHierarchyNested,
                                                                  out nestedItemId);
            IVsHierarchy vsHierarchy = null;

            try
            {
                if (HResult.Succeeded(nestedHierarchy))
                {
                    if (ppHierarchyNested != IntPtr.Zero)
                    {
                        vsHierarchy = (IVsHierarchy)Marshal.GetObjectForIUnknown(ppHierarchyNested);
                    }
                }
            }
            finally
            {
                TFCommonUtil.SafeRelease(ppHierarchyNested);
            }
            return(vsHierarchy);
        }