知道了线程ID,怎么获取线程的入口地址
'模块里面的Private Declare Function Thread32First Lib "kernel32.dll" (ByVal hSnapShot As Long, ByRef lpte As THREADENTRY32) As Boolean
Private Declare Function Thread32Next Lib "kernel32.dll" (ByVal hSnapShot As Long, ByRef lpte As THREADENTRY32) As Boolean
Public Declare Function OpenThread Lib "kernel32.dll" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Boolean, ByVal dwThreadId As Long) As Long
Public Declare Function ResumeThread Lib "kernel32.dll" (ByVal hThread As Long) As Long
Public Declare Function TerminateThread Lib "kernel32.dll" (ByVal hThread As Long, ByVal dwExitCode As Long) As Boolean
Public Declare Function SuspendThread Lib "kernel32.dll" (ByVal hThread As Long) As Long
Public Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long
Public Declare Function Process32First Lib "kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Public Declare Function Process32Next Lib "kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Public Type PROCESSENTRY32
dwSize As Long
cntUsage As Long
th32ProcessID As Long
th32DefaultHeapID As Long
th32ModuleID As Long
cntThreads As Long
th32ParentProcessID As Long
pcPriClassBase As Long
dwFlags As Long
szExeFile As String * 260
End Type
Public Type THREADENTRY32
dwSize As Long
cntUsage As Long
th32ThreadID As Long
th32OwnerProcessID As Long
tpBasePri As Long
tpDeltaPri As Long
dwFlags As Long
End Type
Public Const THREAD_SUSPEND_RESUME As Long = &H2
Public ProcessId() As PROCESSENTRY32
Public Thread() As THREADENTRY32
Public Const LB_SETHORIZONTALEXTENT = &H194
Public Const TH32CS_SNAPheaplist = &H1
Public Const TH32CS_SNAPPROCESS = &H2
Public Const TH32CS_SNAPthread = &H4
Public Const TH32CS_SNAPmodule = &H8
Public Const TH32CS_INHERIT = &H80000000
Public Const TH32CS_SNAPall = (TH32CS_SNAPheaplist Or TH32CS_SNAPPROCESS Or TH32CS_SNAPthread Or TH32CS_SNAPmodule)
Public Function Thread32_Enum(ByRef Thread() As THREADENTRY32, lProcessID As Long) As Long
ReDim Thread(0)
Dim THREADENTRY32 As THREADENTRY32
Dim hSnapShot As Long
Dim lThread As Long
hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPthread, lProcessID)
THREADENTRY32.dwSize = Len(THREADENTRY32)
If Thread32First(hSnapShot, THREADENTRY32) = False Then
Thread32_Enum = -1
Exit Function
Else
ReDim Thread(lThread)
Thread(lThread) = THREADENTRY32
End If
Do
If Thread32Next(hSnapShot, THREADENTRY32) = False Then
Exit Do
Else
lThread = lThread + 1
ReDim Preserve Thread(lThread)
Thread(lThread) = THREADENTRY32
End If
Loop
Thread32_Enum = lThread
End Function
'窗体里面的
Private Sub Form_Load()
TList
End Sub
Private Sub List1_Click() '线程列表
List2.Clear
For i = 0 To Thread32_Enum(Thread(), ProcessId(List1.ListIndex).th32ProcessID)
If Thread(i).th32OwnerProcessID = ProcessId(List1.ListIndex).th32ProcessID Then
List2.AddItem Thread(i).th32ThreadID
End If
Next i
Text1.Text = List2.ListCount
End Sub
Private Sub List2_DblClick()
'PopupMenu Threads
End Sub
Private Sub ResumeT_Click()
' If List2.Selected(i) Then
Thread_Resume List2.List(List2.ListIndex)
' End If
End Sub
Private Sub Suspend_Click()
' If MsgBox("挂起线程可能导致该程序出错,确定要挂起??", vbDefaultButton2 + vbOKCancel + vbQuestion, "挂起线程") = vbOK Then
' If List2.Selected(i) Then
Thread_Suspend List2.List(List2.ListIndex)
' End If
' End If
End Sub
Function Thread_Suspend(T_ID As Long) As Long '挂起线程
Dim hThread As Long
hThread = OpenThread(THREAD_SUSPEND_RESUME, False, T_ID)
Thread_Suspend = SuspendThread(hThread)
End Function
Function Thread_Resume(T_ID As Long) As Long '恢复线程
Dim hThread As Long
Dim lSuspendCount As Long
hThread = OpenThread(THREAD_SUSPEND_RESUME, False, T_ID)
Thread_Resume = ResumeThread(hThread)
End Function
Public Sub TList()
Dim i As Integer
Dim theloop As Long, snap As Long
Dim Proc As PROCESSENTRY32
List1.Clear '清空内容
List2.Clear
snap = CreateToolhelp32Snapshot(TH32CS_SNAPall, 0) '获得进程"快照"的句柄
Proc.dwSize = Len(Proc)
theloop = Process32First(snap, Proc) '获取第一个进程,并得到其返回值
While theloop <> 0 '当返回值非零时继续获取下一个进程
List1.AddItem Proc.szExeFile
ReDim Preserve ProcessId(i)
ProcessId(i).th32ProcessID = Proc.th32ProcessID
ProcessId(i).cntThreads = Proc.cntThreads
ProcessId(i).th32ParentProcessID = Proc.th32ParentProcessID
i = i + 1
theloop = Process32Next(snap, Proc)
Wend
CloseHandle snap '关闭进程"快照"句柄
End Sub
上面代码可以暂停,和恢复 线程,,,但是不能确定线程ID是属于哪个线程
每个线程的入口地址后几位都不会变化,所以如果通过线程ID获取到线程入口地址,就能知道对应线程ID是属于哪个线程的了
怎么通过线程ID获得线程入口地址,,,,或者怎么把线程ID和线程关联起来 求高手告诉我吧 真的没有人帮助我么,,,我只是想暂停 指定线程
补充:VB , 基础类