• 获取进程列表的单元


    参考一些网上资料, 然后自己改了改......主要是为自己写的一个监视活动进程工具用的, 有需要可以参考参考

    unit ProcessInfos;
    
    interface
    
    uses
      Windows, TLHelp32, PsAPI, SysUtils;
    
    type
      TProcessInfo = record
        PID: Cardinal;
        PathName: string;
        CMDName: string;
      end;
      PProcessInfo = ^TProcessInfo;
      TProcessInfos = array of TProcessInfo;
    
    procedure GetProcessInfos(var APIList: TProcessInfos);
    function FindProcess(APathName: string; var API: TProcessInfo): Boolean;
    function GetProcessInfo(APID: Cardinal; API: PProcessInfo): Boolean;
    
    implementation
    
    type
      UNICODE_STRING = packed record
        Length: Word;
        MaximumLength: Word;
        Buffer: PWideChar;
      end;
      PUNICODE_STRING = UNICODE_STRING;
    
      PROCESS_PARAMETERS = packed record
        AllocationSize: ULONG;
        ActualSize: ULONG;
        Flags: ULONG;
        Unknown1: ULONG;
        Unknown2: UNICODE_STRING;
        InputHandle: THandle;
        OutputHandle: THandle;
        ErrorHandle: THandle;
        CurrentDirectory: UNICODE_STRING;
        CurrentDirectoryHandle: THandle;
        SearchPaths: UNICODE_STRING;
        ApplicationName: UNICODE_STRING;
        CommandLine: UNICODE_STRING;
        EnvironmentBlock: Pointer;
        Unknown: array[0..9 - 1] of ULONG;
        Unknown3: UNICODE_STRING;
        Unknown4: UNICODE_STRING;
        Unknown5: UNICODE_STRING;
        Unknown6: UNICODE_STRING;
      end;
      PPROCESS_PARAMETERS = ^PROCESS_PARAMETERS;
    
      PEB = packed record
        AllocationSize: ULONG;
        Unknown1: ULONG;
        ProcessHinstance: Longword;
        ListDlls: Pointer;
        ProcessParameters: PPROCESS_PARAMETERS;
        Unknown2: ULONG;
        Heap: THandle;
      end;
      PPEB = ^PEB;
    
      _PROCESS_BASIC_INFORMATION = packed record
        Reserved1: Pointer;
        PebBaseAddress: PPEB;
        Reserved2: array[0..1] of Pointer;
        UniqueProcessId: PULONG;
        Reserved3: Pointer;
      end;
      PROCESS_BASIC_INFORMATION = _PROCESS_BASIC_INFORMATION;
      PPROCESS_BASIC_INFORMATION = ^PROCESS_BASIC_INFORMATION;
      PROCESSINFOCLASS = (
        ProcessBasicInformation = 0,
        ProcessWow64Information = 26
      );
      NTSTATUS = DWORD;
    
    function NtQueryInformationProcess(
      ProcessHandle: THandle;
      ProcessInformationClass: PROCESSINFOCLASS;
      ProcessInformation: Pointer;
      ProcessInformationLength: ULONG;
      ReturnLength: PULONG
    ): NTSTATUS; stdcall; external 'ntdll.dll' name 'NtQueryInformationProcess';
    
    var
      _SystemRoot: string;
    
    procedure GetProcessInfos(var APIList: TProcessInfos);
    var
      nContinueLoop: BOOL;
      nSnapShotHandle: THandle;
      nProcessEntry32: TProcessEntry32;
      nCount: Word;
    begin
      nSnapShotHandle := CreateToolhelp32SnapShot(TH32CS_SNAPPROCESS, 0);
      try
        nProcessEntry32.dwSize := SizeOf(nProcessEntry32);
        nContinueLoop := Process32First(nSnapShotHandle, nProcessEntry32);
    
        SetLength(APIList, 65536);
        nCount := 0;
    
        while nContinueLoop do
        begin
          if GetProcessInfo(nProcessEntry32.th32ProcessID, @APIList[nCount]) then
            Inc(nCount);
          nContinueLoop := Process32Next(nSnapShotHandle, nProcessEntry32);
        end;
    
        SetLength(APIList, nCount);
      finally
        CloseHandle(nSnapShotHandle);
      end;
    end;
    
    function FindProcess(APathName: string; var API: TProcessInfo): Boolean;
    var
      nContinueLoop: BOOL;
      nSnapShotHandle: THandle;
      nProcessEntry32: TProcessEntry32;
      nR: TProcessInfo;
    begin
      Result := False;
      nSnapShotHandle := CreateToolhelp32SnapShot(TH32CS_SNAPPROCESS, 0);
      try
        nProcessEntry32.dwSize := SizeOf(nProcessEntry32);
        nContinueLoop := Process32First(nSnapShotHandle, nProcessEntry32);
    
        while nContinueLoop do
        begin
          if GetProcessInfo(nProcessEntry32.th32ProcessID, @nR) then
          begin
            if SameText(nR.PathName, APathName) then
            begin
              API := nR;
              Result := True;
              Break;
            end;
          end;
          nContinueLoop := Process32Next(nSnapShotHandle, nProcessEntry32);
        end;
      finally
        CloseHandle(nSnapShotHandle);
      end;
    end;
    
    function GetProcessInfo(APID: Cardinal; API: PProcessInfo): Boolean;
    
      procedure _CurePath(var APath: string);
      begin
        APath := Trim(APath);
        if APath = '' then
          Exit;
        if Copy(APath, 1, 4) = '??' then
          {类似??c:windowssystem32winlogon.exe的路径}
          APath := Copy(APath, 5, Length(APath))
        else if Copy(APath, 1, 12) = 'SystemRoot' then
          {类似SystemRootsystem32smss.exe的路径}
          APath := IncludeTrailingBackslash(_SystemRoot) + ExtractFileName(APath);
      end;
    
    var
      nPHandle: THandle; 
      nStr: string;
      nStrC: WideString;
      nPBI: PROCESS_BASIC_INFORMATION;
      nR: Cardinal;
      nPEB: PEB;
      nPP: PROCESS_PARAMETERS;
      nCount: Word;
      nBuff: array [0..MAX_PATH] of Char;
    begin
      Result := False;
      if API = nil then
        Exit;
    
      nPHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, APID);
    
      if nPHandle = 0 then
        Exit;
    
      try
        if GetModuleFileNameEx(nPHandle, 0, @nBuff[0], SizeOf(nBuff)) > 0 then
          API^.PathName := nBuff
        else
          API^.PathName := '';
    
        try
          if NtQueryInformationProcess(nPHandle, ProcessBasicInformation, @nPBI, SizeOf(nPBI), @nR) <> 0 then
            Abort;
          if not ReadProcessMemory(nPHandle, nPBI.PebBaseAddress, @nPEB, SizeOf(nPEB), nR) then
            Abort;
          if not ReadProcessMemory(nPHandle, nPEB.ProcessParameters, @nPP, SizeOf(nPP), nR) then
            Abort;
          if nPP.CommandLine.Length = 0 then
            Abort;
          SetLength(nStrC, nPP.CommandLine.Length div 2);
          if not ReadProcessMemory(nPHandle, nPP.CommandLine.Buffer, @nStrC[1],
            nPP.CommandLine.Length, nR) then
            Abort;
          API^.CMDName := nStrC;
        except
          API^.CMDName := '';
        end;
      finally
        CloseHandle(nPHandle);
      end;
    
      _CurePath(API^.PathName);
      _CurePath(API^.CMDName);
      API^.PID := APID;
      Result := True;
    end;
    
    var
      nBuff: array [0..MAX_PATH] of Char;
    initialization
      GetSystemDirectory(nBuff, SizeOf(nBuff));
      _SystemRoot := nBuff;
    
    end.
  • 相关阅读:
    Java回调函数的理解
    android 解析json数据格式
    python类型转换、数值操作(收藏)
    PyQt4学习资料汇总 (转)
    HDU 2767 Proving Equivalences (Tarjan )
    apache2的安装与简单配置(转)
    HDU 3861 The King’s Problem (Tarjan + 二分匹配)
    MySql的一些基本使用及操作命令 (待更新)
    pcap的安装与配置
    ubuntu下配置安装PYQT4
  • 原文地址:https://www.cnblogs.com/lzl_17948876/p/4702571.html
Copyright © 2020-2023  润新知