关于c ++:从另一个进程中的另一个线程挂起/恢复线程或进程

Suspend/Resume a thread or process from another Thread in different process

在我的一个项目中,我从主项目中创建了多个流程(它们是我开发的子项目),并将其处理为CREATE_SUSPENDED,并将其句柄存储在全局数组中,但是;当我想使用ResumeThread函数恢复它时,我得到ERROR_INVALID_HANDLE错误代码。

MSDN指定该线程必须具有THREAD_SUSPEND_RESUME访问权限,但我找不到如何设置它。

这些句柄仅在其进程空间上有效吗,我如何使用已存储的所有句柄从另一个进程中挂起/恢复线程或进程?

注意:我知道同步对象可能在这里有用,但这是唯一且唯一的方法吗?

另一个问题是;如何从主进程(也创建该ProcessClass)获取由我的ProcessClass创建的线程的句柄?

这是代码的一部分

ProcessClass

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
void ProcessClass::Start(){      
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    ZeroMemory(&pi, sizeof(pi));
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);

    BOOL createdProc = CreateProcess(NULL,
        ProcessExeDir,
        NULL,
        NULL,
        TRUE,
        CREATE_NEW_CONSOLE | CREATE_SUSPENDED
        , NULL,
        NULL,
        &si,
        &pi);
    if (createdProc == FALSE)
    {
        UINT32 errorCode = GetLastError();        
    }
    else
    {
        DWORD affinity;
        affinity = 0x000000010 << (5);
        SetProcessAffinityMask(pi.hProcess, affinity);

        ProcessHandler = pi.hProcess;
        ProcessInfoPtr->ProcHandle = ProcessHandler;

        // I can need this handle
        // CloseHandle(pi.hThread);
    }
}

// ProcessInPtr is defines as ProcessInfoStc* in the header
ProcessInfoStc* ProcessClass::GetProcessInfoPtr() {
    return ProcessInfoPtr;
}

在主项目中:

1
2
3
4
5
int main() {
   // this is declared as ManageProcesses(const ProcessInfoStcPtr& processes)
    ManageProcesses(ProcessInfoArray);
    return 0;
}

在ManageProcess函数中,该函数与ProcessClass和以下结构定义在同一个lib项目中:

1
2
3
4
5
6
7
ProcessClass processObj = new ProcessClass();
processObj->Start();
...
HANDLE pHandle = processObj->GetProcessInfoPtr()->ProcHandle;
//! pHandle is is same with the created process handle as I debug
ResumeThread(pHandle);
DWORD error = GetLastError(); // RETURNS INVALID HANDLE

而且存储结构的过程也是主要过程

1
2
3
4
5
6
7
8
9
10
ProcessInfoStc {
    HANDLE ProcHandle ,
    DWORD ProcId..
 }
 ProcessInfoStc ProcessInfoArray[10] = {
     {
        0,0...
     },...
 }
 typedef ProcessInfoStc* ProcessInfoStcPtr;


In one of my projects I create multiple processes (which are sub projects that I developed) from my main project as CREATE_SUSPENDED and storing their handles in a global array but; when I want to resume it with ResumeThread function I get ERROR_INVALID_HANDLE error code.

那是因为您要将进程句柄(pi.hProcess)传递给ResumeThread()。您无法使用ResumeThread()恢复过程。顾名思义,您需要为其传递一个线程句柄(pi.hThread)。

The MSDN specifies that the thread must have THREAD_SUSPEND_RESUME access right and I couldn't find how to set it.

根据文档,您已经拥有它:

创建流程

The thread and process handles are created with full access rights, although access can be restricted if you specify security descriptors.

how to obtain handle of a thread created by my ProcessClass from the main process, which also created that ProcessClass?

您当前不在任何地方存储线程句柄,您无法检索它。更新您的ProcessInfoStc结构,以存储CreateProcess()返回的两个HANDLE。使用完它们后,别忘了将它们都关闭。


我建议不要使用OS或线程库低级API来停止/恢复线程,除非您正在编写线程调度算法(但是您的代码应驻留在内核中)。在现代操作系统中,处于等待状态的正确编写的多线程应用程序线程几乎不占用任何资源,因此,实际上应该没有理由进行干预。这就是为什么现在不太可能在实际的代码示例中看到thread.suspend()thread.resume()的原因。

我只是以一种在IO选择器,任务队列上进行线程轮询(通过IOLoop,Dispatcher,Executor,Actor等的方式)构建应用程序的方式,仅在唤醒时做一些事情有一项工作要做。