Вопрос, поднятый пользователем, связан с созданием дочернего процесса с использованием API CreateProcess и последующим назначением его в JobObject. Проблема заключается в том, что при приостановлении родительского процесса дочерний процесс продолжает выполняться, что создает определенные трудности для управления и контроля за его работой, особенно в контексте разработки приложений безопасности.
Описание проблемы
Пользователь создает дочерний процесс с помощью CreateProcess и назначает его в JobObject. При уничтожении родительского процесса дочерний процесс также завершается, но если родительский процесс приостанавливается, дочерний продолжает свою работу. Задача состоит в том, чтобы найти способ приостановления дочернего процесса при приостановлении родительского.
Пример кода на Delphi
Function ExecuteProcess(EXE : String) : THandle;
Var
SI : TStartupInfo;
PI : TProcessInformation;
Begin
Result := INVALID_HANDLE_VALUE;
FillChar(SI, SizeOf(SI), 0);
SI.cb := SizeOf(SI);
If CreateProcess(nil, PChar('.\' + EXE), nil, nil, False, CREATE_SUSPENDED,
nil, nil, SI, PI) Then
Begin
ResumeThread(PI.hThread);
CloseHandle(PI.hThread);
Result := PI.hProcess;
End
Else ShowMessage('CreateProcess failed: ' +
SysErrorMessage(GetLastError));
End;
Подтвержденное решение
В Windows API нет прямой возможности приостановления процесса, но можно приостановить отдельные потоки внутри процесса. Для приостановления всех потоков дочернего процесса необходимо перечислить их и приостановить каждый отдельно. Это можно сделать с помощью функции SuspendThread, которая приостанавливает указанный поток.
Также упоминается функция NtSuspendProcess, которая может атомарно приостанавливать все потоки в процессе, но она является недокументированной и ее использование может быть небезопасным.
Альтернативный ответ и рекомендации
В комментариях к вопросу упоминается, что приостановление процессов после их запуска может быть небезопасным, так как потоки могут находиться в середине критических операций. Рекомендуется пересмотреть подход к решению проблемы и найти альтернативные способы управления процессами, например, через контроль за их работой на уровне операций с оборудованием или использованием механизмов сообщений между процессами.
Решение через JobObject
Для решения проблемы с приостановлением дочерних процессов через JobObject можно использовать следующие шаги:
Создать JobObject с помощью CreateJobObject.
Назначить ограничения для JobObject, например, ограничение на использование процессора (JOB_OBJECT_LIMIT_ACTIVE_PROCESS).
Присвоить созданный процесс JobObject с помощью AssignProcessToJobObject.
Использовать ControlJobObject для управления состоянием JobObject (например, приостановление или возобновление всех процессов в JobObject).
Пример кода на Delphi для создания JobObject и назначения ему процессов:
var
JobHandle: THandle;
JobInfo: TJobObjectInfo;
begin
JobHandle := CreateJobObject(nil, nil);
if JobHandle = 0 then
Exit;
JobInfo.SizeOfJobInfo := SizeOf(TJobObjectInfo);
if not SetInformationJobObject(JobHandle, JobObjectExtendedLimitInformation,
@JobInfo, SizeOf(TJobObjectInfo)) then
Exit;
if not AssignProcessToJobObject(JobHandle, ExecuteProcess('myapp.exe')) then
Exit;
// Приостановление процессов в JobObject
if not ControlJobObject(JobHandle, JOB_OBJECT_TURN_OFF, nil, nil) then
Exit;
// Возобновление процессов в JobObject
if not ControlJobObject(JobHandle, JOB_OBJECT_TURN_ON, nil, nil) then
Exit;
end;
Используя эти методы, можно управлять состоянием дочерних процессов, приостанавливая их при необходимости вместе с родительским процессом.
Заключение
Приостановление дочерних процессов через JobObject требует правильного использования функций Windows API для создания и управления JobObject. Важно понимать, что такое управление должно быть частью стратегии безопасности и контроля за процессами, а не единственным способом решения проблемы.
Вопрос касается управления процессами в операционной системе Windows, где пользователь столкнулся с проблемой приостановления дочерних процессов через JobObject.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.