Delphi中对进程内存进行读写

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,TlHelp32,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  StartInfo: TStartupInfo;
  ProcInfo: TProcessInformation;
  ProcessHndle,PID: HWND;
  BytesRead : DWORD;
  TmpData : array[0..1] of Byte;
  FilePath:String;

const
  OldData : array[0..1] of byte = ($75,$10);   // 原值
  NewData : array[0..1] of byte = ($90,$90);   // 修改值

implementation

{$R *.DFM}

function FindPath(PID:dword):String;   // 查寻程序路径
var
  H: THandle;
  TM: TModuleEntry32;
begin
  Result:='';
  H := CreateToolHelp32SnapShot(TH32CS_SNAPMODULE,PID);
  if H > 0 then
  begin
    TM.dwSize := sizeof(TM);
    Module32First(H, TM);
    Result:=TM.szExePath;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
Var
  H: THandle;
begin
  H:= FindWindow(nil,'test');
  if H = 0 then
  begin
   MessageBox(0,#13+'程序未运行!请仔细检查...!!!','系统提示',0);
   Exit;
  end;
  GetWindowThreadProcessId(H, @PID);
  FilePath := FindPath(PID);
  if FilePath='' then Exit;
  ProcessHndle:=OpenProcess(PROCESS_TERMINATE,FALSE,PID);
  if ProcessHndle = 0 then  Exit;
  TerminateProcess(ProcessHndle, 0);
  CloseHandle(ProcessHndle);


  ZeroMemory(@StartInfo, SizeOf(TStartupInfo));
  StartInfo.cb := SizeOf(TStartupInfo);
  if not CreateProcess(nil,Pchar(FilePath), nil, nil, False, Create_Suspended, nil, nil, StartInfo, ProcInfo) then Exit;
  ReadProcessMemory(ProcInfo.hProcess,Pointer($4277D9),@TmpData,2,BytesRead);
  if (TmpData[0] = OldData[0]) and (TmpData[1] = OldData[1]) then
  begin
  if WriteProcessMemory(ProcInfo.hProcess, Pointer($4277D9), @NewData, 2, BytesRead)  then
   MessageBox(0,'恭喜补丁成功','系统提示',64) else  MessageBox(0,'不好意思补丁失败','系统提示',64)
  end;

  ResumeThread(ProcInfo.hThread);
  CloseHandle(ProcInfo.hProcess);
  CloseHandle(ProcInfo.hThread);
end;

end.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Delphi获取进程的CPU和内存信息,可以使用Windows API函数来实现。以下是一种实现方式: 首先,需要在Delphi代码引入Windows单元,以便使用相关API函数。可以在代码的unit部分添加"Windows"。 获取进程的CPU信息,可以使用GetProcessTimes函数。该函数返回的是一个FILETIME结构体,包含了进程的用户模式和内核模式执行时间。可以通过计算时间差来获取CPU使用率。具体步骤如下: 1. 使用OpenProcess函数打开进程句柄。该函数需要传入进程的ID和访问权限(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ)。 2. 调用GetProcessTimes函数,传入进程句柄和用于保存CPU信息的FILETIME结构体。 3. 等待一段时间,然后再次调用GetProcessTimes函数,传入相同的进程句柄和FILETIME结构体。 4. 计算两次获取的FILETIME结构体的时间差,即为进程的CPU使用时间。 获取进程内存信息,可以使用GetProcessMemoryInfo函数。该函数返回的是一个PROCESS_MEMORY_COUNTERS_EX结构体,包含了进程内存使用情况。具体步骤如下: 1. 使用OpenProcess函数打开进程句柄。该函数需要传入进程的ID和访问权限(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ)。 2. 调用GetProcessMemoryInfo函数,传入进程句柄和用于保存内存信息的PROCESS_MEMORY_COUNTERS_EX结构体。 3. 可以从返回的结构体获取进程的实际物理内存使用量。 需要注意的是,获取进程的CPU和内存信息需要适当的时间间隔来获取准确的数据。另外,还需要做好错误处理,确保API函数的调用成功。 以上是一种简单的实现方式,在实际使用还可以根据需求进行更加详细的处理和展示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值