Trang 1 trên 1

Liệt kê Process, Ngừng và chạy lại

Đã gửi: T.Bảy 03/04/2010 7:29 am
gửi bởi truongphu
Tên: Liệt kê Process, Ngừng và chạy lại
Loại: Module
Ngôn ngữ lập trình: VB6
Tác giả: Sưu tầm
Chức năng: Liệt kê các Process đang chạy, Làm Ngừng (Suspend) và chạy lại (Resume)



  1. Public Type PROCESS
  2. ID As Long
  3. ExeFile As String
  4. End Type
  5.  
  6. Public Type THREAD
  7. ID As Long
  8. OwnerProcess As Long
  9. End Type
  10.  
  11. Private Const TH32CS_SNAPPROCESS = &H2
  12. Private Const TH32CS_SNAPTHREAD = &H4
  13.  
  14. Private Const STANDARD_RIGHTS_REQUIRED = &HF0000
  15. Private Const THREAD_SUSPEND_RESUME = &H2
  16.  
  17. Private Const MAX_PATH = 260
  18. Private Const hNull = 0
  19.  
  20. Private Type PROCESSENTRY32
  21. dwSize As Long
  22. cntUsage As Long
  23. th32ProcessID As Long
  24. th32DefaultHeapID As Long
  25. th32ModuleID As Long
  26. cntThreads As Long
  27. th32ParentProcessID As Long
  28. pcPriClassBase As Long
  29. dwFlags As Long
  30. szExeFile As String * MAX_PATH
  31. End Type
  32.  
  33. Private Type THREADENTRY32
  34. dwSize As Long
  35. cntUsage As Long
  36. th32ThreadID As Long
  37. th32OwnerProcessID As Long
  38. tpBasePri As Long
  39. tpDeltaPri As Long
  40. dwFlags As Long
  41. End Type
  42.  
  43. Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" ( _
  44. ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
  45. Private Declare Function Process32First Lib "kernel32" ( _
  46. ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long
  47. Private Declare Function Process32Next Lib "kernel32" ( _
  48. ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long
  49. Private Declare Function Thread32First Lib "kernel32" ( _
  50. ByVal hSnapshot As Long, lpte As THREADENTRY32) As Long
  51. Private Declare Function Thread32Next Lib "kernel32" ( _
  52. ByVal hSnapshot As Long, lpte As THREADENTRY32) As Long
  53. Private Declare Function OpenThread Lib "kernel32" ( _
  54. ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _
  55. ByVal dwThreadId As Long) As Long
  56. Private Declare Function CloseHandle Lib "kernel32" ( _
  57. ByVal hObject As Long) As Long
  58. Private Declare Function SuspendThread Lib "kernel32" ( _
  59. ByVal hThread As Long) As Long
  60. Private Declare Function ResumeThread Lib "kernel32" ( _
  61. ByVal hThread As Long) As Long
  62.  
  63. Public Function ListProcesses(Processes() As PROCESS) As Long
  64. Dim aExeName() As String
  65. Dim f As Long, sname As String
  66. Dim hSnap As Long, proc As PROCESSENTRY32
  67.  
  68. ReDim Processes(0)
  69. ListProcesses = 0
  70.  
  71. hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
  72. If hSnap = hNull Then Exit Function
  73. proc.dwSize = Len(proc)
  74. f = Process32First(hSnap, proc)
  75. Do While f
  76. sname = Left$(proc.szExeFile, InStr(1, proc.szExeFile, _
  77. Chr(0)) - 1)
  78. aExeName = Split(sname, "\")
  79. sname = aExeName(UBound(aExeName))
  80. ReDim Preserve Processes(UBound(Processes) + 1)
  81. Processes(UBound(Processes)).ID = proc.th32ProcessID
  82. Processes(UBound(Processes)).ExeFile = sname
  83. ListProcesses = UBound(Processes)
  84. f = Process32Next(hSnap, proc)
  85. Loop
  86. End Function
  87.  
  88. Public Function ListThreads(Threads() As THREAD) As Long
  89. Dim f As Long
  90. Dim hSnap As Long, THREAD As THREADENTRY32
  91.  
  92. ReDim Threads(0)
  93. ListThreads = 0
  94.  
  95. hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0)
  96. If hSnap = hNull Then Exit Function
  97. THREAD.dwSize = Len(THREAD)
  98. f = Thread32First(hSnap, THREAD)
  99. Do While f
  100. ReDim Preserve Threads(UBound(Threads) + 1)
  101. Threads(UBound(Threads)).ID = THREAD.th32ThreadID
  102. Threads(UBound( _
  103. Threads)).OwnerProcess = THREAD.th32OwnerProcessID
  104. ListThreads = UBound(Threads)
  105. f = Thread32Next(hSnap, THREAD)
  106. Loop
  107. End Function
  108.  
  109. Public Function VBSuspendThread(ThreadID As Long) As Long
  110. Dim hThread As Long
  111.  
  112. VBSuspendThread = -1
  113. hThread = OpenThread( _
  114. STANDARD_RIGHTS_REQUIRED Or THREAD_SUSPEND_RESUME, 0, ThreadID)
  115. If hThread <> hNull Then
  116. VBSuspendThread = SuspendThread(hThread)
  117. Call CloseHandle(hThread)
  118. End If
  119. End Function
  120.  
  121. Public Function VBResumeThread(ThreadID As Long) As Long
  122. Dim hThread As Long
  123.  
  124. VBResumeThread = -1
  125. hThread = OpenThread( _
  126. STANDARD_RIGHTS_REQUIRED Or THREAD_SUSPEND_RESUME, 0, ThreadID)
  127. If hThread <> hNull Then
  128. VBResumeThread = ResumeThread(hThread)
  129. Call CloseHandle(hThread)
  130. End If
  131. End Function
  132.  
  133. Public Function SuspendProcessByName(ProcName As String) As Long
  134. Dim Processes() As PROCESS
  135. Dim numProcesses As Long
  136. Dim X As Long
  137.  
  138. SuspendProcessByName = 0
  139. numProcesses = ListProcesses(Processes)
  140. For X = 1 To numProcesses
  141. If LCase(Processes(X).ExeFile) = LCase(ProcName) Then
  142. SuspendProcessByName = SuspendProcessByPID(Processes(X).ID)
  143. End If
  144. Next
  145. End Function
  146.  
  147. Public Function SuspendProcessByPID(ProcID As Long) As Long
  148. Dim Threads() As THREAD
  149. Dim numThreads As Long
  150. Dim X As Long
  151. Dim numThreadsSuspended As Long
  152.  
  153. numThreadsSuspended = 0
  154. numThreads = ListThreads(Threads)
  155. For X = 1 To numThreads
  156. If Threads(X).OwnerProcess = ProcID Then
  157. If VBSuspendThread(Threads(X).ID) > -1 Then
  158. numThreadsSuspended = numThreadsSuspended + 1
  159. End If
  160. End If
  161. Next
  162. SuspendProcessByPID = numThreadsSuspended
  163. End Function
  164.  
  165. Public Function ResumeProcessByName(ProcName As String) As Long
  166. Dim Processes() As PROCESS
  167. Dim numProcesses As Long
  168. Dim X As Long
  169.  
  170. ResumeProcessByName = 0
  171. numProcesses = ListProcesses(Processes)
  172. For X = 1 To numProcesses
  173. If LCase(Processes(X).ExeFile) = LCase(ProcName) Then
  174. ResumeProcessByName = ResumeProcessByPID(Processes(X).ID)
  175. End If
  176. Next
  177. End Function
  178.  
  179. Public Function ResumeProcessByPID(ProcID As Long) As Long
  180. Dim Threads() As THREAD
  181. Dim numThreads As Long
  182. Dim X As Long
  183. Dim numThreadsResumed As Long
  184.  
  185. numThreadsResumed = 0
  186. numThreads = ListThreads(Threads)
  187. For X = 1 To numThreads
  188. If Threads(X).OwnerProcess = ProcID Then
  189. If VBResumeThread(Threads(X).ID) > -1 Then
  190. numThreadsResumed = numThreadsResumed + 1
  191. End If
  192. End If
  193. Next
  194. ResumeProcessByPID = numThreadsResumed
  195. End Function
  196.  
  197.  

Re: Liệt kê Process, Ngừng và chạy lại

Đã gửi: T.Hai 09/07/2012 8:26 am
gửi bởi hmkg
Lỗi này sửa sao đây bác phú ?


Hình ảnh



Hình ảnh

Re: Liệt kê Process, Ngừng và chạy lại

Đã gửi: T.Hai 09/07/2012 9:54 am
gửi bởi truongphu
Đấy là hđh bảo mật, thì cứ ok source safe

Re: Liệt kê Process, Ngừng và chạy lại

Đã gửi: T.Hai 09/07/2012 10:02 am
gửi bởi hmkg
Hơ hơ nhấn yes nó bắt đền use và pass máy (em nhớ dc chết liền) :P
chọn no thì vẫn thấy chạy bt :D có điều bảo mật ko cao ^^

Re: Liệt kê Process, Ngừng và chạy lại

Đã gửi: T.Bảy 14/07/2012 2:10 pm
gửi bởi KGI
Bác phú cho em hỏi thêm là:
Ta có thể suppend process thồn qua hwnd ko ?
có nghĩa là có thể suppend ứng dụng khi ta biết dc class và title của nó ?
(cho em xin demo luôn ạ)

Re: Liệt kê Process, Ngừng và chạy lại

Đã gửi: T.Bảy 14/07/2012 2:53 pm
gửi bởi truongphu
KGI đã viết:Ta có thể suppend process thồn qua hwnd ko ?
có nghĩa là có thể suppend ứng dụng khi ta biết dc class và title của nó ?

1- từ hWnd tìm ThreadProcessId nhờ hàm
  1. Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwprocessid As Long) As Long
  2.  

2- Dùng hàm SetThreadPriority
  1. Private Declare Function SetThreadPriority Lib "kernel32" (ByVal hThread As Long, ByVal nPriority As Long) As Long
  2.  


các mức là:

Mã: Chọn hết

Const THREAD_BASE_PRIORITY_IDLE = -15
Const THREAD_BASE_PRIORITY_LOWRT = 15
Const THREAD_BASE_PRIORITY_MIN = -2
Const THREAD_BASE_PRIORITY_MAX = 2
Const THREAD_PRIORITY_LOWEST = THREAD_BASE_PRIORITY_MIN
Const THREAD_PRIORITY_HIGHEST = THREAD_BASE_PRIORITY_MAX
Const THREAD_PRIORITY_BELOW_NORMAL = (THREAD_PRIORITY_LOWEST + 1)
Const THREAD_PRIORITY_ABOVE_NORMAL = (THREAD_PRIORITY_HIGHEST - 1)
Const THREAD_PRIORITY_IDLE = THREAD_BASE_PRIORITY_IDLE
Const THREAD_PRIORITY_NORMAL = 0
Const THREAD_PRIORITY_TIME_CRITICAL = THREAD_BASE_PRIORITY_LOWRT
Const HIGH_PRIORITY_CLASS = &H80
Const IDLE_PRIORITY_CLASS = &H40
Const NORMAL_PRIORITY_CLASS = &H20
Const REALTIME_PRIORITY_CLASS = &H100

Re: Liệt kê Process, Ngừng và chạy lại

Đã gửi: T.Bảy 14/07/2012 2:57 pm
gửi bởi KGI
Cho e xin demo tham khảo dc ko bác
ví dụ suppend noteapd

Re: Liệt kê Process, Ngừng và chạy lại

Đã gửi: T.Bảy 21/07/2012 9:11 pm
gửi bởi hmkg
Xin các bác cho em demo suppend ứng dụng qua hwnd hoàn chỉnh

Re: Liệt kê Process, Ngừng và chạy lại

Đã gửi: T.Ba 31/07/2012 8:02 am
gửi bởi hmkg
Không bác nào giúp nhỉ :( help me !

Re: Liệt kê Process, Ngừng và chạy lại

Đã gửi: T.Năm 23/08/2012 2:59 pm
gửi bởi nqhieu2002
Bác Trường Phú ơi! Giúp em vụ này nhé
viewtopic.php?f=7&t=24253
em đọc qua topic này của bác mà ko rõ hết

Re: Liệt kê Process, Ngừng và chạy lại

Đã gửi: T.Năm 23/08/2012 8:10 pm
gửi bởi truongphu
KGI đã viết:Cho e xin demo tham khảo dc ko bác
ví dụ suppend noteapd

hmkg đã viết:Xin các bác cho em demo suppend ứng dụng qua hwnd hoàn chỉnh

nqhieu2002 đã viết:Bác Trường Phú ơi! Giúp em vụ này nhé
viewtopic.php?f=7&t=24253
em đọc qua topic này của bác mà ko rõ hết


===
cảm giác chung là hơi oải...

Sau đây là Project minh họa module trên
Trong folder kèm có aaaa.exe là đồng hồ, khi chạy project sẽ gọi aaaa.exe chạy luôn để các bạn tiện theo dõi và thao tác: ngừng, chạy lại...vv

Hình minh họa:
untitled.JPG


Bạn chỉ việc nhấn vào List1 bên trái aaa.exe, List2 sẽ tự tìm và thể hiện các số ID cùng Name trên các textbox bên phải.
Và bạn chỉ việc nhấn các nút suspend hay Resume

Đã OK chưa?

Re: Liệt kê Process, Ngừng và chạy lại

Đã gửi: T.Hai 26/12/2016 10:10 am
gửi bởi eyesofpain92
Bác Phú có cách nào để chuyển hàm này sang chạy đc trên 64 bit ko giúp e với. Vb6 ko có Int64 nên khó quá.

Mã: Chọn hết

Private Const MAX_PATH                  As Long = 260
Private Const PROCESS_QUERY_INFORMATION As Long = &H400
Private Const PROCESS_VM_READ           As Long = &H10

Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal pid As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)

Public Function GetProcessCommandLine(ByVal ProcessID As Long) As String

    Dim hKernel As Long, strName As String, hProc As Long, dwAddr As Long, dwRead As Long
   
    hProc = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, ProcessID)
   
    If hProc = 0 Then Exit Function
    hKernel = GetModuleHandle("kernel32")
    dwAddr = GetProcAddress(hKernel, "GetCommandLineA")
    CopyMemory dwAddr, ByVal dwAddr + 1, 4
    If ReadProcessMemory(hProc, ByVal dwAddr, dwAddr, 4, dwRead) Then
        strName = String(MAX_PATH, Chr(0))
        If ReadProcessMemory(hProc, ByVal dwAddr, ByVal strName, MAX_PATH, dwRead) Then
            strName = Left(strName, InStr(strName, Chr(0)) - 1)
            GetProcessCommandLine = strName
        End If
    End If
    CloseHandle hProc

End Function