예제 #1
0
        public static void SaveVsComObjects(this SdkInterfaceLibraryEntities entities, Process process, object obj, string serviceName, string packageName, string typeName)
        {
            var type = obj.GetType();
            var pUnk = Marshal.GetIUnknownForObject(obj);

            foreach (var assemblyRef in Assembly.GetExecutingAssembly().GetReferencedAssemblies())
            {
                if (assemblyRef.Name.StartsWith("Microsoft.VisualStudio.", "EnvDTE"))
                {
                    var assembly = Assembly.Load(assemblyRef);

                    foreach (var refType in assembly.GetTypes().Where(t => t.IsInterface && t.HasCustomAttribute <GuidAttribute>()))
                    {
                        if (type.Implements(refType))
                        {
                            var interfaceId = entities.GetInterfaceId(refType);

                            if (serviceName != null)
                            {
                                var tblService = entities.SaveIfNotExists <tblService>(s => s.ServiceName == serviceName, () =>
                                {
                                    return(new tblService
                                    {
                                        ServiceId = Guid.NewGuid(),
                                        ServiceName = serviceName,
                                        ComponentId = entities.CreateComponent(type, Guid.Empty, process, obj).ComponentId
                                    });
                                });
                            }
                            else if (packageName != null)
                            {
                                Debugger.Break();
                            }
                        }
                        else
                        {
                            foreach (var guidAttr in refType.GetCustomAttributes <GuidAttribute>())
                            {
                                var    guid = Guid.Parse(guidAttr.Value);
                                IntPtr ppv;

                                if (Marshal.QueryInterface(pUnk, ref guid, out ppv) == VSConstants.S_OK)
                                {
                                    var tblService = entities.SaveIfNotExists <tblService>(s => s.ServiceName == serviceName, () =>
                                    {
                                        return(new tblService
                                        {
                                            ServiceId = Guid.NewGuid(),
                                            ServiceName = serviceName,
                                            ComponentId = entities.CreateComponent(type, Guid.Empty, process, obj).ComponentId
                                        });
                                    });
                                }
                            }
                        }
                    }
                }
            }
        }
예제 #2
0
        public static void SaveVsComPackages(this SdkInterfaceLibraryEntities entities, Process process, IEnumerable <KeyValuePair <Guid, object> > objects)
        {
            foreach (var pair in objects)
            {
                var obj     = pair.Value;
                var pUnk    = Marshal.GetIUnknownForObject(pair.Value);
                var service = GetServiceFromGuid(pair.Key);

                entities.SaveVsComObjects(process, obj, service, string.Empty, string.Empty);
            }
        }
예제 #3
0
        private static Guid GetInterfaceId(this SdkInterfaceLibraryEntities entities, Type refType)
        {
            var guidAttribute = refType.GetCustomAttribute <GuidAttribute>();
            var guid          = Guid.Parse(guidAttribute.Value);
            var tblInterface  = entities.SaveIfNotExists <tblInterface>(i => i.InterfaceGuid == guid, () =>
            {
                return(new tblInterface
                {
                    InterfaceId = Guid.NewGuid(),
                    InterfaceGuid = guid,
                    InterfaceName = refType.FullName,
                });
            });

            return(tblInterface.InterfaceId);
        }
예제 #4
0
        public static void SaveTypes(this SdkInterfaceLibraryEntities entities, Process process)
        {
            var executingAssembly = Assembly.GetExecutingAssembly();
            var allTypes          = executingAssembly.GetReferencedAssemblies().Where(r => r.Name.StartsWith("Microsoft.VisualStudio.", "EnvDTE.")).SelectMany(r =>
            {
                try
                {
                    var assembly = Assembly.Load(r);
                    return(assembly.GetTypes());
                }
                catch
                {
                    return(new Type[0]);
                }
            });

            foreach (var assemblyRef in executingAssembly.GetReferencedAssemblies())
            {
                if (assemblyRef.Name.StartsWith("Microsoft.VisualStudio.", "EnvDTE."))
                {
                    var assembly = Assembly.Load(assemblyRef);

                    foreach (var refType in assembly.GetTypes().Where(t => t.IsInterface && t.HasCustomAttribute <GuidAttribute>()))
                    {
                        foreach (var type in allTypes)
                        {
                            var assemblyName = string.Empty;
                            var dllName      = string.Empty;

                            if (type.Name == "__ComObject")
                            {
                                var typeAssembly = type.Assembly;

                                assemblyName = typeAssembly.GetNameParts().AssemblyName;
                                dllName      = typeAssembly.CodeBase;
                            }

                            if (type.Implements(refType))
                            {
                                //writer.SaveLineFormat("{0},{1},{2},{3},{4},{5}", dllName, assemblyName, string.Empty, string.Empty, type, refType.FullName);
                            }
                        }
                    }
                }
            }
        }
