?? archiveeditunit.pas
字號:
{
name:(1999.12.1 -jhx1)
江湖行 II jhx2
2002.10.13 renamed to 'GamePaladin II'
CopyRight:XuGanQuan gqxunet#163.com
Description:A game cheat tool
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
}
unit ArchiveEditUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Gauges, ComCtrls, ToolWin, StdCtrls, Buttons, ExtCtrls,ChildFormUnit,
ImgList, Menus;
resourcestring
String_Filenotask='沒有文件搜索任務,請新建加入;';
String_Filenoresult='搜索次數: 0 , 找到數目:0 ';
String_FileScanResult='搜索次數:%d , 找到數目:%d ';
String_FileInScan='當前的文件搜索任務正在進行,請等待.';
String_FileInScanTitle='文件搜索任務進行信息';
String_InvalidInput='無效的輸入數據,請檢查.';
String_Addtask='還沒有文件搜索任務 ,是否現在創建?';
String_Addtasktitle='沒有文件搜索任務信息';
String_InScan='當前的任務正在進行,請等待.';
String_InScanTitle='任務進行信息';
String_FileTaskinvalid='對應的存檔文件不存在. ';
String_FileTypeNoMatch='輸入的類型不匹配上次類型(高階/低階),'+
'你想進行新類型的搜索嗎?';
String_FileTypeNoMatchTitle='輸入的類型不匹配信息';
String_FileAskRepeatInitLowLevelTitle='文件低階搜索重復初始化信息';
String_FileAskRepeatInitLowLevel='已經進行了初始化文件的低階搜索,'#13#10+
'是否再次初始化?';
String_FileNoResultAgainTitle='無結果信息';
String_FileNoResultAgain='抱歉,找不到任何匹配的地址,是否再次搜索?';
String_InvalidByte='%s 不是合法的 Byte 類型數據,請檢查';
String_InvalidWord='%s 不是合法的 Word 類型數據,請檢查';
String_InvalidDword='%s 不是合法的 Dword 類型數據,請檢查';
String_InvalidInt64='%s 不是合法的 Int64 類型數據,請檢查k';
String_InvalidSingle='%s 不是合法的 Single 類型數據,請檢查';
String_InvalidDouble='%s 不是合法的 Double 類型數據,請檢查';
String_InvalidString='%s 不是合法的 Text 類型數據,請檢查';
String_FileTaskResult='任務: %s '#13#10'找到 %d 個地址,'#13#10'用時 %f 秒.';
String_FileTaskResultTitle='搜索結果';
String_FileInitialLowLevel='文件搜索任務:%s'#13#10'低階搜索初始化完成.';
type
TArchiveEditForm = class(TChildForm)
temp_Panel1: TPanel;
ToolBar1: TToolBar;
AddFIle_TB: TToolButton;
delFile_tb: TToolButton;
Filetasks_LV: TListView;
Splitter1: TSplitter;
Panel1: TPanel;
Splitter2: TSplitter;
Panel2: TPanel;
Scan_bn: TSpeedButton;
EditFile_Sb: TSpeedButton;
InputHelp_SB: TSpeedButton;
Value_Edit: TEdit;
VarType_CB: TComboBox;
Panel3: TPanel;
File_Info_SearchResult_LB: TLabel;
File_info_Name_LB: TLabel;
Edit_LV: TListView;
Found_LV: TListView;
Panel4: TPanel;
Scan_Gauge: TGauge;
ImageList1: TImageList;
DisplayFileScanProcess: TTimer;
PopupMenu1: TPopupMenu;
delFiletask_menu: TMenuItem;
N1: TMenuItem;
ClearFileTask_menu: TMenuItem;
PopupMenu2: TPopupMenu;
PopupMenu3: TPopupMenu;
Addtolists: TMenuItem;
N2: TMenuItem;
EditAddress: TMenuItem;
DeleteFileEditAddress: TMenuItem;
ClearAllAddress: TMenuItem;
N4: TMenuItem;
ModifyFileEdit: TMenuItem;
EditFileAddress: TMenuItem;
StaticText1: TStaticText;
procedure AddFIle_TBClick(Sender: TObject);
procedure delFile_tbClick(Sender: TObject);
procedure Filetasks_LVEdited(Sender: TObject; Item: TListItem;
var S: String);
procedure Filetasks_LVClick(Sender: TObject);
procedure Scan_bnClick(Sender: TObject);
procedure DisplayFileScanProcessTimer(Sender: TObject);
procedure InputHelp_SBClick(Sender: TObject);
procedure Value_EditKeyPress(Sender: TObject; var Key: Char);
procedure VarType_CBChange(Sender: TObject);
procedure ClearFileTask_menuClick(Sender: TObject);
procedure Found_LVDblClick(Sender: TObject);
procedure Found_LVMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure EditFile_SbClick(Sender: TObject);
procedure EditAddressClick(Sender: TObject);
procedure DeleteFileEditAddressClick(Sender: TObject);
procedure ClearAllAddressClick(Sender: TObject);
procedure ModifyFileEditClick(Sender: TObject);
procedure Edit_LVMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure EditFileAddressClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure InitFiletask(theID:Integer);
function checkandGetFileSize(FileName:string):Dword;
Procedure AddTasktoList(theIndex:integer);
Procedure UpdateTaskInfo(theIndex:integer);
Procedure AddFoundToListView(theIndex:integer);
Procedure RaiseInputError;
function AnalyseScan(theIndex:Integer):integer;
function CheckForScan:boolean;
function ReadFileData(theFileName:String;theAddress:Dword;Valuetype:integer):string;
end;
Type
TFileFirstScanThread=class(TThread)
private
TheTaskIndex:integer;
protected
procedure Execute; override;
public
constructor Create(theIndex:Integer);
end;
type
TFileNextScanThread=class(TThread)
private
TheTaskIndex:integer;
protected
procedure Execute; override;
public
constructor Create(theIndex:Integer);
end;
const
Auto_value=0;
Byte_value=1;
word_value=2;
Dword_value=3;
int64_value=4;
Single_value=5;
Double_Value=6;
String_Value=7;
CommonLevel_Value=10;
Number_Scan = 101;
String_Scan=102;
LowLevel_Value=20;
InitialLowLevel_Scan =201;
Increased_Scan =202;
Decreased_Scan = 203;
Changed_Scan = 204;
Unchanged_Scan = 205;
const Max_FileTaskNUm=255;
type
TFiletask=record
Applyed:Boolean; ///占用
name:String;
index:integer;
FilepathName:String;
ScanType:integer; //Number_Scan:= ]
OldScanType:integer;
VarType:integer; //選擇某一類型后,實際搜索類型auto
OldVarType:integer;
ScanValue:string;
TotalProcess:Dword; ///應掃描總的地指數
NowProcess:Dword; ////掃描數量
InSearchProcess:Boolean; ///是否正在掃描,防止多次點擊
SearchTimes:DWORD; //掃描次數
AttachedNum:DWORD;
SaveFileName:String; ///存檔文件最新備份
AddressMemStream:TMemoryStream; //幾下每個符合的地址
end;
var theFileTask:array[1..Max_FileTaskNUm]of TFiletask;
CurrentFileTaskIndex:Integer;
ListToFileTaskIndex:array[1..Max_FileTaskNUm] of Integer; //listview 對應任務Index
FileTaskNUm:Integer=0; ///任務個數
ErrorInputNum:BYTE;
CanUpdateFileTask:Integer=-999; ///防止更新閃爍,
var
ArchiveEditForm: TArchiveEditForm;
implementation
uses AddFileTaskUnit, InputhelpUnit, FileRecordUnit, FileEditUnit;
{$R *.dfm}
////
function TArchiveEditForm.checkAndGetFileSize(FileName:string):Dword;
var FHandle:Integer;
TempSize:Int64;
begin
result:=0;
if not FileExists(FileName) then
begin
showmessage(format(string_NotExists,[FileName]));
exit;
end;
FHandle := FileOpen(FileName, fmOpenWrite or fmShareDenyNone);
try
begin
if (FHandle<0) then
begin
showmessage(format(string_cannotopen,[FileName]));
exit;
end;
TempSize:=GetFileSize(FHandle,nil);
if (TempSize=0) or (TempSize>=$4000000) then
begin
showmessage(format(String_InvalidFile,[FileName]));
exit;
end else result:=Tempsize;
end;
finally
FileClose(FHandle);
end;
end;
//////////////初始化任務//////////////////////////////////
procedure TArchiveEditForm.InitFiletask(theID:Integer);
begin
with theFileTask[theId] do
begin
Applyed:=True;
name:='';
//index:integer;
FilepathName:='';
ScanType:=Number_Scan; //Number_Scan:= ]
OldScanType:=ScanType;
VarType:=Auto_value; //選擇某一類型后,實際搜索類型auto
OldVarType:=Auto_value;
ScanValue:='';
TotalProcess:=0;
NowProcess:=0;
SearchTimes:=0;
AttachedNum:=0;
InSearchProcess:=False;
SaveFileName:='';
if Assigned(AddressmemStream)then
AddressMemStream.SetSize(0) else
AddressMemStream:=TmemoryStream.Create;
end;
end;
Procedure TArchiveEditForm.AddTasktoList(theIndex:integer);
begin
with FileTasks_LV.Items.Add do
begin
Caption:=theFileTask[theIndex].Name;
end;
end;
Procedure TArchiveEditForm.UpdateTaskInfo(theIndex:integer);
begin
if FiletaskNum=0 then
begin
File_info_Name_LB.Caption:=String_Filenotask;
File_Info_SearchResult_LB.Caption:=String_Filenoresult;
Found_lv.Clear;
end else
begin
With theFileTask[theIndex] do
begin
File_info_Name_LB.Caption:=Name;
File_Info_SearchResult_LB.Caption:=Format(String_FileScanResult,[SearchTimes,AttachedNum]);
end;
end;
end;
///////////////////////////////////
//////////根據輸入的值判斷scantype//////////////////////////////////////////////////
Function GetScanTypeAndTempVar(InputValue:String;theFiletaskIndex:integer):Integer;
var Len:integer;
begin
Result:=-999;
with theFiletask[theFiletaskIndex] do
begin
Len:=length(inputValue);
if InputValue='' then
Exit
else if inputvalue[1]='?' then
begin
VarType:=LowLevel_value;
Result:=InitialLowLevel_Scan;
end
else if InputValue[1]='!' then
begin
VarType:=LowLevel_value;
Result:=Changed_Scan;
end
else if InputValue[1]='=' then
begin
VarType:=LowLevel_value;
Result:=UnChanged_Scan;
end
else if InputValue[1]='+' then
begin
VarType:=LowLevel_value;
Result:=Increased_scan;
end
else if InputValue[1]='-' then
begin
VarType:=LowLevel_value;
Result:=Decreased_scan ;
end
else if (
((Len>2) and ( Len<255) ) and
(
((InputValue[1]='"') and (InputValue[Len]='"')) or
((InputValue[1]='''') and (InputValue[Len]=''''))
)
)
then
begin
ScanValue:=Copy(inputValue,2,Len-2);
VarType:=CommonLevel_value;
Result:=String_Scan;
end
else begin
ScanValue:=inputValue;
/////Vartype必須考慮Combobox的選擇
Result:=Number_Scan;
end;
end; ///with end;
end;
//////////////////////////////////////////////////////////////////
/////////////hex to int///////////////////////////////////////////////////////////////////////////////
Function HexIntChange(inStr:string):String;
var Len:integer;
TempString:String;
begin
Len:=Length(inStr);
if (Len>2) and ( UpperCase(instr[1])+UpperCase(instr[2])='0X' )then
begin
TempString:='$'+Copy(Instr,3,Len-2);
try
Result:=inttoStr(Strtoint(TempString));
except
showmessage(String_InvalidInput);
end;
Exit;
end;
if (Len>1) and (instr[1]='$') then
begin
try
Result:=inttoStr(Strtoint(instr));
except
showmessage(String_InvalidInput);
end;
Exit;
end;
result:=instr;
end;
////////////根據輸入值判斷輸出可用///////////////////////////////////////////////////////
Function GetVarTypeAndVarValue(InputValue:String;theFileTaskIndex:integer):Integer;
var ByteTemp:Byte;
WordTemp:word;
DwordTemp:Dword;
Int64Temp:int64;
SingleTemp:Single;
DoubleTemp:Double;
ECode:integer;
begin
Result:=-999; //error value
with theFileTask[theFileTaskIndex] do
begin
if (ScanType<>Number_Scan) and (ScanType<>String_Scan) then
begin
Result:=LowLevel_value;
Exit;
end;
if (ScanType=String_Scan) then
begin
ScanValue:=inputvalue;
Result:=CommonLevel_value;
Exit;
end;
if ScanType=Number_Scan then
begin
if (VarType=Auto_value) then
begin
//is integer
if pos('.',inputValue)=0 then
try
begin
inputValue:=HexIntChange(inputValue);
val(inputvalue,int64Temp,Ecode);
if Ecode>0 then Exit;
ScanValue:=inputValue;
if (int64Temp shr 8)=0 then Result:=Byte_value
else if (int64Temp shr 16)=0 then Result:=Word_value
else if (int64Temp shr 32)=0 then Result:=DWord_value
else if (int64Temp shr 64)=0 then Result:=Int64_value
else Result:=Int64_value;
exit;
end;
except
Exit;
end;
//is float
if pos('.',inputValue)>0 then
try
begin
val(inputValue,DoubleTemp,Ecode);
if Ecode>0 then Exit;
ScanValue:=inputValue;
if ( DoubleTemp-Exp(ln(2)*128)>0 ) or ( DoubleTemp-Exp(ln(2)*(-126))<0) then
Result:=Double_value else
Result:=single_value;
exit;
end;
except
exit;
end;
end///Auto_value
else
begin
case VarType of
Byte_value: begin
val(InputValue,ByteTemp,Ecode);
if Ecode<>0 then Exit else
begin
ScanValue:=InputValue;
Result:=Byte_value;
end;
end;
Word_value: begin
val(InputValue,WordTemp,Ecode);
if Ecode<>0 then Exit else
begin
ScanValue:=InputValue;
Result:=Word_value;
end;
end;
Dword_value: begin
val(InputValue,DwordTemp,Ecode);
if Ecode<>0 then Exit else
begin
ScanValue:=InputValue;
Result:=DWord_value;
end;
end;
Int64_value: begin
val(InputValue,int64Temp,Ecode);
if Ecode<>0 then Exit else
begin
ScanValue:=InputValue;
Result:=Int64_value;
end;
end;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -