scanthread.pas

来自「这是一段游戏修改工具的源代码.ring3功能由dephi开发,驱动是C开发.希望」· PAS 代码 · 共 150 行

PAS
150
字号
unit ScanThread;interfaceuses  Classes,windows,ScktComp,stdctrls,ComCtrls,sysutils;//scanoptionsconst  SO_FASTSCAN=$1;  SO_HEXADECIMAL=$2;  SO_READONLY=$4;  SO_FINDONLYONE=$8;  SO_ISBINARY=$10;  SO_UNICODE=$20;type  TScanThread = class(TThread)  private    { Private declarations }    scanresults: int64;    stringlist: TStringlist;    lasterror: string;    Procedure SendResults;    procedure ScanFailed;  public    Firstscan: boolean;    StartAddress:Dword;    StopAddress:Dword;    Scantype: byte;    Vartype: byte;    ScanValue: string;    max: word;    ScanOptions: byte;    progressbar: TProgressbar;  protected    procedure Execute; override;  end;implementationuses unit1,cefuncproc;{ Important: Methods and properties of objects in visual components can only be  used in a method called using Synchronize, for example,      Synchronize(UpdateCaption);  and UpdateCaption could look like,    procedure TScanThread.UpdateCaption;    begin      Form1.Caption := 'Updated in a thread';    end; }{ TScanThread }Procedure TScanThread.ScanFailed;begin  with form1 do  begin    log.Lines.Add('The scan failed. Reason:'+lasterror);    output[0]:=SC_ScanFailed;    sendbuf(1);  end;end;Procedure TScanThread.SendResults;var i,j: integer;begin  j:=0;  for i:=0 to stringlist.count-1 do  with form1 do  begin    if j>1024 then    begin      sendbuf(j);      j:=0;    end;    output[j]:=SC_ScanResult;    inc(j);    output[j]:=length(stringlist[i]);    inc(j);    copymemory(@output[j],@stringlist[i][1],output[j-1]);    inc(j,length(stringlist[i]));  end;  form1.sendbuf(j);  form1.output[0]:=SC_ScanResultCount;  pint64(@form1.output[1])^:=scanresults;  form1.SendBuf(9);  form1.Log.Lines.Add('done scanning');  Form1.SThread:=nil;end;procedure TScanThread.Execute;var count: int64;begin  { Place thread code here }  FreeOnTerminate:=true;  progressbar.Max:=100;  progressbar.Position:=0;  progressbar.Step:=1;  stringlist:=TStringlist.Create;    //check the parameters to see how to scan    try      if firstscan then      begin        if scantype=Advanced_Scan then        begin          //get memory ranges          scanresults:=GetMemoryRanges2(startaddress,stopaddress,(scanoptions and SO_READONLY)=SO_READONLY,Progressbar,vartype,(scanoptions and SO_FASTSCAN)=SO_FASTSCAN);        end        else        begin          //get memory ranges and scan          scanresults:=GetMemoryRangesAndScanValue2(startaddress,stopaddress,(scanoptions and SO_READONLY)=SO_READONLY,(scanoptions and SO_FINDONLYONE)=SO_FINDONLYONE,scantype,vartype,stringlist,scanvalue,'0',rounded,max,(scanoptions and SO_HEXADECIMAL)=SO_HEXADECIMAL,progressbar,(scanoptions and SO_FASTSCAN)=SO_FASTSCAN,(scanoptions and SO_UNICODE)=SO_UNICODE);        end;      end      else      begin        //nextscan        scanresults:=NextScan2(stringlist,scanvalue,'0',scantype,vartype,rounded,max,(scanoptions and SO_HEXADECIMAL)=SO_HEXADECIMAL,progressbar,(scanoptions and SO_FASTSCAN)=SO_FASTSCAN,(scanoptions and SO_UNICODE)=SO_UNICODE,false);      end;      Synchronize(SendResults);    except      on E: Exception do      begin        LastError:=e.Message;        Synchronize(ScanFailed);      end;    end;  //when done scanning send the results to the client  stringlist.free;end;end.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?