예제 #5
0
        public static tblComponent CreateComponent(this SdkInterfaceLibraryEntities entities, Type type, Guid typeGuid, Process process, object objComponent)
        {
            var tblModule    = GetModuleObject(type, process, objComponent);
            var tblComponent = new tblComponent
            {
                ComponentId   = Guid.NewGuid(),
                ComponentType = entities.GetComponentTypeName(tblModule, type, typeGuid),
                ModuleId      = entities.SaveIfNotExists <tblModule>(m => m.ModuleFileName == tblModule.ModuleFileName, () =>
                {
                    return(tblModule);
                }).ModuleId
            };

            entities.tblComponents.AddObject(tblComponent);
            entities.SaveChanges();

            return(tblComponent);
        }
예제 #6
0
        public static void SaveAll(this SdkInterfaceLibraryEntities entities, Microsoft.VisualStudio.OLE.Interop.IServiceProvider serviceProvider, IEnumerable <KeyValuePair <Guid, object> > services = null, IEnumerable <KeyValuePair <Guid, object> > packages = null)
        {
            var process = Process.GetCurrentProcess();

            entities.TruncateAll();

            if (services != null)
            {
                entities.SaveVsComServices(process, services);
            }

            if (packages != null)
            {
                entities.SaveVsComPackages(process, packages);
            }

            entities.SaveServices(process, serviceProvider);
            entities.SaveTypes(process);

            entities.SaveChanges();
        }
예제 #7
0
        public static string GetComponentTypeName(this SdkInterfaceLibraryEntities entities, tblModule tblModule, Type type, Guid typeGuid)
        {
            if (tblModule.IsClrModule)
            {
                return(type.FullName);
            }
            else
            {
                var imageFile = tblModule.ModuleFileName;

                SetStatus("Searching for component type name for {0}", type.Name);

                if (tblModule.tblModuleSymbols.Count == 0)
                {
                    SetStatus("Building symbol table for {0}. This may take several minutes.", tblModule.ModuleName);

                    entities.BuildModuleSymbolsTable(tblModule);
                }

                throw new NotImplementedException();
            }
        }
예제 #8
0
        public static void SaveServices(this SdkInterfaceLibraryEntities entities, Process process, Microsoft.VisualStudio.OLE.Interop.IServiceProvider serviceProvider)
        {
            var executingAssembly = Assembly.GetExecutingAssembly();

            foreach (var assemblyRef in executingAssembly.GetReferencedAssemblies())
            {
                if (assemblyRef.Name.StartsWith("Microsoft.VisualStudio.", "EnvDTE."))
                {
                    var assembly = Assembly.Load(assemblyRef);

                    foreach (var refType in assembly.GetTypes().Where(t => t.IsInterface && t.HasCustomAttribute <GuidAttribute>()))
                    {
                        var    attr         = refType.GetCustomAttribute <GuidAttribute>();
                        var    guid         = Guid.Parse(attr.Value);
                        var    IID_IUnknown = new Guid("00000000-0000-0000-C000-000000000046");
                        IntPtr pUnk;

                        if (ErrorHandler.Succeeded(serviceProvider.QueryService(ref guid, ref IID_IUnknown, out pUnk)))
                        {
                            var serviceName = GetServiceFromGuid(guid);
                            var obj         = Marshal.GetObjectForIUnknown(pUnk);
                            var tblService  = entities.SaveIfNotExists <tblService>(s => s.ServiceName == serviceName, () =>
                            {
                                return(new tblService
                                {
                                    ServiceId = Guid.NewGuid(),
                                    ServiceName = serviceName,
                                    ComponentId = entities.CreateComponent(refType, Guid.Empty, process, obj).ComponentId
                                });
                            });

                            entities.SaveVsComObjects(process, obj, serviceName, string.Empty, string.Empty);
                        }
                    }
                }
            }
        }
