Delphi 如何获取进程挂起状态?

Delphi 如何获取进程挂起状态?,delphi,winapi,pascal,lazarus,Delphi,Winapi,Pascal,Lazarus,我想在delphi中检查进程是否已暂停。 所以我使用了下面的函数,但函数总是返回true。 如何检查已暂停的进程 function ProcessExist(exeFileName: string): Boolean; var ContinueLoop: BOOL; FSnapshotHandle: THandle; FProcessEntry32: TProcessEntry32; begin FSnapshotHandle := CreateToolhelp32Snapsho

我想在delphi中检查进程是否已暂停。 所以我使用了下面的函数,但函数总是返回true。 如何检查已暂停的进程

function ProcessExist(exeFileName: string): Boolean;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
begin
  FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
  Result := False;
  while Integer(ContinueLoop) <> 0 do
  begin
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
      UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
      UpperCase(ExeFileName))) then
    begin
      Result := True;
    end;
    ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle);
end;
函数ProcessExist(exeFileName:string):布尔值;
变量
连续作业:BOOL;
FSnapshotHandle:THandle;
FProcessEntry32:TProcessEntry32;
开始
FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS\u SNAPPROCESS,0);
FProcessEntry32.dwSize:=SizeOf(FProcessEntry32);
ContinueLop:=Process32First(FSnapshotHandle,fpProcessEntry32);
结果:=假;
而整数(ContinueLoop)为0
开始
if((大写(ExtractFileName(FProcessEntry32.szexFile))=
大写(ExeFileName)或(大写(fprocesentry32.szExeFile)=
大写(ExeFileName)))然后
开始
结果:=真;
终止
ContinueLop:=Process32Next(FSnapshotHandle,fpProcessEntry32);
终止
闭合手柄(FSnapshotHandle);
终止

该代码不会尝试检查进程是否挂起。而是检查是否存在具有指定可执行文件名的进程

我将假设您希望检测的进程挂起的形式只是该进程中所有线程的挂起。据我所知,没有文件化的方法来实现这一点,我们必须求助于无文件化的方法。其中一种是:

获取线程状态信息的基本步骤是 遵循(当然知道进程ID(因此是第四个PID)和 线程ID(TID)):

  • 在SystemInformation设置为SystemProcessInformation的情况下调用NtQuerySystemInformation(5)
  • 迭代SYSTEM_PROCESS_信息结构数组,以查找您感兴趣的PID(ProcessId成员)
  • 迭代SYSTEM_线程结构数组(如下所述),以找到所需的TID(UniqueThread成员),并检查状态和 WaitReason成员;如果线程挂起,则两者都必须设置为5, 其他任何值
  • 对于大多数热衷于系统级的人来说,这可能是显而易见的 编程时,当进程的所有线程都被调用时,进程将被挂起 已挂起,因此必须检查它们的挂起状态


    链接文章包含必要的代码。

    该代码不会尝试检查进程是否挂起。而是检查是否存在具有指定可执行文件名的进程

    我将假设您希望检测的进程挂起的形式只是该进程中所有线程的挂起。据我所知,没有文件化的方法来实现这一点,我们必须求助于无文件化的方法。其中一种是:

    获取线程状态信息的基本步骤是 遵循(当然知道进程ID(因此是第四个PID)和 线程ID(TID)):

  • 在SystemInformation设置为SystemProcessInformation的情况下调用NtQuerySystemInformation(5)
  • 迭代SYSTEM_PROCESS_信息结构数组,以查找您感兴趣的PID(ProcessId成员)
  • 迭代SYSTEM_线程结构数组(如下所述),以找到所需的TID(UniqueThread成员),并检查状态和 WaitReason成员;如果线程挂起,则两者都必须设置为5, 其他任何值
  • 对于大多数热衷于系统级的人来说,这可能是显而易见的 编程时,当进程的所有线程都被调用时,进程将被挂起 已挂起,因此必须检查它们的挂起状态


    链接文章包含必要的代码。

    此函数不检查挂起状态,只检查运行的
    exeFileName
    实例。可以挂起线程,而不是进程,因此我假设您对挂起进程的解释是一个进程,其中所有线程都已挂起。不过,这不是很有用的信息,因为任何进程都可以调用
    CreateRemoteThread
    ,从而“取消挂起”进程。@IInspectable,您可以挂起进程(请参阅undocumented
    NtSuspendProcess
    函数)。@Victoria:据我所知,这也会迭代所有线程并挂起它们。进程对象中没有存储挂起/恢复状态的条目。有鉴于此,我之前的评论仍然有效:被暂停不是流程固有的属性。因此,如果你问一个问题,进程是否被挂起,你必须记住这个答案是如何得出的,才能理解使用这个答案的后果。这个函数不检查挂起状态,只检查运行的
    exeFileName
    实例。可以挂起线程,而不是进程,所以我假设您对挂起进程的解释是一个进程,其中所有线程都已挂起。不过,这不是很有用的信息,因为任何进程都可以调用
    CreateRemoteThread
    ,从而“取消挂起”进程。@IInspectable,您可以挂起进程(请参阅undocumented
    NtSuspendProcess
    函数)。@Victoria:据我所知,这也会迭代所有线程并挂起它们。进程对象中没有存储挂起/恢复状态的条目。有鉴于此,我之前的评论仍然有效:被暂停不是流程固有的属性。因此,如果你问一个问题,进程是否被挂起,你必须记住这个答案是如何得出的,才能理解使用这个答案的后果。
    WaitForSingleObject()
    returning
    WAIT\u
    被记录为只应用于互斥句柄,而不是线程句柄。而且,不管怎样,挂起线程返回废弃状态是没有意义的。等待线程句柄只会告诉你线程是否已终止,而不是它是否已挂起。@Remy我从web上获得了这些信息,但这是假的。也许是在一些古老的Windows版本中,