-
Notifications
You must be signed in to change notification settings - Fork 12
Expand file tree
/
Copy pathProcessHelper.bas
More file actions
128 lines (82 loc) · 2.82 KB
/
ProcessHelper.bas
File metadata and controls
128 lines (82 loc) · 2.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
Attribute VB_Name = "ProcessHelper"
'--------------------------------------------------------------------------------
' Component : ProcessHelper
' Project : ViDock
'
' Description: Contains functions to help manipulate processes in the OS
'
'--------------------------------------------------------------------------------
Option Explicit
Public Function GetProcessID(hWnd As Long) As Long
Dim Id As Long
GetWindowThreadProcessId hWnd, Id
GetProcessID = Id
End Function
Function GetProcessPath(pId As Long)
Dim lReturn As Long
Dim szFileName As String
Dim Buffer(2048) As Byte
Dim dwLength As Long
lReturn = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, pId)
If lReturn = 0 Then
Debug.Print "Failed to open process: " & pId
Exit Function
End If
dwLength = GetModuleFileNameExW(lReturn, 0, VarPtr(Buffer(0)), UBound(Buffer))
If dwLength = 0 Then
dwLength = GetProcessImageFileName(lReturn, VarPtr(Buffer(0)), UBound(Buffer))
szFileName = Left$(Buffer, dwLength)
szFileName = g_DeviceCollection.ConvertToLetterPath(szFileName)
If dwLength = 0 Then
CloseHandle lReturn
Exit Function
End If
Else
szFileName = Left$(Buffer, dwLength)
End If
If Is64bit Then
If InStr(szFileName, "SysWOW64") > 0 Then
szFileName = Replace(szFileName, "SysWOW64", "System32")
End If
End If
GetProcessPath = szFileName
CloseHandle lReturn
End Function
Public Function Is64bit() As Boolean
Dim DirPath As String * 255
Dim result As Long
result = GetSystemWow64Directory(DirPath, 255)
If result > 0 Then
Is64bit = True
End If
End Function
Public Function IsPIDValid(ByVal pId As Long) As Long
Debug.Print "IsPIDValid():PID:: " & IsPIDValid
Dim hProcess As Long
Dim dwRetval As Long
If (pId = 0) Then
IsPIDValid = 1: Exit Function
End If
If (pId < 0) Then
IsPIDValid = 0: Exit Function
End If
hProcess = OpenProcess(PROCESS_ALL_ACCESS, False, pId)
If (hProcess = pNull) Then
'invalid parameter means PID isn't in the system
If (WinBase.GetLastError() = ERROR_INVALID_PARAMETER) Then
IsPIDValid = 0: Exit Function
End If
'some other error
IsPIDValid = -1
End If
dwRetval = WaitForSingleObject(hProcess, 0)
Call CloseHandle(hProcess) 'otherwise you'll be losing handles
Select Case dwRetval
Case WAIT_OBJECT_0:
IsPIDValid = 0: Exit Function
Case WAIT_TIMEOUT:
IsPIDValid = 1: Exit Function
Case Else
IsPIDValid = -1: Exit Function
End Select
End Function