예제 #9
0
        public SDKSymbolResolver()
        {
            var vcDirectory           = new DirectoryInfo(VSEnvironment.ExpandEnvironmentVariables("$(VCInstallDir)"));
            var crtDirectory          = new DirectoryInfo(VSEnvironment.ExpandEnvironmentVariables(@"$(VCInstallDir)crt\src"));
            var windowsSdkDirectory   = new DirectoryInfo(VSEnvironment.ExpandEnvironmentVariables("$(WindowsSdkDir)"));
            var atlmfcDirectory       = new DirectoryInfo(VSEnvironment.ExpandEnvironmentVariables(@"$(VCInstallDir)atlmfc"));
            var frameworkSdkDirectory = new DirectoryInfo(VSEnvironment.ExpandEnvironmentVariables(@"$(FrameworkSDKDir)"));
            var connectionString      = SDKLibraryConnection.ConnectionString;

            logFile = new FileInfo(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "SDKSymbolResolver.log"));

            if (logFile.Exists)
            {
                logFile.Delete();
            }

            versionRegex = new Regex(@"v?(?<version>\d+?\.\d+?\w*)");

            lockObject    = LockManager.CreateObject();
            searchManager = new SearchManager();
            searchManager.AddCatalog("MSVCInclude");

            entities          = new SdkInterfaceLibraryEntities(connectionString);
            tblSDKHeaderFiles = entities.tblSDKHeaderFiles;
            tblVendorSDKs     = entities.tblVendorSDKs;

            HeaderEntityExtensions.Entities    = entities;
            HeaderEntityExtensions.WriteLog   += new EventHandlerT <string>(HeaderEntityExtensions_WriteLog);
            HeaderEntityExtensions.IndentLog  += new EventHandler(HeaderEntityExtensions_IndentLog);
            HeaderEntityExtensions.OutdentLog += new EventHandler(HeaderEntityExtensions_OutdentLog);

            var tblMSVendor = entities.SaveIfNotExists <tblVendor>(v => v.VendorName == "Microsoft", () =>
            {
                return(new tblVendor
                {
                    VendorId = Guid.NewGuid(),
                    VendorName = "Microsoft"
                });
            });

            if (crtDirectory.Exists)
            {
                var version = string.Empty;

                if (versionRegex.IsMatch(crtDirectory.FullName))
                {
                    var match = versionRegex.Match(crtDirectory.FullName);

                    version = match.Groups["version"].Value;
                }

                var tblMSVendorSdk = entities.SaveIfNotExists <tblVendorSDK>(s => s.SdkName == "C Runtime Language" && s.SdkVersion == version, () =>
                {
                    return(new tblVendorSDK
                    {
                        VendorSdkId = Guid.NewGuid(),
                        VendorId = tblMSVendor.VendorId,
                        SdkName = "C Runtime Language",
                        SdkVersion = version,
                        SdkRootFolder = crtDirectory.FullName,
                        IncludeFolders = string.Empty,
                        SourceFolders = string.Empty,
                        LibraryFolders = string.Empty,
                        ExecutableFolders = string.Empty,
                    });
                });
            }

            if (vcDirectory.Exists)
            {
                var version = string.Empty;

                if (versionRegex.IsMatch(vcDirectory.FullName))
                {
                    var match = versionRegex.Match(vcDirectory.FullName);

                    version = match.Groups["version"].Value;
                }

                var tblMSVendorSdk = entities.SaveIfNotExists <tblVendorSDK>(s => s.SdkName == "Visual C++" && s.SdkVersion == version, () =>
                {
                    return(new tblVendorSDK
                    {
                        VendorSdkId = Guid.NewGuid(),
                        VendorId = tblMSVendor.VendorId,
                        SdkName = "Visual C++",
                        SdkVersion = version,
                        SdkRootFolder = vcDirectory.FullName,
                        IncludeFolders = "include",
                        SourceFolders = "src",
                        LibraryFolders = "lib",
                        ExecutableFolders = "bin",
                    });
                });
            }

            if (windowsSdkDirectory.Exists)
            {
                var version = string.Empty;

                if (versionRegex.IsMatch(vcDirectory.FullName))
                {
                    var match = versionRegex.Match(windowsSdkDirectory.FullName);

                    version = match.Groups["version"].Value;
                }

                var tblMSVendorSdk = entities.SaveIfNotExists <tblVendorSDK>(s => s.SdkName == "Windows SDK" && s.SdkVersion == version, () =>
                {
                    return(new tblVendorSDK
                    {
                        VendorSdkId = Guid.NewGuid(),
                        VendorId = tblMSVendor.VendorId,
                        SdkName = "Windows SDK",
                        SdkVersion = version,
                        SdkRootFolder = windowsSdkDirectory.FullName,
                        IncludeFolders = "include",
                        SourceFolders = "src",
                        LibraryFolders = "lib",
                        ExecutableFolders = "bin"
                    });
                });
            }

            if (atlmfcDirectory.Exists)
            {
                var version = string.Empty;

                if (versionRegex.IsMatch(vcDirectory.FullName))
                {
                    var match = versionRegex.Match(atlmfcDirectory.FullName);

                    version = match.Groups["version"].Value;
                }

                var tblMSVendorSdk = entities.SaveIfNotExists <tblVendorSDK>(s => s.SdkName == "ATL MFC" && s.SdkVersion == version, () =>
                {
                    return(new tblVendorSDK
                    {
                        VendorSdkId = Guid.NewGuid(),
                        VendorId = tblMSVendor.VendorId,
                        SdkName = "ATL MFC",
                        SdkVersion = version,
                        SdkRootFolder = atlmfcDirectory.FullName,
                        IncludeFolders = "include",
                        SourceFolders = "src",
                        LibraryFolders = "lib",
                        ExecutableFolders = "bin"
                    });
                });
            }

            if (frameworkSdkDirectory.Exists)
            {
                var version = string.Empty;

                if (versionRegex.IsMatch(vcDirectory.FullName))
                {
                    var match = versionRegex.Match(frameworkSdkDirectory.FullName);

                    version = match.Groups["version"].Value;
                }

                var tblMSVendorSdk = entities.SaveIfNotExists <tblVendorSDK>(s => s.SdkName == "Framework SDK" && s.SdkVersion == version, () =>
                {
                    return(new tblVendorSDK
                    {
                        VendorSdkId = Guid.NewGuid(),
                        VendorId = tblMSVendor.VendorId,
                        SdkName = "Framework SDK",
                        SdkVersion = version,
                        SdkRootFolder = frameworkSdkDirectory.FullName,
                        IncludeFolders = "include",
                        SourceFolders = "src",
                        LibraryFolders = "lib",
                        ExecutableFolders = "bin"
                    });
                });
            }

            serializedEventArgs = new List <EventArgsXml>();
            includeDirectories  = new Dictionary <tblVendorSDK, DirectoryInfo>();
            libraryDirectories  = new Dictionary <tblVendorSDK, DirectoryInfo>();
            tblVendorSDKs       = entities.tblVendorSDKs;

            foreach (var tblVendorSdk in tblVendorSDKs)
            {
                AddIncludes(tblVendorSdk);
            }

            this.OnParserDiagnostic += new Utils.EventHandlerT <CppSharp.Parser.ParserDiagnostic>(symbolResolver_OnParserDiagnostic);
            this.OnParserProgress   += new ParserProgressEventHandler(symbolResolver_OnParserProgress);
        }
