如何挂起/恢复Windows中的一个过程?如何挂起/恢复Windows中的一个过程?(How to

2019-06-01 00:15发布

在Unix系统上,我们可以暂停执行流程,并与信号恢复它SIGSTOPSIGCONT 。 我怎样才能暂停在Windows中,无需编程单线程程序?

Answer 1:

你不能在命令行做它,你必须写一些代码(我假设你不只是寻找一个工具,否则超级用户可能是一个更好的地方问)。 我还假设您的应用程序所需的所有权限,做到这一点(的例子是没有任何错误检查)。

艰辛的道路

首先得到一个给定的进程的所有线程然后调用SuspendThread函数停止每一个(和ResumeThread恢复)。 它的工作原理,但某些应用程序可能会崩溃或挂起,因为一个线程可以在任何一点停止和暂停/恢复的顺序是不可预测的(例如,这可能会导致死锁)。 对于单线程应用程序,这可能不是一个问题。

void suspend(DWORD processId)
{
    HANDLE hThreadSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);

    THREADENTRY32 threadEntry; 
    threadEntry.dwSize = sizeof(THREADENTRY32);

    Thread32First(hThreadSnapshot, &threadEntry);

    do
    {
        if (threadEntry.th32OwnerProcessID == processId)
        {
            HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, FALSE,
                threadEntry.th32ThreadID);

            SuspendThread(hThread);
            CloseHandle(hThread);
        }
    } while (Thread32Next(hThreadSnapshot, &threadEntry));

    CloseHandle(hThreadSnapshot);
}

请注意,这个功能显得太幼稚,恢复你应该跳过暂停线程的线程,很容易造成死锁因为挂起/恢复秩序。 对于单线程应用很冗长,但它的工作原理。

无证方式

从Windows XP开始还有就是NtSuspendProcess但它没有证件 。 阅读这篇文章的代码示例(参考无证功能:新闻://comp.os.ms-windows.programmer.win32)。

typedef LONG (NTAPI *NtSuspendProcess)(IN HANDLE ProcessHandle);

void suspend(DWORD processId)
{
    HANDLE processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processId));

    NtSuspendProcess pfnNtSuspendProcess = (NtSuspendProcess)GetProcAddress(
        GetModuleHandle("ntdll"), "NtSuspendProcess");

    pfnNtSuspendProcess(processHandle);
    CloseHandle(processHandle);
}

“调试器”的方式

要暂停程序通常是一个调试器做什么,做到这一点,你可以使用DebugActiveProcess功能。 它会暂停流程执行(所有线程都在一起)。 要恢复你可以使用DebugActiveProcessStop

该功能可让您停止一个进程(考虑到其进程ID),语法很简单:只要传递要停止等,瞧进程的ID。 如果你要让你需要保持它的实例中运行,以保持暂停过程中的命令行应用程序(或它会被终止)。 详情请参阅MSDN上的备注部分。

void suspend(DWORD processId)
{
    DebugActiveProcess(processId);
}

从命令行

正如我所说的Windows命令行还没有任何工具来做到这一点,但你可以调用从PowerShell的Windows API函数。 首先安装调用,WindowsAPI的脚本,那么你可以这样写:

Invoke-WindowsApi "kernel32" ([bool]) "DebugActiveProcess" @([int]) @(process_id_here)

当然,如果你需要它往往可以使一个alias为。



Answer 2:

无需任何外部工具,你可以简单地做到这一点在Windows 7或8,通过打开资源监视器,并在CPU或概述选项卡上单击右键过程并选择挂起进程 。 资源监视器可以从任务管理器的性能选项卡启动。



Answer 3:

我使用Sysinternals公司(procexp.exe)(一个很老的)进程管理器。 这是一个替代/除了标准的任务管理器,你可以从那里进程暂停。

编辑:微软已经收购了Sysinternals的,网址: procExp.exe

除此之外,您可以设置进程的优先级要低,所以它不会在其他进程的方式获得,但是这不会中止进程。



Answer 4:

PsSuspend从命令行实用程序SysInternals套件。 它暂停/恢复通过其ID的过程。



Answer 5:

那么,Process Explorer中有一个暂停选项。 你可以右键点击的过程中柱的过程,并选择暂停。 一旦你准备好恢复它再次右击,这次选择的简历。 过程资源管理器可以从这里获得:

http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx



Answer 6:

#pragma comment(lib,"ntdll.lib")
EXTERN_C NTSTATUS NTAPI NtSuspendProcess(IN HANDLE ProcessHandle);

void SuspendSelf(){
    NtSuspendProcess(GetCurrentProcess());
}

NTDLL包含导出功能NtSuspendProcess,手柄传递到过程中做的伎俩。



文章来源: How to suspend/resume a process in Windows?