it-swarm.com.de

Wie kann ich einen Prozess in Windows anhalten/fortsetzen?

In Unix können wir eine Prozessausführung vorübergehend anhalten und mit den Signalen SIGSTOP und SIGCONT fortsetzen. Wie kann ich einen Single-Threaded-Prozess in Windows anhalten, ohne zu programmieren? 

61
Michael

Sie können es nicht von der Kommandozeile aus tun, Sie müssen etwas Code schreiben (ich gehe davon aus, dass Sie nicht nur nach einem Hilfsprogramm suchen, ansonsten ist Super User ein besserer Ort, um danach zu fragen). Ich gehe außerdem davon aus, dass Ihre Anwendung über alle erforderlichen Berechtigungen verfügt (Beispiele ohne Fehlerprüfung).

Hard Way

Rufen Sie zuerst alle Threads eines bestimmten Prozesses auf, rufen Sie dann die Funktion SuspendThread auf, um jeden zu stoppen (und ResumeThread, um fortzufahren). Es funktioniert, aber einige Anwendungen können abstürzen oder hängenbleiben, weil ein Thread an einem beliebigen Punkt angehalten werden kann und die Reihenfolge des Anhaltens/Fortsetzens unvorhersehbar ist (beispielsweise kann dies zu einem Deadlock führen). Für eine einzelne Threadanwendung ist dies möglicherweise kein Problem.

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);
}

Bitte beachten Sie, dass diese Funktion sogar zu naiv ist. Um Threads wieder aufzunehmen, sollten Sie suspendierte Threads überspringen, und aufgrund der Suspend/Resume-Reihenfolge kann es leicht zu einem Deadlock kommen. Für Single-Threaded-Anwendungen ist es prolix, aber es funktioniert. 

Undokumentierter Weg

Ausgehend von Windows XP gibt es die NtSuspendProcess, aber es ist undocumented. Lesen Sie this post für ein Codebeispiel (Referenz für undokumentierte Funktionen: news: //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);
}

"Debugger" Weg

Um ein Programm auszusetzen, ist das normalerweise ein Debugger. Um dies zu tun, können Sie die Funktion DebugActiveProcess verwenden. Dadurch wird die Prozessausführung (mit allen Threads zusammen) angehalten. Um fortzufahren, können Sie DebugActiveProcessStop verwenden.

Mit dieser Funktion können Sie einen Prozess stoppen (angesichts der Prozess-ID). Die Syntax ist sehr einfach: Übergeben Sie einfach die ID des Prozesses, den Sie stoppen möchten. Wenn Sie eine Befehlszeilenanwendung erstellen, müssen Sie die Instanz laufen lassen, damit der Prozess angehalten bleibt (oder er wird beendet). Weitere Informationen finden Sie im Abschnitt Remarks auf MSDN.

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

Von der Befehlszeile

Wie bereits erwähnt, verfügt die Windows-Befehlszeile nicht über ein Dienstprogramm, aber Sie können eine Windows-API-Funktion von PowerShell aus aufrufen. Installieren Sie zuerst Invoke-WindowsApi script, und schreiben Sie dann Folgendes:

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

Wenn Sie es oft brauchen, können Sie natürlich eine alias dafür machen.

86
Adriano Repetti

Ohne externes Tool können Sie dies einfach unter Windows 7 oder 8 durchführen, indem Sie den Ressourcenmonitor öffnen und auf der Registerkarte CPU oder Übersicht mit der rechten Maustaste auf den Prozess klicken und Suspend Process ..__ auswählen wurde auf der Registerkarte "Leistung" des Task-Managers gestartet.

79
Sigroad

Ich verwende (einen sehr alten) Prozess-Explorer von SysInternals (procexp.exe). Es ist eine Ersetzung/Ergänzung zum Standard-Task-Manager. Sie können einen Prozess von dort aus anhalten.

Edit: Microsoft hat über SysInternals gekauft, URL: procExp.exe

Abgesehen davon können Sie die Prozesspriorität auf niedrig setzen, damit sie anderen Prozessen nicht im Weg steht. Dies setzt den Prozess jedoch nicht aus.

39
Zordey

PsSuspend Befehlszeilenhilfsprogramm von SysInternals suite. Es unterbricht/setzt einen Prozess anhand seiner ID fort. 

18
AlexeyDaryin

Nun, Process Explorer hat eine Suspend-Option. Sie können mit der rechten Maustaste auf einen Prozess in der Prozessspalte klicken und Suspend auswählen. Sobald Sie bereit sind, den Vorgang fortzusetzen, klicken Sie mit der rechten Maustaste und wählen Sie "Resume". Der Process Explorer kann hier bezogen werden:

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

13
shivesh suman

PsSuspend , wie von Vadzim erwähnt, unterbricht/setzt sogar einen Prozess mit seinem Namen fort, nicht nur mit pid.

Ich verwende sowohl PsSuspend als auch PsList (ein anderes Tool aus der PsTools-Suite) in einem einfachen Umschaltskript für den OneDrive-Prozess: Wenn ich mehr Bandbreite benötige, unterbreche ich die OneDrive-Synchronisierung, und setze den Prozess anschließend durch Ausgabe fort das gleiche Miniskript:

PsList -d OneDrive|find/i "suspend" && PsSuspend -r OneDrive || PsSuspend OneDrive

PsSuspend Befehlszeilenprogramm aus der SysInternals Suite. Es unterbricht/setzt einen Prozess anhand seiner ID fort.

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

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

ntdll enthält die exportierte Funktion NtSuspendProcess. Übergeben Sie das Handle an einen Prozess, um den Trick auszuführen.

0
coltonon