Added Wine detection support

This commit is contained in:
Michael J. Seiferling
2016-03-03 13:05:50 -06:00
parent d46360b244
commit feb8a9d0b2
4 changed files with 67 additions and 21 deletions
+1 -8
View File
@@ -83,7 +83,7 @@ Public Class frmAddWizard
Dim sName As String = txtName.Text Dim sName As String = txtName.Text
Dim sProcessFullPath As String = txtProcessPath.Text Dim sProcessFullPath As String = txtProcessPath.Text
Dim sProcessPath As String = Path.GetDirectoryName(sProcessFullPath) Dim sProcessPath As String = Path.GetDirectoryName(sProcessFullPath)
Dim sProcess As String Dim sProcess As String = Path.GetFileNameWithoutExtension(sProcessFullPath)
Dim sProcessSummaryText As String = Path.GetFileName(sProcessFullPath) & " (" & sProcessPath & ")" Dim sProcessSummaryText As String = Path.GetFileName(sProcessFullPath) & " (" & sProcessPath & ")"
Dim sSavePath As String = txtSavePath.Text Dim sSavePath As String = txtSavePath.Text
Dim bIsAbsolute As Boolean = mgrPath.IsAbsolute(sSavePath) Dim bIsAbsolute As Boolean = mgrPath.IsAbsolute(sSavePath)
@@ -100,13 +100,6 @@ Public Class frmAddWizard
sSavePath = mgrPath.DetermineRelativePath(sProcessPath, sSavePath) sSavePath = mgrPath.DetermineRelativePath(sProcessPath, sSavePath)
End If End If
'Unix Handler
If mgrCommon.IsUnix Then
sProcess = Path.GetFileName(sProcessFullPath)
Else
sProcess = Path.GetFileNameWithoutExtension(sProcessFullPath)
End If
'Build Summary Listview 'Build Summary Listview
lstSummary.Clear() lstSummary.Clear()
lstSummary.Columns.Add("Item") lstSummary.Columns.Add("Item")
+1 -1
View File
@@ -942,7 +942,7 @@ Public Class frmGameManager
oApp.ID = txtID.Text oApp.ID = txtID.Text
End If End If
oApp.Name = mgrPath.ValidateForFileSystem(txtName.Text) oApp.Name = mgrPath.ValidateForFileSystem(txtName.Text)
If Path.HasExtension(txtProcess.Text) And Not mgrCommon.IsUnix Then If Path.HasExtension(txtProcess.Text) Then
If txtProcess.Text.ToLower.EndsWith(".exe") Then If txtProcess.Text.ToLower.EndsWith(".exe") Then
oApp.ProcessName = Path.GetFileNameWithoutExtension(txtProcess.Text) oApp.ProcessName = Path.GetFileNameWithoutExtension(txtProcess.Text)
Else Else
+9 -9
View File
@@ -563,8 +563,8 @@ Public Class frmMain
sMainCommand = sFullCommand.Split(cDelimters, 2)(0) sMainCommand = sFullCommand.Split(cDelimters, 2)(0)
'Parse Command 'Parse Command
Select Case sMainCommand Select Case sMainCommand.ToLower
Case "SQL" Case "sql"
'Run a SQL command directly on any database 'Run a SQL command directly on any database
'Usage: SQL {Local or Remote} SQL Command 'Usage: SQL {Local or Remote} SQL Command
@@ -579,9 +579,9 @@ Public Class frmMain
Exit Select Exit Select
End If End If
If sCommand(1) = "Local" Then If sCommand(1).ToLower = "local" Then
oDatabase = New mgrSQLite(mgrSQLite.Database.Local) oDatabase = New mgrSQLite(mgrSQLite.Database.Local)
ElseIf sCommand(1) = "Remote" Then ElseIf sCommand(1).ToLower = "remote" Then
oDatabase = New mgrSQLite(mgrSQLite.Database.Remote) oDatabase = New mgrSQLite(mgrSQLite.Database.Remote)
Else Else
mgrCommon.ShowMessage(frmMain_ErrorCommandBadParam, New String() {sCommand(1), sCommand(0)}, MsgBoxStyle.Exclamation) mgrCommon.ShowMessage(frmMain_ErrorCommandBadParam, New String() {sCommand(1), sCommand(0)}, MsgBoxStyle.Exclamation)
@@ -596,7 +596,7 @@ Public Class frmMain
mgrCommon.ShowMessage(frmMain_CommandFail, MsgBoxStyle.Exclamation) mgrCommon.ShowMessage(frmMain_CommandFail, MsgBoxStyle.Exclamation)
End If End If
Case "DEBUG" Case "debug"
'Enable or disable various debug modes 'Enable or disable various debug modes
'Usage: DEBUG Mode {Enable or Disable} 'Usage: DEBUG Mode {Enable or Disable}
@@ -610,17 +610,17 @@ Public Class frmMain
Exit Select Exit Select
End If End If
If sCommand(2) = "Enable" Then If sCommand(2).ToLower = "enable" Then
bDebugEnable = True bDebugEnable = True
ElseIf sCommand(2) = "Disable" Then ElseIf sCommand(2).ToLower = "disable" Then
bDebugEnable = False bDebugEnable = False
Else Else
mgrCommon.ShowMessage(frmMain_ErrorCommandBadParam, New String() {sCommand(1), sCommand(0)}, MsgBoxStyle.Exclamation) mgrCommon.ShowMessage(frmMain_ErrorCommandBadParam, New String() {sCommand(1), sCommand(0)}, MsgBoxStyle.Exclamation)
Exit Select Exit Select
End If End If
Select Case sCommand(1) Select Case sCommand(1).ToLower
Case "Process" Case "process"
bProcessDebugMode = bDebugEnable bProcessDebugMode = bDebugEnable
mgrCommon.ShowMessage(frmMain_CommandSucess, MsgBoxStyle.Exclamation) mgrCommon.ShowMessage(frmMain_CommandSucess, MsgBoxStyle.Exclamation)
End Select End Select
+55 -2
View File
@@ -85,17 +85,66 @@ Public Class mgrProcesses
Next Next
End Sub End Sub
'This function will only works correctly on Unix
Private Function GetUnixProcessArguments(ByVal prs As Process) As String()
Dim sArguments As String
Try
sArguments = File.ReadAllText("/proc/" & prs.Id.ToString() & "/cmdline")
Return sArguments.Split(vbNullChar)
Catch ex As Exception
Return New String() {String.Empty}
End Try
End Function
'This function will only works correctly on Unix
Private Function GetUnixProcessWorkingDirectory(ByVal prs As Process) As String
Dim prsls As Process
Dim slsinfo As String()
'This is the best way I can think of to determine the end point of a symlink without doing even more crazy shit
Try
prsls = New Process
prsls.StartInfo.FileName = "/bin/bash"
prsls.StartInfo.Arguments = "-c ""ls -l /proc/" & prs.Id.ToString & " | grep cwd"""
prsls.StartInfo.UseShellExecute = False
prsls.StartInfo.RedirectStandardOutput = True
prsls.StartInfo.CreateNoWindow = True
prsls.Start()
slsinfo = prsls.StandardOutput.ReadToEnd().Split(" ")
Return slsinfo(slsinfo.Length - 1).TrimEnd
Catch ex As Exception
Return String.Empty
End Try
End Function
Public Function SearchRunningProcesses(ByVal hshScanList As Hashtable, ByRef bNeedsPath As Boolean, ByRef iErrorCode As Integer, ByVal bDebugMode As Boolean) As Boolean Public Function SearchRunningProcesses(ByVal hshScanList As Hashtable, ByRef bNeedsPath As Boolean, ByRef iErrorCode As Integer, ByVal bDebugMode As Boolean) As Boolean
Dim prsList() As Process = Process.GetProcesses Dim prsList() As Process = Process.GetProcesses
Dim sProcessCheck As String = String.Empty Dim sProcessCheck As String = String.Empty
Dim sProcessList As String = String.Empty Dim sProcessList As String = String.Empty
Dim bWineProcess As Boolean = False
For Each prsCurrent As Process In prsList For Each prsCurrent As Process In prsList
'This needs to be wrapped due to issues with Mono. 'This needs to be wrapped due to issues with Mono.
Try Try
sProcessCheck = prsCurrent.ProcessName sProcessCheck = prsCurrent.ProcessName
If bDebugMode Then sProcessList &= sProcessCheck & vbCrLf
'Unix Handler
'We need some special handling for Wine processes
If mgrCommon.IsUnix And sProcessCheck.ToLower = "wine-preloader" Then
Dim sWinePath As String()
'We can't use Path.GetFileName here, Wine uses the Windows seperator in arguments and the Unix version of the function expects a different one.
sWinePath = GetUnixProcessArguments(prsCurrent)(0).Split("\")
sProcessCheck = sWinePath(sWinePath.Length - 1).Replace(".exe", "")
bWineProcess = True
Else
bWineProcess = False
End If
If bDebugMode And mgrCommon.IsUnix Then
sProcessList &= prsCurrent.Id & " " & prsCurrent.ProcessName & " " & GetUnixProcessArguments(prsCurrent)(0) & vbCrLf
ElseIf bDebugMode Then
sProcessList &= prsCurrent.Id & " " & prsCurrent.ProcessName & vbCrLf
End If
Catch ex As Exception Catch ex As Exception
'Do Nothing 'Do Nothing
End Try End Try
@@ -113,7 +162,11 @@ Public Class mgrProcesses
If Not oGame.AbsolutePath Or oGame.Duplicate Then If Not oGame.AbsolutePath Or oGame.Duplicate Then
Try Try
If Not bWineProcess Then
oGame.ProcessPath = Path.GetDirectoryName(prsCurrent.MainModule.FileName) oGame.ProcessPath = Path.GetDirectoryName(prsCurrent.MainModule.FileName)
Else
oGame.ProcessPath = GetUnixProcessWorkingDirectory(prsCurrent)
End If
Catch exWin32 As System.ComponentModel.Win32Exception Catch exWin32 As System.ComponentModel.Win32Exception
'If an exception occurs the process is: 'If an exception occurs the process is:
'Running as administrator and the app isn't. 'Running as administrator and the app isn't.