// 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); } }
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)); }
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); }