【问题标题】:How to Get List of Thread IDs for Current Process如何获取当前进程的线程 ID 列表
【发布时间】:2013-06-24 10:15:55
【问题描述】:

EnumProcess 或 CreateToolhelp32Snapshot 函数帮助我们获取进程信息,包括进程 ID。

但我想知道获取当前进程的线程 ID 列表。

DWORD GetMainThreadId(DWORD pId)
{
    LPVOID lpThId;

    _asm
    {
        mov eax, fs:[18h]
        add eax, 36
        mov [lpThId], eax
    }

    HANDLE hProcess = OpenProcess(PROCESS_VM_READ, FALSE, pId);
    if(hProcess == NULL)
        return NULL;

    DWORD tId;
    if(ReadProcessMemory(hProcess, lpThId, &tId, sizeof(tId), NULL) == FALSE)
    {
        CloseHandle(hProcess);
        return NULL;
    }

    CloseHandle(hProcess);

    return tId;
}

这段代码是为了获取主线程id,但我想获取其他线程模块并终止它,除了主线程。

有没有api函数或方法?

我的操作系统:Windows 7 Ultimate

开发工具:Visual Studio 2008

【问题讨论】:

  • 什么,比如GetCurrentThreadId
  • No 获取进程的线程列表。
  • 那么你想要当前进程中所有线程的列表吗?并且在没有适当清理的情况下终止线程可能是危险的,如果它们正在做一些具有潜在破坏性的事情而你只是杀死它们怎么办?

标签: c++ windows winapi threadpool


【解决方案1】:

看看Thread Walking

基本上,你必须打电话给Thread32First,再打电话给Thread32Next,直到碰壁。

【讨论】:

  • 但即便如此,也无法确定哪个线程是“主”线程。
  • @joshpoley 这不是必需的。这很简单,一旦你启动你的应用程序,获取当前线程的 id 并简单地记住它。
【解决方案2】:

如果您知道应用程序的进程 ID,则可以使用当前进程的线程快照并迭代与该进程关联的线程的完整列表:

bool GetProcessThreads(DWORD PID) {
  HANDLE thread_snap = INVALID_HANDLE_VALUE;
  THREADENTRY32 te32;

  // take a snapshot of all running threads
  thread_snap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
  if (thread_snap == INVALID_HANDLE_VALUE) {
    printf("Invalid Handle Value");
    return(FALSE);
  }

  // fill in the size of the structure before using it. 
  te32.dwSize = sizeof(THREADENTRY32);

  // retrieve information about the first thread,
  // and exit if unsuccessful
  if (!Thread32First(thread_snap, &te32)) {
    printf("Thread32First Error");
    CloseHandle(thread_snap);
    return(FALSE);
  }

  // now walk the thread list of the system,
  // and display thread ids of each thread
  // associated with the specified process
  do {
    if (te32.th32OwnerProcessID == PID)
      printf("THREAD ID: 0x%08X",te32.th32ThreadID);
  } while (Thread32Next(thread_snap, &te32));

  // clean up the snapshot object.
  CloseHandle(thread_snap);
  return(TRUE);
}

然后你就可以在main或者下面的任何地方调用上面的函数了:

void main() {
  GetProcessThreads(PID) // write the process id of your application here
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-25
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多