📄 memscan.pas.svn-base
字号:
begin
result:=pword(newvalue)^<pword(oldvalue)^;
end;
function TScanner.WordDecreasedValueBy(newvalue,oldvalue: pointer):boolean;
begin
result:=pword(newvalue)^=pword(oldvalue)^-word(value);
end;
function TScanner.WordChanged(newvalue,oldvalue: pointer):boolean;
begin
result:=pword(newvalue)^<>pword(oldvalue)^;
end;
function TScanner.WordUnchanged(newvalue,oldvalue: pointer):boolean;
begin
result:=pword(newvalue)^=pword(oldvalue)^;
end;
//dword:
function TScanner.DWordExact(newvalue,oldvalue: pointer): boolean;
begin
result:=pdword(newvalue)^=dword(value);
end;
function TScanner.DWordBetween(newvalue,oldvalue: pointer):boolean;
begin
result:=(pdword(newvalue)^>=dword(value)) and (pdword(newvalue)^<=dword(value2));
end;
function TScanner.DWordBiggerThan(newvalue,oldvalue: pointer):boolean;
begin
result:=pdword(newvalue)^>dword(value);
end;
function TScanner.DWordSmallerThan(newvalue,oldvalue: pointer):boolean;
begin
result:=pdword(newvalue)^<dword(value);
end;
function TScanner.DWordIncreasedValue(newvalue,oldvalue: pointer):boolean;
begin
result:=pdword(newvalue)^>pdword(oldvalue)^;
end;
function TScanner.DWordIncreasedValueBy(newvalue,oldvalue: pointer):boolean;
begin
result:=pdword(newvalue)^=pdword(oldvalue)^+dword(value);
end;
function TScanner.DWordDecreasedValue(newvalue,oldvalue: pointer):boolean;
begin
result:=pdword(newvalue)^<pdword(oldvalue)^;
end;
function TScanner.DWordDecreasedValueBy(newvalue,oldvalue: pointer):boolean;
begin
result:=pdword(newvalue)^=pdword(oldvalue)^-dword(value);
end;
function TScanner.DWordChanged(newvalue,oldvalue: pointer):boolean;
begin
result:=pdword(newvalue)^<>pdword(oldvalue)^;
end;
function TScanner.DWordUnchanged(newvalue,oldvalue: pointer):boolean;
begin
result:=pdword(newvalue)^=pdword(oldvalue)^;
end;
//int64
function TScanner.QWordExact(newvalue,oldvalue: pointer): boolean;
begin
result:=puint64(newvalue)^=uint64(value);
end;
function TScanner.QWordBetween(newvalue,oldvalue: pointer):boolean;
begin
result:=(puint64(newvalue)^>=uint64(value)) and (puint64(newvalue)^<=uint64(value2));
end;
function TScanner.QWordBiggerThan(newvalue,oldvalue: pointer):boolean;
begin
result:=puint64(newvalue)^>uint64(value);
end;
function TScanner.QWordSmallerThan(newvalue,oldvalue: pointer):boolean;
begin
result:=puint64(newvalue)^<uint64(value);
end;
function TScanner.QWordIncreasedValue(newvalue,oldvalue: pointer):boolean;
begin
result:=puint64(newvalue)^>puint64(oldvalue)^;
end;
function TScanner.QWordIncreasedValueBy(newvalue,oldvalue: pointer):boolean;
begin
result:=puint64(newvalue)^=puint64(oldvalue)^+value;
end;
function TScanner.QWordDecreasedValue(newvalue,oldvalue: pointer):boolean;
begin
result:=puint64(newvalue)^<puint64(oldvalue)^;
end;
function TScanner.QWordDecreasedValueBy(newvalue,oldvalue: pointer):boolean;
begin
result:=puint64(newvalue)^=puint64(oldvalue)^-value;
end;
function TScanner.QWordChanged(newvalue,oldvalue: pointer):boolean;
begin
result:=puint64(newvalue)^<>puint64(oldvalue)^;
end;
function TScanner.QWordUnchanged(newvalue,oldvalue: pointer):boolean;
begin
result:=puint64(newvalue)^=puint64(oldvalue)^;
end;
//single:
function TScanner.SingleExact(newvalue,oldvalue: pointer): boolean;
var min,max: single;
begin
result:=false;
case roundingtype of
rtRounded:
result:=(RoundTo(psingle(newvalue)^,-floataccuracy)=svalue);
rtExtremerounded:
result:=(psingle(newvalue)^>minsvalue) and (psingle(newvalue)^<maxsvalue);
rtTruncated:
result:=(psingle(newvalue)^>=svalue) and (psingle(newvalue)^<maxsvalue);
end;
end;
function TScanner.SingleBetween(newvalue,oldvalue: pointer):boolean;
begin
result:=(psingle(newvalue)^>=svalue) and (psingle(newvalue)^<=svalue2);
end;
function TScanner.SingleBiggerThan(newvalue,oldvalue: pointer):boolean;
begin
result:=psingle(newvalue)^>svalue;
end;
function TScanner.SingleSmallerThan(newvalue,oldvalue: pointer):boolean;
begin
result:=psingle(newvalue)^<svalue;
end;
function TScanner.SingleIncreasedValue(newvalue,oldvalue: pointer):boolean;
begin
result:=psingle(newvalue)^>psingle(oldvalue)^;
end;
function TScanner.SingleIncreasedValueBy(newvalue,oldvalue: pointer):boolean;
begin
result:=RoundTo(psingle(newvalue)^,-floataccuracy)=RoundTo(psingle(oldvalue)^+svalue,-floataccuracy);
end;
function TScanner.SingleDecreasedValue(newvalue,oldvalue: pointer):boolean;
begin
result:=psingle(newvalue)^<psingle(oldvalue)^;
end;
function TScanner.SingleDecreasedValueBy(newvalue,oldvalue: pointer):boolean;
begin
result:=RoundTo(psingle(newvalue)^,-floataccuracy)=RoundTo(psingle(oldvalue)^-svalue,-floataccuracy);
end;
function TScanner.SingleChanged(newvalue,oldvalue: pointer):boolean;
begin
result:=pSingle(newvalue)^<>pSingle(oldvalue)^;
end;
function TScanner.SingleUnchanged(newvalue,oldvalue: pointer):boolean;
begin
result:=pSingle(newvalue)^=pSingle(oldvalue)^;
end;
//double:
function TScanner.DoubleExact(newvalue,oldvalue: pointer): boolean;
begin
result:=false;
case roundingtype of
rtRounded:
result:=(RoundTo(pdouble(newvalue)^,-floataccuracy)=dvalue);
rtExtremerounded:
result:=(pdouble(newvalue)^>mindvalue) and (pdouble(newvalue)^<maxdvalue);
rtTruncated:
result:=(pdouble(newvalue)^>=dvalue) and (pdouble(newvalue)^<maxdvalue);
end;
end;
function TScanner.DoubleBetween(newvalue,oldvalue: pointer):boolean;
begin
result:=(pdouble(newvalue)^>=dvalue) and (pdouble(newvalue)^<=dvalue2);
end;
function TScanner.DoubleBiggerThan(newvalue,oldvalue: pointer):boolean;
begin
result:=pdouble(newvalue)^>dvalue;
end;
function TScanner.DoubleSmallerThan(newvalue,oldvalue: pointer):boolean;
begin
result:=pdouble(newvalue)^<dvalue;
end;
function TScanner.DoubleIncreasedValue(newvalue,oldvalue: pointer):boolean;
begin
result:=pdouble(newvalue)^>pdouble(oldvalue)^;
end;
function TScanner.DoubleIncreasedValueBy(newvalue,oldvalue: pointer):boolean;
begin
result:=RoundTo(pdouble(newvalue)^,-floataccuracy)=RoundTo(pdouble(oldvalue)^+svalue,-floataccuracy);
end;
function TScanner.DoubleDecreasedValue(newvalue,oldvalue: pointer):boolean;
begin
result:=pdouble(newvalue)^<pdouble(oldvalue)^;
end;
function TScanner.DoubleDecreasedValueBy(newvalue,oldvalue: pointer):boolean;
begin
result:=RoundTo(pdouble(newvalue)^,-floataccuracy)=RoundTo(pdouble(oldvalue)^-svalue,-floataccuracy);
end;
function TScanner.DoubleChanged(newvalue,oldvalue: pointer):boolean;
begin
result:=pDouble(newvalue)^<>pDouble(oldvalue)^;
end;
function TScanner.DoubleUnchanged(newvalue,oldvalue: pointer):boolean;
begin
result:=pDouble(newvalue)^=pDouble(oldvalue)^;
end;
//=============Save result routines===========//
procedure TScanner.GenericSaveResult(address: dword; oldvalue: pointer);
{
Generic routine for storing results. Use as last resort. E.g custom scans
}
begin
//save varsize
pdwordarray(CurrentAddressBuffer)[found]:=address;
copyMemory(pointer(dword(CurrentFoundBuffer)+(variablesize*found)),oldvalue,variablesize);
inc(found);
if found>=buffersize then
flushroutine;
end;
procedure TScanner.ByteSaveResult(address: dword; oldvalue: pointer);
begin
//save address and current value
pdwordarray(CurrentAddressBuffer)[found]:=address;
pbytearray(CurrentFoundBuffer)[found]:=pbyte(oldvalue)^;
inc(found);
if found>=buffersize then
flushroutine;
end;
procedure TScanner.WordSaveResult(address: dword; oldvalue: pointer);
begin
pdwordarray(CurrentAddressBuffer)[found]:=address;
pwordarray(CurrentFoundBuffer)[found]:=pword(oldvalue)^;
inc(found);
if found>=buffersize then
flushroutine;
end;
procedure TScanner.DWordSaveResult(address: dword; oldvalue: pointer);
begin
pdwordarray(CurrentAddressBuffer)[found]:=address;
pdwordarray(CurrentFoundBuffer)[found]:=pdword(oldvalue)^;
inc(found);
if found>=buffersize then
flushroutine;
end;
procedure TScanner.QWordSaveResult(address: dword; oldvalue: pointer);
begin
pdwordarray(CurrentAddressBuffer)[found]:=address;
puint64array(CurrentFoundBuffer)[found]:=puint64(oldvalue)^;
inc(found);
if found>=buffersize then
flushroutine;
end;
procedure TScanner.SingleSaveResult(address: dword; oldvalue: pointer);
begin
if not (isnan(psingle(oldvalue)^) or IsInfinite(psingle(oldvalue)^)) then
begin
pdwordarray(CurrentAddressBuffer)[found]:=address;
psinglearray(CurrentFoundBuffer)[found]:=psingle(oldvalue)^;
inc(found);
if found>=buffersize then
flushroutine;
end;
end;
procedure TScanner.DoubleSaveResult(address: dword; oldvalue: pointer);
begin
if not (isnan(pdouble(oldvalue)^) or IsInfinite(pdouble(oldvalue)^)) then
begin
pdwordarray(CurrentAddressBuffer)[found]:=address;
pdoublearray(CurrentFoundBuffer)[found]:=pdouble(oldvalue)^;
inc(found);
if found>=buffersize then
flushroutine;
end;
end;
procedure TScanner.arrayOfByteSaveResult(address: dword; oldvalue: pointer);
begin
pdwordarray(CurrentAddressBuffer)[found]:=address;
inc(found);
if found>=buffersize then
flushroutine;
end;
procedure TScanner.binarySaveResult(address: dword; oldvalue: pointer);
var i: integer;
begin
for i:=0 to 7 do
begin
if binaryresults[i] then
begin
PBitAddressArray(CurrentAddressBuffer)[found].address:=address;
PBitAddressArray(CurrentAddressBuffer)[found].bit:=i;
inc(found);
if found>=buffersize then
flushroutine;
end;
end;
end;
procedure TScanner.allSaveResult(address: dword; oldvalue: pointer);
{
note: eventually replace bit with a binary representation of all types that match
BUT, don't forget to change the foundlisthelper to handle this (since it'd be
multiple addresses in one entry, which isn't handled right now...
}
var i: TVariabletype;
begin
for i:=vtByte to vtDouble do
begin
if typesmatch[i] then
begin
if (i=vtsingle) then
begin
//filter out NAN and INF
if isnan(psingle(oldvalue)^) or IsInfinite(psingle(oldvalue)^) then
continue; //skip, don't save
end;
if (i=vtdouble) then
begin
if isnan(pdouble(oldvalue)^) or IsInfinite(pdouble(oldvalue)^) then
continue; //skip, don't save
end;
//using the bitaddressarray since it holds a address and a value big enough to hold all types
PBitAddressArray(CurrentAddressBuffer)[found].address:=address;
PBitAddressArray(CurrentAddressBuffer)[found].bit:=integer(i);
//save the current address, max variablesize is 8 bytes, so just store that
puint64array(CurrentFoundBuffer)[found]:=puint64(oldvalue)^;
inc(found);
if found>=buffersize then
flushroutine;
end;
end;
end;
//=============Flush result routines===========//
procedure TScanner.genericFlush;
var tempaddress,tempfound: pointer;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -