当前位置:编程学习 > VB >>

知道了线程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 ,  基础类
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,