1

Одна из моих программ выводит свой идентификатор потока для целей отладки. По причинам тестирования я хотел бы убить процесс, которому принадлежит идентификатор потока.

Как получить идентификатор процесса, если у меня есть идентификатор потока, чтобы я мог использовать его с taskkill?

Я старался

  • tasklist но он не имеет переключателя для идентификаторов thead.
  • SysInternals Process Explorer, функция "Найти дескриптор", которая работает, но мне нужно что-то, что может быть автоматизировано в пакетном файле
  • SysInternals Handle -a Thread , но это не похоже на работу. handle -a | find "Thread" работает лучше, но я теряю информацию о процессе

2 ответа2

3

Вы можете сделать это так с помощью командного файла:

Пакетный файл killprocess.bat:

@echo off
set processhandle=
set description=
set handle=%1
IF "%handle%." == "." (
  echo Usage: killprocess threadID
  exit/b
)

FOR /F "tokens=*" %%A IN ('WMIC PATH Win32_thread WHERE handle^=%handle% GET Processhandle /VALUE ^| find "="') DO set "%%A"
FOR /F "tokens=*" %%A IN ('WMIC PATH Win32_process WHERE handle^=%processhandle% GET Description /VALUE ^| find "="') DO set "%%A"

IF "%ProcessHandle%." == "." (
  echo ThreadID not found
  exit/b
)

echo I'm going to kill %Description% (Processhandle = %processhandle%) if you don't press Q in 5 seconds
echo (or you can press Y to continue)
choice /N /T 5 /C yq /D y
if "%errorlevel%"=="2" goto :eof

echo Killing %Description% (Processhandle = %processhandle%)
Taskkill /PID %processhandle% /T /F

Использование будет примерно таким:
killprocess 13008

Редактировать: я также добавил опцию прерывания (выбор) и описание процесса, который будет убит. Вы можете удалить это, если не хотите.

0

Вот мое решение C++ на случай, если кто-то захочет его использовать, я лицензирую его как CC0 / общественное достояние. Я редко внедряю в C++, поэтому прощаю ошибки.

#include "stdafx.h"
#include <sstream>
#include <windows.h>
#include <stdio.h>
#include <iostream>
int main(int argc, char* argv[])
{
    if (argc < 2)
    {
        std::cout << "Usage: " << argv[0] << " <Thread ID>" << std::endl;
        std::cout << "Returns the process ID of a thread." << std::endl;
        std::cout << "Errorlevels:" << std::endl;
        std::cout << "   0 success" << std::endl;
        std::cout << "   1 too few arguments" << std::endl;
        std::cout << "   2 error parsing thread ID" << std::endl;
        std::cout << "   3 error opening thread" << std::endl;
        return 1;
    }

    std::istringstream iss(argv[1]);
    int threadId;

    if (iss >> threadId)
    {
        std::cout << threadId << std::endl;
        HANDLE threadHandle = OpenThread(THREAD_QUERY_INFORMATION, false, (DWORD)threadId);
        if (threadHandle)
        {
            DWORD pid = GetProcessIdOfThread(threadHandle);
            CloseHandle(threadHandle);
            std::cout << pid << std::endl;
            return 0;
        }
        std::cerr << "Error opening thread. Perhaps run as admin or thread does not exist?";
        return 3;
    }
    std::cerr << "Error parsing thread ID. Use decimal, not hex?";
    return 2;
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .