Saltar al contenido

¿Cómo suspender/reanudar un proceso en Windows?

Felipe, parte de este equipo de trabajo, nos hizo el favor de escribir este post porque domina a la perfección este tema.

Solución:

No puede hacerlo desde la línea de comando, debe escribir un código (supongo que no solo está buscando una utilidad; de lo contrario, Superusuario puede ser un mejor lugar para preguntar). También asumo que su aplicación tiene todos los permisos requeridos para hacerlo (los ejemplos son sin verificación de errores).

Manera difícil

Primero obtenga todos los subprocesos de un proceso dado y luego llame al SuspendThread función para detener cada uno (y ResumeThread Resumir). Funciona, pero algunas aplicaciones pueden fallar o bloquearse porque un subproceso puede detenerse en cualquier punto y el orden de suspensión/reanudación es impredecible (por ejemplo, esto puede provocar un punto muerto). Para una aplicación de un solo subproceso, esto puede no ser un problema.

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

Tenga en cuenta que esta función es incluso demasiado ingenua, para reanudar los hilos debe omitir los hilos que se suspendieron y es fácil provocar un punto muerto debido al orden de suspensión/reanudación. Para aplicaciones de un solo subproceso es prolijo pero funciona.

manera indocumentada

A partir de Windows XP existe la NtSuspendProcess pero es indocumentado. Lea esta publicación para ver un ejemplo de código (referencia para funciones no documentadas: 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);

Modo “depurador”

Suspender un programa es lo que suele hacer un depurador, para hacerlo puedes usar el DebugActiveProcess función. Suspenderá la ejecución del proceso (con todos los hilos juntos). Para reanudar puede utilizar DebugActiveProcessStop.

Esta función le permite detener un proceso (dada su ID de proceso), la sintaxis es muy simple: simplemente pase la ID del proceso que desea detener y listo. Si va a crear una aplicación de línea de comandos, deberá mantener su instancia en ejecución para mantener el proceso suspendido (o se terminará). Ver el Observaciones sección en MSDN para más detalles.

void suspend(DWORD processId)

    DebugActiveProcess(processId);

Desde la línea de comandos

Como dije, la línea de comandos de Windows no tiene ninguna utilidad para hacer eso, pero puede invocar una función API de Windows desde PowerShell. Primero instale el script Invoke-WindowsApi y luego puede escribir esto:

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

Por supuesto, si lo necesita a menudo, puede hacer una alias para eso.

Sin ninguna herramienta externa, simplemente puede lograr esto en Windows 7 u 8, abriendo el Monitor de recursos y en la pestaña CPU o Descripción general, haciendo clic con el botón derecho en el proceso y seleccionando Proceso de suspensión. El monitor de recursos se puede iniciar desde la pestaña Rendimiento del Administrador de tareas.

Uso (un muy antiguo) explorador de procesos de SysInternals (procexp.exe). Es un reemplazo / adición al administrador de tareas estándar, puede suspender un proceso desde allí.

Editar: Microsoft ha comprado SysInternals, url: procExp.exe

Aparte de eso, puede establecer la prioridad del proceso en baja para que no se interponga en el camino de otros procesos, pero esto no suspenderá el proceso.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *