-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMemRecordUnit.pas
More file actions
394 lines (358 loc) · 12.2 KB
/
MemRecordUnit.pas
File metadata and controls
394 lines (358 loc) · 12.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
unit MemRecordUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls;
resourcestring
String_MemEditTitle='内存查看与编辑: ';
String_MemEditHelp='搜索十六进制在数据前加 $ (比如: $10 等于 16)'#13#10+
'@点中表格可以直接按键1~F修改'#13#10+
'@数据可以在下面的输入框中输入,点击前面的类型按钮直接修改.'#13#10+
'@还可以双击编辑表加入或者编辑指定的内存地址. ' ;
String_maxLockNum='太多的锁定地址(最大%d),请(保存后)删除部分无用的地址.';
String_AddToLockOk='成功加入锁定地址列表.';
String_ModifyLockOK='编辑锁定的条目成功.';
String_DirectlyModifyOK='直接修改内存成功.';
String_DirectlyModifyBAD='修改失败,该地址受系统写保护.';
String_needAddLock='加入锁定地址列表';
String_needEditLock='编辑锁定的条目';
String_tolongString='改变超过16个字符,请用<内存查看与修改> 对话框';
String_TaskName='任务名:';
type
TMemRecordForm = class(TForm)
Label1: TLabel;
Name_CB: TComboBox;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
MemRecord_info_LB: TLabel;
Address_Edit: TEdit;
value_edit: TEdit;
Lock_valuetype_cb: TComboBox;
AddorMod_Sb: TSpeedButton;
close_sb: TSpeedButton;
modify_sb: TSpeedButton;
LockType_Rg: TRadioGroup;
Calc_sb: TSpeedButton;
Help_sb: TSpeedButton;
mem_sb: TSpeedButton;
TaskName_Edit: TEdit;
procedure close_sbClick(Sender: TObject);
procedure Help_sbClick(Sender: TObject);
procedure Calc_sbClick(Sender: TObject);
procedure Lock_valuetype_cbChange(Sender: TObject);
procedure modify_sbClick(Sender: TObject);
procedure mem_sbClick(Sender: TObject);
procedure AddorMod_SbClick(Sender: TObject);
private
{ Private declarations }
public
Procedure FormRefresh;
{ Public declarations }
end;
var
MemRecordForm: TMemRecordForm;
var Task_name:String;
Lock_Name:String;
Lock_Address:Dword;
Lock_value:String;
Lock_ValueType:integer;
Lock_Type:Integer;
Lock_Info:Integer;
implementation
uses GPkernel,InputhelpUnit, MyCalcUnit, MemEditUnit, MainUnit;
{$R *.dfm}
procedure TMemRecordForm.close_sbClick(Sender: TObject);
begin
Close;
end;
Procedure TMemRecordForm.FormRefresh;
begin
TaskName_edit.Text:=String_TaskName+Task_name;
Name_CB.Text:=Lock_Name;
Address_edit.Text:=intToHex(Lock_Address,8);
value_edit.Text:=Lock_value;
case Lock_ValueType of
Byte_value: Lock_valuetype_cb.ItemIndex:=0;
Word_value: Lock_valuetype_cb.ItemIndex:=1;
Dword_value: Lock_valuetype_cb.ItemIndex:=2;
int64_value: Lock_valuetype_cb.ItemIndex:=3;
Single_value: Lock_valuetype_cb.ItemIndex:=4;
Double_value: Lock_valuetype_cb.ItemIndex:=5;
String_value: Lock_valuetype_cb.ItemIndex:=6;
end;
LockType_Rg.ItemIndex:= Lock_Type;
case Lock_Info of
0:AddorMod_Sb.Caption:=String_needAddLock;
1:AddorMod_Sb.Caption:=String_needAddLock;
2:AddorMod_Sb.Caption:=String_needEditLock;
end;
end;
procedure TMemRecordForm.Help_sbClick(Sender: TObject);
begin
if not assigned(InputhelpForm)then InputhelpForm:=TInputhelpForm.Create(self);
InputhelpForm.Showmodal;
InputhelpForm.Free;
InputhelpForm:=nil;
end;
procedure TMemRecordForm.Calc_sbClick(Sender: TObject);
begin
MyCalcForm.show;
end;
procedure TMemRecordForm.Lock_valuetype_cbChange(Sender: TObject);
var tempAddress:Dword;
Ecode:integer;
TempByte:Byte;
TempWord:Word;
TempDword:Dword;
Tempint64:int64;
TempSingle:Single;
TempDouble:Double;
TempStringBYte:array[1..16] of BYte;
TempString:String;
I:integer;
begin
case Lock_valueType_cb.ItemIndex of
0:Lock_ValueType:=Byte_value;
1:Lock_ValueType:=Word_value;
2:Lock_ValueType:=Dword_value;
3:Lock_ValueType:=Int64_value;
4:Lock_ValueType:=Single_value;
5:Lock_ValueType:=Double_value;
6:Lock_ValueType:=String_value;
end;
Val('$'+Address_Edit.Text,tempAddress,Ecode);
if Ecode>0 then begin beep;Address_Edit.SelectAll; Exit; end;
Lock_Address:=tempAddress;
try
case Lock_ValueType of
Byte_value: begin
ReadMemory(CurrentProcessID,tempAddress,@tempByte,Byte_value);
Lock_value:=IntToStr(tempByte);
end ;
Word_value: begin
ReadMemory(CurrentProcessID,tempAddress,@TempWord,Word_value);
Lock_value:=IntToStr(TempWord);
end ;
Dword_value: begin
ReadMemory(CurrentProcessID,tempAddress,@TempDword,Dword_value);
Lock_value:=IntToStr(TempDword);
end ;
Int64_value: begin
ReadMemory(CurrentProcessID,tempAddress,@Tempint64,Int64_value);
Lock_value:=IntToStr(Tempint64);
end ;
Single_value: begin
ReadMemory(CurrentProcessID,tempAddress,@TempSingle,Single_value);
Lock_value:=FloatToStr(TempSingle);
end ;
Double_value: begin
ReadMemory(CurrentProcessID,tempAddress,@TempDouble,Double_value);
Lock_value:=FloatToStr(tempDouble);
end ;
String_value: begin
Readmemory(CurrentProcessID,tempAddress,@TempStringBYTE,String_value);
Tempstring:='';
for i:=1 to 16 do Tempstring:=Tempstring+chr(TempstringBYTE[i]);
Lock_value:=tempString;
end ;
end;
Value_Edit.text:=Lock_Value;
Except
end;
end;
procedure TMemRecordForm.modify_sbClick(Sender: TObject);
var tempAddress:Dword;
Ecode:integer;
TempByte:Byte;
TempWord:Word;
TempDword:Dword;
Tempint64:int64;
TempSingle:Single;
TempDouble:Double;
TempString:String[16];
Modok:boolean;
begin
Modok:=False;
Val('$'+Address_Edit.Text,tempAddress,Ecode);
if Ecode>0 then begin Address_edit.SelectAll;beep; exit;end;
Lock_Address:=tempAddress;
case Lock_ValueType of
Byte_value: begin
val(Value_edit.Text,tempbyte,Ecode);
if Ecode>0 then begin Value_edit.SelectAll;beep; exit;end;
Modok:=WriteMemory(CurrentProcessID,tempAddress,@tempByte,Byte_value,1);
end ;
Word_value: begin
val(Value_edit.Text,TempWord,Ecode);
if Ecode>0 then begin Value_edit.SelectAll;beep; exit;end;
Modok:=WriteMemory(CurrentProcessID,tempAddress,@tempWord,Word_value,2);
end ;
Dword_value: begin
val(Value_edit.Text,tempDword,Ecode);
if Ecode>0 then begin Value_edit.SelectAll;beep; exit;end;
Modok:=WriteMemory(CurrentProcessID,tempAddress,@tempDword,Dword_value,4);
end ;
Int64_value: begin
val(Value_edit.Text,tempint64,Ecode);
if Ecode>0 then begin Value_edit.SelectAll;beep; exit;end;
Modok:=WriteMemory(CurrentProcessID,tempAddress,@tempint64,int64_value,8);
end ;
Single_value: begin
val(Value_edit.Text,tempSingle,Ecode);
if Ecode>0 then begin Value_edit.SelectAll;beep; exit;end;
Modok:=WriteMemory(CurrentProcessID,tempAddress,@tempSingle,Single_value,4);
end ;
Double_value: begin
val(Value_edit.Text,tempDouble,Ecode);
if Ecode>0 then begin Value_edit.SelectAll;beep; exit;end;
Modok:=WriteMemory(CurrentProcessID,tempAddress,@tempDouble,Double_value,8);
end ;
String_value: begin
if Length(Value_edit.Text)>16 then
begin
showmessage(String_tolongString);
Exit;
end else
TempString:=Value_edit.Text;
Modok:=WriteMemory(CurrentProcessID,tempAddress,@TempString[1],String_value,Length(TempString));
end ;
end;
if Modok then MemRecord_info_LB.Caption:=String_DirectlyModifyOK else
MemRecord_info_LB.Caption:=String_DirectlyModifyBAD;
MemRecord_Info_LB.Font.Color:=Random($FFFFFF);
end;
procedure TMemRecordForm.mem_sbClick(Sender: TObject);
var TempAddress:Dword;
Ecode:Integer;
begin
val('$'+Address_Edit.Text,TempAddress,Ecode);
if Ecode>0 then begin Address_Edit.SelectAll;beep;exit;end;
MemReadStartAddress:=(TempAddress and $FFFFFFF0);//去掉最后一位s
MemEditForm.Caption:=String_MemEditTitle+'<'+thetask[CurrenttaskIndex].Name+'>';
memeditForm.Address_Edit.Text:=intToHex(MemReadStartAddress,8);
Myrect.Left:=(TempAddress and $F)+1; //得到最后一位
Myrect.Top:=1;
Myrect.Right:=Myrect.Left;
Myrect.Bottom:=1;
MemEditForm.MEM_sg.Selection:=Myrect;
MemEditForm.show;
end;
procedure TMemRecordForm.AddorMod_SbClick(Sender: TObject);
Var i:integer;
tempAddress:Dword;
TempByte:Byte;
TempWord:Word;
TempDword:Dword;
Tempint64:int64;
TempSingle:Single;
TempDouble:Double;
TempString:String[16];
Ecode:Integer;
theIndex:integer;
begin
////////////////////////////////////////////////////////////////
Val('$'+Address_Edit.Text,tempAddress,Ecode);
if Ecode>0 then begin Address_edit.SelectAll;beep; exit;end;
Lock_Address:=tempAddress;
case Lock_valueType_cb.ItemIndex of
0:Lock_ValueType:=Byte_value;
1:Lock_ValueType:=Word_value;
2:Lock_ValueType:=Dword_value;
3:Lock_ValueType:=Int64_value;
4:Lock_ValueType:=Single_value;
5:Lock_ValueType:=Double_value;
6:Lock_ValueType:=String_value;
end;
try
case Lock_ValueType of
Byte_value: begin
val(Value_edit.Text,tempbyte,Ecode);
if Ecode>0 then begin Value_edit.SelectAll;beep; exit;end;
end ;
Word_value: begin
val(Value_edit.Text,TempWord,Ecode);
if Ecode>0 then begin Value_edit.SelectAll;beep; exit;end;
end ;
Dword_value: begin
val(Value_edit.Text,tempDword,Ecode);
if Ecode>0 then begin Value_edit.SelectAll;beep; exit;end;
end ;
Int64_value: begin
val(Value_edit.Text,tempint64,Ecode);
if Ecode>0 then begin Value_edit.SelectAll;beep; exit;end;
end ;
Single_value: begin
val(Value_edit.Text,tempSingle,Ecode);
if Ecode>0 then begin Value_edit.SelectAll;beep; exit;end;
end ;
Double_value: begin
val(Value_edit.Text,tempDouble,Ecode);
if Ecode>0 then begin Value_edit.SelectAll;beep; exit;end;
end ;
String_value: begin
if Length(Value_edit.Text)>16 then
begin
showmessage(String_tolongString);
Exit;
end else
TempString:=Value_edit.Text;
end ;
end;
Lock_Value:=Value_Edit.text;
Except
end;
//////////////////////////////////////////////
if Lock_Info<>2 then
begin
if LockNum>=MaxLockNum then
begin
Showmessage(String_maxLockNum);
Exit;
end;
for i:=1 to MaxLockNum do if memLockRecord[i].Applyed=False then Break;
Inc(LockNum);
MemLockRecord[i].Applyed:=True;
ListToLockIndex[LockNum]:=i;
with memLockRecord[i] do
begin
Description:=Name_CB.Text;
Address:=Lock_Address;
valueStr:=Lock_value;
VarType:=Lock_ValueType; ///这些都在 Found_LVMouseDown
ProcessID:=CurrentProcessID;
if LockType_Rg.ItemIndex=0 then
Frozen :=True else Frozen :=False;
Applyed:=true; //运用/闲置标志
end;
with MainForm.Lock_LV.Items.add do
begin
Caption:='';
Subitems.Add('');
Subitems.Add('');
Subitems.Add('');
Subitems.Add('');
Subitems.Add('');
end;
MemRecord_info_LB.Caption:=String_AddToLockOk;
MainForm.UpdateLockInfo(i,LockNum-1);
end;
if (Lock_Info=2) and (mainForm.Lock_lv.Selected<>nil)then
begin
theIndex:=ListToLockIndex[mainForm.Lock_lv.Selected.Index+1];
with memLockRecord[theIndex] do
begin
Description:=Name_CB.Text;
Address:=Lock_Address;
valueStr:=Lock_value;
VarType:=Lock_ValueType; ///这些都在 Found_LVMouseDown
ProcessID:=CurrentProcessID;
if LockType_Rg.ItemIndex=0 then
Frozen :=True else Frozen :=False;
Applyed:=true; //运用/闲置标志
end;
MemRecord_info_LB.Caption:=String_ModifyLockOK;
MainForm.UpdateLockInfo(theIndex,mainForm.Lock_lv.Selected.Index);
end;
end;
end.