// Used to get the basic info that is used by this type
        // of node
        protected override Object ProcessChild(RegistryKey key,
                                               String subKeyName)
        {
            // Eliminate the known keys and the file extensions
            if (subKeyName.StartsWith(".") ||
                subKeyName.Equals("CLSID") ||
                subKeyName.Equals("CID") ||
                subKeyName.Equals("AppId") ||
                subKeyName.Equals("Interface") ||
                subKeyName.Equals("TypeLib"))
            {
                return(null);
            }

            ComClassInfo classInfo = null;

            _sortKey = subKeyName;

            ProgIdNode node = new ProgIdNode();

            node._progId = _sortKey;

            // See if there is a CLSID for this program id
            RegistryKey clsIdKey =
                key.OpenSubKey("CLSID");

            if (clsIdKey != null)
            {
                String clsId = (String)clsIdKey.GetValue(null);
                if (clsId != null)
                {
                    RegistryKey classKey =
                        Windows.KeyCLSID.OpenSubKey(clsId);

                    if (classKey != null)
                    {
                        classInfo =
                            ComClassInfo.GetClassInfo(classKey, clsId);
                        node._info = classInfo;
                        classInfo.AddProgId(subKeyName);
                    }
                }
            }

            // Don't bother with it unless it refers to a class
            if (classInfo == null)
            {
                return(null);
            }
            return(node);
        }
        protected BrowserTreeNode FindMember(ComTypeLibTreeNode typeLibNode, ComTypeTreeNode typeTreeNode, MemberInfo mi)
        {
            // If we have a class, we need to look at all of
            // its implemented interfaces
            if (typeTreeNode.MemberInfo is ComClassInfo)
            {
                BrowserTreeNode resultNode = null;

                ComClassInfo classInfo = (ComClassInfo)typeTreeNode.MemberInfo;
                foreach (BasicInfo iface in classInfo.Interfaces)
                {
                    BrowserTreeNode ifaceNode =
                        SearchNode(typeLibNode, iface.Name);
                    String searchName = mi.Name;
                    // See if its a member name qualified by this
                    // interface name
                    if (mi.Name.StartsWith(iface.Name))
                    {
                        searchName = mi.Name.Substring(iface.Name.Length + 1);
                        if (mi is EventInfo &&
                            searchName.StartsWith("Event_"))
                        {
                            searchName = searchName.Substring(6);
                        }
                    }
                    resultNode = SearchNode(ifaceNode, searchName);
                    if (resultNode != null)
                    {
                        return(resultNode);
                    }
                }
                throw new Exception("(bug) - cant find member " + mi);
            }
            else
            {
                return(SearchNode(typeTreeNode, mi.Name));
            }
        }
        // Gets the objects to iterate over to make the child nodes
        protected override ICollection GetChildren()
        {
            lock (_allClasses)
            {
                if (_allClasses.Count > 0)
                {
                    return(_allClasses.Values);
                }

                try
                {
                    IntPtr comObj;
                    int    result = NoGoop.Win32.ActiveX.CoCreateInstance
                                        (ref NoGoop.Win32.ActiveX.CategoriesMgrCLSID,
                                        (IntPtr)0,
                                        NoGoop.Win32.ActiveX.CLSCTX_INPROC_SERVER,
                                        ref NoGoop.Win32.ActiveX.IUnknownIID,
                                        out comObj);

                    TraceUtil.WriteLineInfo(this,
                                            "com create: 0x"
                                            + result.ToString("X")
                                            + " " + comObj);
                    if (result == 0)
                    {
                        ICatInformation catInfo = (ICatInformation)
                                                  Marshal.GetObjectForIUnknown(comObj);

                        // Get the CLSIDs associated with each category
                        Guid[] cats  = new Guid[1];
                        Guid[] cats1 = new Guid[0];
                        cats[0] = _catInfo._guid;
                        IEnumGUID enumClsIds;
                        catInfo.EnumClassesOfCategories(1,
                                                        cats,
                                                        0,
                                                        cats1,
                                                        out enumClsIds);

                        Guid clsId;
                        uint numRet;
                        while (true)
                        {
                            enumClsIds.Next(1, out clsId, out numRet);
                            if (numRet == 0)
                            {
                                break;
                            }

                            BasicInfo info = ComClassInfo.GetClassInfo(clsId);
                            if (info != null)
                            {
                                _allClasses.Add(info, info);
                            }
                        }

                        Marshal.ReleaseComObject(enumClsIds);
                        Marshal.ReleaseComObject(catInfo);
                    }
                }
                catch (Exception ex)
                {
                    TraceUtil.WriteLineIf(null, TraceLevel.Info,
                                          "Categories - failure to read: "
                                          + _catInfo._guid + " " + ex);
                }
                return(_allClasses.Values);
            }
        }
Beispiel #4
0
        public static unsafe void Query(ComClassInfo cci)
        {
            Guid classguid = cci.ClassType.GUID;

            Guid   interfguid        = cci.InterfaceType.GUID;
            Guid   classfactoryguid  = typeof(IClassFactory).GUID;
            Guid   classfactory2guid = typeof(IClassFactory2).GUID;
            object classinstance     = null;

#if false
            // create an instance via .NET built-in functionality
            // vtable might be hijacked by rpcrt4.dll
            classinstance = cci.ClassType.InvokeMember("", BindingFlags.CreateInstance, null, null, null);
#endif
#if false
            // create via ole-convenience-function
            // vtable might be hijacked by rpcrt4.dll
            OLE32.CoCreateInstance(ref classguid, null, 1 + 4, ref interfguid, out classinstance);
#endif
#if false
            // create via ole-functions
            // vtable might be hijacked by rpcrt4.dll
            try
            {
                if (classinstance == null)
                {
                    object classfactoryO;
                    OLE32.CoGetClassObject(ref classguid, 1 + 4, 0, ref classfactoryguid, out classfactoryO);
                    IClassFactory classfactory = (IClassFactory)classfactoryO;
                    classfactory.CreateInstance(null, ref interfguid, out classinstance);
                    Marshal.FinalReleaseComObject(classfactory);
                }
            }
            catch { }
            try
            {
                if (classinstance == null)
                {
                    object classfactoryO;
                    OLE32.CoGetClassObject(ref classguid, 1 + 4, 0, ref classfactoryguid, out classfactoryO);
                    IClassFactory2 classfactory = (IClassFactory2)classfactoryO;
                    classinstance = classfactory.CreateInstance(null, interfguid);
                    Marshal.FinalReleaseComObject(classfactory);
                }
            }
            catch { }
            if (classinstance == null)
            {
                // Error...
            }
#endif
#if true
            // create via raw dll functions
            // no chance for other people to hijack the vtable
            try
            {
                do
                {
                    RegistryKey rk = Registry.ClassesRoot.OpenSubKey("CLSID\\{" + classguid + "}\\InprocServer32");
                    if (rk == null)
                    {
                        break;
                    }
                    string classdllname = rk.GetValue(null).ToString();
                    IntPtr libH         = KERNEL32.LoadLibrary(classdllname);
                    if (libH == IntPtr.Zero)
                    {
                        break;
                    }
                    IntPtr factoryFunc = KERNEL32.GetProcAddress(libH, "DllGetClassObject");
                    if (factoryFunc == IntPtr.Zero)
                    {
                        break;
                    }
                    var factoryDel =
                        (DllGetClassObjectDelegate)
                        Marshal.GetDelegateForFunctionPointer(factoryFunc, typeof(DllGetClassObjectDelegate));
                    object classfactoryO;
                    factoryDel(ref classguid, ref classfactoryguid, out classfactoryO);
                    if (classfactoryO == null)
                    {
                        break;
                    }
                    var classfactory = (IClassFactory)classfactoryO;
                    classfactory.CreateInstance(null, ref interfguid, out classinstance);
                    Marshal.FinalReleaseComObject(classfactory);
                } while (false);
            }
            catch
            {
            }
            try
            {
                if (classinstance == null)
                {
                    do
                    {
                        RegistryKey rk = Registry.ClassesRoot.OpenSubKey("CLSID\\{" + classguid + "}\\InprocServer32");
                        if (rk == null)
                        {
                            break;
                        }
                        string classdllname = rk.GetValue(null).ToString();
                        IntPtr libH         = KERNEL32.LoadLibrary(classdllname);
                        if (libH == IntPtr.Zero)
                        {
                            break;
                        }
                        IntPtr factoryFunc = KERNEL32.GetProcAddress(libH, "DllGetClassObject");
                        if (factoryFunc == IntPtr.Zero)
                        {
                            break;
                        }
                        var factoryDel =
                            (DllGetClassObjectDelegate)
                            Marshal.GetDelegateForFunctionPointer(factoryFunc, typeof(DllGetClassObjectDelegate));
                        object classfactoryO;
                        factoryDel(ref classguid, ref classfactory2guid, out classfactoryO);
                        if (classfactoryO == null)
                        {
                            break;
                        }
                        var classfactory = (IClassFactory2)classfactoryO;
                        classinstance = classfactory.CreateInstance(null, interfguid);
                        Marshal.FinalReleaseComObject(classfactory);
                    } while (false);
                }
            }
            catch
            {
            }
            if (classinstance == null)
            {
                // Error...
            }
#endif

            IntPtr interfaceIntPtr = Marshal.GetComInterfaceForObject(classinstance, cci.InterfaceType);
            var    interfaceRawPtr = (int ***)interfaceIntPtr.ToPointer();
            // get vtable
            int **vTable = *interfaceRawPtr;
            // get com-slot-number (vtable-index) of function X
            // get function-address from vtable
            int  mi_vto = Marshal.GetComSlotForMethodInfo(cci.Method);
            int *faddr  = vTable[mi_vto];
            cci.MFunctionPointer = new IntPtr(faddr);
            // release intptr
            Marshal.Release(interfaceIntPtr);
            Marshal.FinalReleaseComObject(classinstance);
        }
 // Used to get the basic info that is used by this type
 // of node
 protected override Object ProcessChild(RegistryKey key,
                                        String subKeyName)
 {
     return(ComClassInfo.GetClassInfo(key, subKeyName));
 }
