Imports DigitalData.Modules.Base Imports DigitalData.Modules.Logging Imports DigitalData.Modules.Base.ECM Imports Microsoft.Win32 Public Class ClassModules Inherits BaseClass Private Const PM_REGNODE = "Process Manager" Private Const PM_EXENAME = "DD_ProcessManager.exe" Private Const CW_REGNODE = "Clipboard Watcher" Private Const CW_EXENAME = "DD_Clipboard_Watcher.exe" Private Const GLOBIX_REGNODE = "Global Indexer" Private Const GLOBIX_EXENAME = "Global_Indexer.exe" Private Const REGNODE_MANUFACTURER = "Digital Data" Private Const REGPATH_BASE = "SOFTWARE\\WOW6432Node" Private Config As ClassConfig Public Sub New(pLogConfig As LogConfig, pConfig As ClassConfig) MyBase.New(pLogConfig) Config = pConfig End Sub Public Function GetProductProgramPath(pProduct As Product) As String Dim oApplicationName As String = Nothing Dim oPath = GetProductPath(pProduct) If oPath Is Nothing Then Return Nothing End If Select Case pProduct Case Product.GlobalIndexer oApplicationName = PM_EXENAME Case Product.ClipboardWatcher oApplicationName = CW_EXENAME Case Product.ProcessManager oApplicationName = GLOBIX_EXENAME End Select If oApplicationName Is Nothing Then Return Nothing End If Return IO.Path.Combine(oPath, oApplicationName) End Function Public Function GetProductPath(pProduct As Product) As String Select Case pProduct Case Product.ProcessManager Return GetProductPathFor(pProduct, PM_REGNODE) Case Product.GlobalIndexer Return GetProductPathFor(pProduct, GLOBIX_REGNODE) Case Product.ClipboardWatcher Return GetProductPathFor(pProduct, CW_REGNODE) Case Else Return Nothing End Select End Function Private Function GetProductPathFor(pProduct As Product, pSubKey As String) As String Dim oPathFromRegistry = GetProductPathFromRegistryFor(pSubKey) If oPathFromRegistry IsNot Nothing Then Return pSubKey Else Return GetProductPathFromConfig(pProduct) End If End Function Private Function GetProductPathFromConfig(pProduct As Product) Select Case pProduct Case Product.ProcessManager Return Config.ProductPaths.ProcessManagerPath Case Product.GlobalIndexer Return Config.ProductPaths.GlobalIndexerPath Case Product.ClipboardWatcher Return Config.ProductPaths.ClipboardWatcherPath Case Else Return Nothing End Select End Function Private Function GetProductPathFromRegistryFor(pSubKey As String) As String Try Dim oPathParts As New List(Of String) From {REGPATH_BASE, REGNODE_MANUFACTURER, pSubKey} Dim oRegistryPath = String.Join("\\", oPathParts) Dim oRoot = Registry.LocalMachine Dim oProduct = oRoot.OpenSubKey(oRegistryPath, RegistryKeyPermissionCheck.ReadSubTree) If oProduct Is Nothing Then Return Nothing End If Return oProduct.GetValue("Path") Catch ex As Exception Logger.Warn("Could not read [Process Manager] path from registry!") Logger.Error(ex) Return Nothing End Try End Function End Class