Delphi ReadProcessMemory问题

时间:2011-01-25 03:33:55

标签: delphi

它读取前3个地址是正确的,最后一个错误...忽略垃圾代码我是菜鸟我无法弄清楚为什么第4个地址无论怎样即使我使用相同的地址作为其中一个其他人返回错误的值...

procedure ReadFirstCard(Address: Integer);
var
Handle,i,a,b,c : Integer;
begin
GetWindowThreadProcessId(FindWindow(nil, PAnsiChar(Client)), @ProcessId);
Handle := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessId);
ReadProcessMemory(Handle, Ptr(Address), @NewValue, Data, CardRead);
CloseHandle(Handle);
end;

procedure ReadFirstCardSuit(Address2: Integer);
var
Handle,i,a,b,c : Integer;
begin
GetWindowThreadProcessId(FindWindow(nil, PAnsiChar(Client)), @ProcessId);
Handle := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessId);
ReadProcessMemory(Handle, Ptr(Address2), @NewValue2, Data2, CardRead2);
CloseHandle(Handle);
end;

procedure ReadSecondCard(Address3: Integer);
var
Handle,i,a,b,c : Integer;
begin
GetWindowThreadProcessId(FindWindow(nil, PAnsiChar(Client)), @ProcessId);
Handle := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessId);
ReadProcessMemory(Handle, Ptr(Address3), @NewValue3, Data3, CardRead3);
CloseHandle(Handle);
end;

procedure ReadSecondCardSuit(Address4: Integer);
var
Handle,i,a,b,c : Integer;
begin
GetWindowThreadProcessId(FindWindow(nil, PAnsiChar(Client)), @ProcessId);
Handle := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessId);
ReadProcessMemory(Handle, Ptr(Address4), @NewValue4, Data4, CardRead4);
CloseHandle(Handle);
end;

1 个答案:

答案 0 :(得分:4)

由于第四个功能的唯一不同之处在于它使用Data4代替Data1Data3Data4似乎不能拥有NewValue4正确的值,用于从目标进程复制的字节数。确保OpenProcess足够大,以便接收整个结果。

您没有检查任何这些API函数的返回值,因此如果它们失败,您将永远不会知道它。确保ReadProcessMemory返回有效句柄,并确保GetLastError返回非零值。如果他们不这样做,请致电{{1}}找出原因。