예제 #10
0
        private static void BuildModuleSymbolsTable(this SdkInterfaceLibraryEntities entities, tblModule tblModule)
        {
            var     cvdump    = @"C:\Projects\MC\RazorViewsDesigner\Microsoft.Pdb\cvdump\cvdump.exe";
            var     startInfo = new ProcessStartInfo(cvdump, string.Format("-p \"{0}\"", tblModule.ModuleFileName));
            var     output    = string.Empty;
            var     error     = string.Empty;
            int     exitCode;
            Process process;

            startInfo.CreateNoWindow         = false;
            startInfo.UseShellExecute        = false;
            startInfo.RedirectStandardOutput = true;
            startInfo.RedirectStandardError  = true;

            process = new Process();

            process.EnableRaisingEvents = true;
            process.StartInfo           = startInfo;

            process.OutputDataReceived += (s, e) =>
            {
                output += e.Data + "\r\n";
            };

            process.ErrorDataReceived += (s, e) =>
            {
                error += e.Data + "\r\n";
            };

            process.Start();

            process.BeginOutputReadLine();
            process.BeginErrorReadLine();

            process.WaitForExit();

            exitCode = process.ExitCode;

            //exitCode = 0;
            //output = File.ReadAllText(@"C:\Projects\MC\RazorViewsDesigner\Net2Html5Package\InterfaceLibrary\cvdump.txt");
            //error = string.Empty;

            if (error.Trim().IsNullOrEmpty())
            {
                var pattern = @"^S_PUB32: \[(?<segment>[\da-zA-Z]*?):(?<offset>[\da-zA-Z]*?)\], Flags: (?<flags>[\da-zA-Z]*?), (?<symbol>.*$)$";
                var regex   = new Regex(pattern);
                var lines   = output.Split('\n', StringSplitOptions.RemoveEmptyEntries);

                foreach (var readLine in lines)
                {
                    var line = readLine.Trim();

                    if (regex.IsMatch(line))
                    {
                        var match            = regex.Match(line.Trim());
                        var segment          = match.Groups["segment"].Value;
                        var offset           = match.Groups["offset"].Value;
                        var flags            = match.Groups["flags"].Value;
                        var symbol           = match.Groups["symbol"].Value;
                        var tblModuleSymbols = entities.tblModuleSymbols;
                        var tblModuleSymbol  = new tblModuleSymbol
                        {
                            ModuleSymbolId    = Guid.NewGuid(),
                            ModuleId          = tblModule.ModuleId,
                            Segment           = segment,
                            Offset            = offset,
                            Flags             = flags,
                            DecoratedSymbol   = symbol,
                            UndecoratedSymbol = UndecorateSymbol(symbol)
                        };

                        tblModuleSymbols.AddObject(tblModuleSymbol);
                        entities.SaveChanges();
                    }
                }
            }
            else
            {
                SetStatus("Errors from cvdump: \r\n\r\n{0}", error);
            }

            SetStatus("Exit code from cvdump: {0}", exitCode);
        }