Beispiel #6
0
        public static unsafe void Query(ComClassInfo cci)
        {
            Guid classguid = cci.ClassType.GUID;
            Guid interfguid = cci.InterfaceType.GUID;
            Guid classfactoryguid = typeof (IClassFactory).GUID;
            Guid classfactory2guid = typeof (IClassFactory2).GUID;
            object classinstance = null;

            #if false
            // create an instance via .NET built-in functionality
            // vtable might be hijacked by rpcrt4.dll
            classinstance = cci.ClassType.InvokeMember("", BindingFlags.CreateInstance, null, null, null);
            #endif
            #if false
            // create via ole-convenience-function
            // vtable might be hijacked by rpcrt4.dll
            OLE32.CoCreateInstance(ref classguid, null, 1 + 4, ref interfguid, out classinstance);
            #endif
            #if false
            // create via ole-functions
            // vtable might be hijacked by rpcrt4.dll
            try
            {
                if (classinstance == null)
                {
                    object classfactoryO;
                    OLE32.CoGetClassObject(ref classguid, 1 + 4, 0, ref classfactoryguid, out classfactoryO);
                    IClassFactory classfactory = (IClassFactory)classfactoryO;
                    classfactory.CreateInstance(null, ref interfguid, out classinstance);
                    Marshal.FinalReleaseComObject(classfactory);
                }
            }
            catch { }
            try
            {
                if (classinstance == null)
                {
                    object classfactoryO;
                    OLE32.CoGetClassObject(ref classguid, 1 + 4, 0, ref classfactoryguid, out classfactoryO);
                    IClassFactory2 classfactory = (IClassFactory2)classfactoryO;
                    classinstance = classfactory.CreateInstance(null, interfguid);
                    Marshal.FinalReleaseComObject(classfactory);
                }
            }
            catch { }
            if (classinstance == null)
            {
                // Error...
            }
            #endif
            #if true
            // create via raw dll functions
            // no chance for other people to hijack the vtable
            try
            {
                do
                {
                    RegistryKey rk = Registry.ClassesRoot.OpenSubKey("CLSID\\{" + classguid + "}\\InprocServer32");
                    if (rk == null)
                        break;
                    string classdllname = rk.GetValue(null).ToString();
                    IntPtr libH = KERNEL32.LoadLibrary(classdllname);
                    if (libH == IntPtr.Zero)
                        break;
                    IntPtr factoryFunc = KERNEL32.GetProcAddress(libH, "DllGetClassObject");
                    if (factoryFunc == IntPtr.Zero)
                        break;
                    var factoryDel =
                        (DllGetClassObjectDelegate)
                            Marshal.GetDelegateForFunctionPointer(factoryFunc, typeof (DllGetClassObjectDelegate));
                    object classfactoryO;
                    factoryDel(ref classguid, ref classfactoryguid, out classfactoryO);
                    if (classfactoryO == null)
                        break;
                    var classfactory = (IClassFactory) classfactoryO;
                    classfactory.CreateInstance(null, ref interfguid, out classinstance);
                    Marshal.FinalReleaseComObject(classfactory);
                } while (false);
            }
            catch
            {
            }
            try
            {
                if (classinstance == null)
                {
                    do
                    {
                        RegistryKey rk = Registry.ClassesRoot.OpenSubKey("CLSID\\{" + classguid + "}\\InprocServer32");
                        if (rk == null)
                            break;
                        string classdllname = rk.GetValue(null).ToString();
                        IntPtr libH = KERNEL32.LoadLibrary(classdllname);
                        if (libH == IntPtr.Zero)
                            break;
                        IntPtr factoryFunc = KERNEL32.GetProcAddress(libH, "DllGetClassObject");
                        if (factoryFunc == IntPtr.Zero)
                            break;
                        var factoryDel =
                            (DllGetClassObjectDelegate)
                                Marshal.GetDelegateForFunctionPointer(factoryFunc, typeof (DllGetClassObjectDelegate));
                        object classfactoryO;
                        factoryDel(ref classguid, ref classfactory2guid, out classfactoryO);
                        if (classfactoryO == null)
                            break;
                        var classfactory = (IClassFactory2) classfactoryO;
                        classinstance = classfactory.CreateInstance(null, interfguid);
                        Marshal.FinalReleaseComObject(classfactory);
                    } while (false);
                }
            }
            catch
            {
            }
            if (classinstance == null)
            {
                // Error...
            }
            #endif

            IntPtr interfaceIntPtr = Marshal.GetComInterfaceForObject(classinstance, cci.InterfaceType);
            var interfaceRawPtr = (int***) interfaceIntPtr.ToPointer();
            // get vtable
            int** vTable = *interfaceRawPtr;
            // get com-slot-number (vtable-index) of function X
            // get function-address from vtable
            int mi_vto = Marshal.GetComSlotForMethodInfo(cci.Method);
            int* faddr = vTable[mi_vto];
            cci.MFunctionPointer = new IntPtr(faddr);
            // release intptr
            Marshal.Release(interfaceIntPtr);
            Marshal.FinalReleaseComObject(classinstance);
        }