📄 memscan.pas.svn-base
字号:
foundaddressb: byte;
//===============Local functions================//
function getBytecountArrayOfByteString(st: string): integer;
var bytes: tbytes;
begin
ConvertStringToBytes(st,false,bytes);
result:=length(bytes);
end;
function getBytecountBinaryString(st:string; scanvalueisdecimal: boolean): integer;
var value: dword;
i: integer;
begin
if scanvalueisdecimal then //first convert do binarystring
st:=inttobin(strtoint(st));
result:=0;
for i:=1 to length(st) do
begin
case st[i] of
'0','1','?','*': inc(result);
' ',#8: ; //ignore
else raise exception.Create(st[i]+' is not a valid character inside a binary string');
end;
end;
if result=0 then raise exception.Create('Invalid binary notation');
if (result mod 8=0) then
result:=1+result div 8
else
result:=2+(result div 8);
end;
//==================TScanner===================//
//-----------=====Scanner check routines=====--------------//
function TScanner.AllExact(newvalue,oldvalue: pointer):boolean;
var i: TVariableType;
begin
typesmatch[vtByte]:=typesmatch[vtByte] and ByteExact(newvalue,oldvalue); //oldvalue=nil, but give it anyhow
typesmatch[vtWord]:=typesmatch[vtWord] and WordExact(newvalue,oldvalue);
typesmatch[vtDword]:=typesmatch[vtDword] and DwordExact(newvalue,oldvalue);
typesmatch[vtQword]:=typesmatch[vtQword] and qwordExact(newvalue,oldvalue);
typesmatch[vtSingle]:=typesmatch[vtSingle] and singleExact(newvalue,oldvalue);
typesmatch[vtDouble]:=typesmatch[vtDouble] and doubleExact(newvalue,oldvalue);
result:=false;
for i:=vtbyte to vtdouble do
if typesmatch[i] then
begin
result:=true;
exit;
end;
end;
function TScanner.AllBetween(newvalue,oldvalue: pointer):boolean;
var i: TVariableType;
begin
typesmatch[vtByte]:=typesmatch[vtByte] and ByteBetween(newvalue,oldvalue);
typesmatch[vtWord]:=typesmatch[vtWord] and WordBetween(newvalue,oldvalue);
typesmatch[vtDword]:=typesmatch[vtDword] and DwordBetween(newvalue,oldvalue);
typesmatch[vtQword]:=typesmatch[vtQword] and qwordBetween(newvalue,oldvalue);
typesmatch[vtSingle]:=typesmatch[vtSingle] and singleBetween(newvalue,oldvalue);
typesmatch[vtDouble]:=typesmatch[vtDouble] and doubleBetween(newvalue,oldvalue);
result:=false;
for i:=vtbyte to vtdouble do
if typesmatch[i] then
begin
result:=true;
exit;
end;
end;
function TScanner.AllBiggerThan(newvalue,oldvalue: pointer):boolean;
var i: TVariableType;
begin
typesmatch[vtByte]:=typesmatch[vtByte] and ByteBiggerThan(newvalue,oldvalue);
typesmatch[vtWord]:=typesmatch[vtWord] and WordBiggerThan(newvalue,oldvalue);
typesmatch[vtDword]:=typesmatch[vtDword] and DwordBiggerThan(newvalue,oldvalue);
typesmatch[vtQword]:=typesmatch[vtQword] and qwordBiggerThan(newvalue,oldvalue);
typesmatch[vtSingle]:=typesmatch[vtSingle] and singleBiggerThan(newvalue,oldvalue);
typesmatch[vtDouble]:=typesmatch[vtDouble] and doubleBiggerThan(newvalue,oldvalue);
result:=false;
for i:=vtbyte to vtdouble do
if typesmatch[i] then
begin
result:=true;
exit;
end;
end;
function TScanner.AllSmallerThan(newvalue,oldvalue: pointer):boolean;
var i: TVariableType;
begin
typesmatch[vtByte]:=typesmatch[vtByte] and ByteSmallerThan(newvalue,oldvalue);
typesmatch[vtWord]:=typesmatch[vtWord] and WordSmallerThan(newvalue,oldvalue);
typesmatch[vtDword]:=typesmatch[vtDword] and DwordSmallerThan(newvalue,oldvalue);
typesmatch[vtQword]:=typesmatch[vtQword] and qwordSmallerThan(newvalue,oldvalue);
typesmatch[vtSingle]:=typesmatch[vtSingle] and singleSmallerThan(newvalue,oldvalue);
typesmatch[vtDouble]:=typesmatch[vtDouble] and doubleSmallerThan(newvalue,oldvalue);
result:=false;
for i:=vtbyte to vtdouble do
if typesmatch[i] then
begin
result:=true;
exit;
end;
end;
function TScanner.AllIncreasedValue(newvalue,oldvalue: pointer):boolean;
var i: TVariableType;
begin
typesmatch[vtByte]:=typesmatch[vtByte] and ByteIncreasedValue(newvalue,oldvalue);
typesmatch[vtWord]:=typesmatch[vtWord] and WordIncreasedValue(newvalue,oldvalue);
typesmatch[vtDword]:=typesmatch[vtDword] and DwordIncreasedValue(newvalue,oldvalue);
typesmatch[vtQword]:=typesmatch[vtQword] and qwordIncreasedValue(newvalue,oldvalue);
typesmatch[vtSingle]:=typesmatch[vtSingle] and singleIncreasedValue(newvalue,oldvalue);
typesmatch[vtDouble]:=typesmatch[vtDouble] and doubleIncreasedValue(newvalue,oldvalue);
result:=false;
for i:=vtbyte to vtdouble do
if typesmatch[i] then
begin
result:=true;
exit;
end;
end;
function TScanner.AllIncreasedValueBy(newvalue,oldvalue: pointer):boolean;
var i: TVariableType;
begin
typesmatch[vtByte]:=typesmatch[vtByte] and ByteIncreasedValueBy(newvalue,oldvalue);
typesmatch[vtWord]:=typesmatch[vtWord] and WordIncreasedValueBy(newvalue,oldvalue);
typesmatch[vtDword]:=typesmatch[vtDword] and DwordIncreasedValueBy(newvalue,oldvalue);
typesmatch[vtQword]:=typesmatch[vtQword] and qwordIncreasedValueBy(newvalue,oldvalue);
typesmatch[vtSingle]:=typesmatch[vtSingle] and singleIncreasedValueBy(newvalue,oldvalue);
typesmatch[vtDouble]:=typesmatch[vtDouble] and doubleIncreasedValueBy(newvalue,oldvalue);
result:=false;
for i:=vtbyte to vtdouble do
if typesmatch[i] then
begin
result:=true;
exit;
end;
end;
function TScanner.AllDecreasedValue(newvalue,oldvalue: pointer):boolean;
var i: TVariableType;
begin
typesmatch[vtByte]:=typesmatch[vtByte] and ByteDecreasedValue(newvalue,oldvalue);
typesmatch[vtWord]:=typesmatch[vtWord] and WordDecreasedValue(newvalue,oldvalue);
typesmatch[vtDword]:=typesmatch[vtDword] and DwordDecreasedValue(newvalue,oldvalue);
typesmatch[vtQword]:=typesmatch[vtQword] and qwordDecreasedValue(newvalue,oldvalue);
typesmatch[vtSingle]:=typesmatch[vtSingle] and singleDecreasedValue(newvalue,oldvalue);
typesmatch[vtDouble]:=typesmatch[vtDouble] and doubleDecreasedValue(newvalue,oldvalue);
result:=false;
for i:=vtbyte to vtdouble do
if typesmatch[i] then
begin
result:=true;
exit;
end;
end;
function TScanner.AllDecreasedValueBy(newvalue,oldvalue: pointer):boolean;
var i: TVariableType;
begin
typesmatch[vtByte]:=typesmatch[vtByte] and ByteDecreasedValueBy(newvalue,oldvalue);
typesmatch[vtWord]:=typesmatch[vtWord] and WordDecreasedValueBy(newvalue,oldvalue);
typesmatch[vtDword]:=typesmatch[vtDword] and DwordDecreasedValueBy(newvalue,oldvalue);
typesmatch[vtQword]:=typesmatch[vtQword] and qwordDecreasedValueBy(newvalue,oldvalue);
typesmatch[vtSingle]:=typesmatch[vtSingle] and singleDecreasedValueBy(newvalue,oldvalue);
typesmatch[vtDouble]:=typesmatch[vtDouble] and doubleDecreasedValueBy(newvalue,oldvalue);
result:=false;
for i:=vtbyte to vtdouble do
if typesmatch[i] then
begin
result:=true;
exit;
end;
end;
function TScanner.Allchanged(newvalue,oldvalue: pointer):boolean;
var i: TVariableType;
begin
typesmatch[vtByte]:=typesmatch[vtByte] and ByteChanged(newvalue,oldvalue);
typesmatch[vtWord]:=typesmatch[vtWord] and WordChanged(newvalue,oldvalue);
typesmatch[vtDword]:=typesmatch[vtDword] and DwordChanged(newvalue,oldvalue);
typesmatch[vtQword]:=typesmatch[vtQword] and qwordChanged(newvalue,oldvalue);
typesmatch[vtSingle]:=typesmatch[vtSingle] and singleChanged(newvalue,oldvalue);
typesmatch[vtDouble]:=typesmatch[vtDouble] and doubleChanged(newvalue,oldvalue);
result:=false;
for i:=vtbyte to vtdouble do
if typesmatch[i] then
begin
result:=true;
exit;
end;
end;
function TScanner.AllUnchanged(newvalue,oldvalue: pointer):boolean;
var i: TVariableType;
begin
typesmatch[vtByte]:=typesmatch[vtByte] and ByteUnchanged(newvalue,oldvalue);
typesmatch[vtWord]:=typesmatch[vtWord] and WordUnchanged(newvalue,oldvalue);
typesmatch[vtDword]:=typesmatch[vtDword] and DwordUnchanged(newvalue,oldvalue);
typesmatch[vtQword]:=typesmatch[vtQword] and qwordUnchanged(newvalue,oldvalue);
typesmatch[vtSingle]:=typesmatch[vtSingle] and singleUnchanged(newvalue,oldvalue);
typesmatch[vtDouble]:=typesmatch[vtDouble] and doubleUnchanged(newvalue,oldvalue);
result:=false;
for i:=vtbyte to vtdouble do
if typesmatch[i] then
begin
result:=true;
exit;
end;
end;
function TScanner.CaseSensitiveAnsiStringExact(newvalue,oldvalue: pointer):boolean;
var i: integer;
begin
result:=false;
for i:=1 to length(scanvalue1) do
if scanvalue1[i]<>(pchar(newvalue)[i-1]) then exit;
result:=true;
end;
function TScanner.CaseInsensitiveAnsiStringExact(newvalue,oldvalue: pointer):boolean;
var i: integer;
begin
//scanvalue1 has already been converted to uppercase in config
result:=false;
for i:=1 to length(scanvalue1) do
begin
if pchar(newvalue)[(i-1)] in ['a'..'z'] then //change to uppercase
dec(pbytearray(newvalue)[(i-1)],$20);
if scanvalue1[i]<>(pchar(newvalue)[i-1]) then exit;
end;
result:=true; //it got here, so a match
end;
function TScanner.CaseSensitiveUnicodeStringExact(newvalue,oldvalue: pointer):boolean;
var i: integer;
begin
result:=false;
for i:=1 to length(scanvalue1) do
if widescanvalue1[i]<>(pwidechar(newvalue)[i-1]) then exit;
result:=true;
end;
function TScanner.CaseInsensitiveUnicodeStringExact(newvalue,oldvalue: pointer):boolean;
var i: integer;
scanvaluellength: integer;
pwidescanvalue: pchar;
begin
result:=false;
i:=0;
scanvaluellength:=length(scanvalue1)*sizeof(widechar);
pwidescanvalue:=@widescanvalue1[1];
for i:=1 to length(scanvalue1) do
begin
if pchar(newvalue)[(i-1)*sizeof(wchar)] in ['a'..'z'] then //change to uppercase
dec(pbytearray(newvalue)[(i-1)*sizeof(wchar)],$20);
if widescanvalue1[i]<>(pwidechar(newvalue)[i-1]) then exit;
end;
result:=true; //it got here, so a match
end;
function TScanner.ArrayOfByteExact(newvalue,oldvalue: pointer):boolean;
var i: integer;
begin
for i:=0 to abs_arraylength-1 do
if (abs_arraytofind[i]<>-1) and (pbytearray(newvalue)[i]<>abs_arraytofind[i]) then
begin
result:=false; //no match
exit;
end;
result:=true; //still here, so a match
end;
function TScanner.BinaryExact(newvalue,oldvalue: pointer):boolean;
var i: integer;
begin
for i:=0 to 7 do
binaryresults[i]:=((puint64(newvalue)^ shr i) and andmask)=bitmask;
//no need for a result here, for binary that isn't checked (special case)
result:=true; //let the store result routine deal with it
end;
//byte:
function TScanner.ByteExact(newvalue,oldvalue: pointer):boolean;
begin
result:=pbyte(newvalue)^=byte(value);
end;
function TScanner.ByteBetween(newvalue,oldvalue: pointer):boolean;
begin
result:=(pbyte(newvalue)^>=byte(value)) and (pbyte(newvalue)^<=byte(value2));
end;
function TScanner.ByteBiggerThan(newvalue,oldvalue: pointer):boolean;
begin
result:=pbyte(newvalue)^>byte(value);
end;
function TScanner.ByteSmallerThan(newvalue,oldvalue: pointer):boolean;
begin
result:=pbyte(newvalue)^<byte(value);
end;
function TScanner.ByteIncreasedValue(newvalue,oldvalue: pointer):boolean;
begin
result:=pbyte(newvalue)^>pbyte(oldvalue)^;
end;
function TScanner.ByteIncreasedValueBy(newvalue,oldvalue: pointer):boolean;
begin
result:=pbyte(newvalue)^=pbyte(oldvalue)^+byte(value);
end;
function TScanner.ByteDecreasedValue(newvalue,oldvalue: pointer):boolean;
begin
result:=pbyte(newvalue)^<pbyte(oldvalue)^;
end;
function TScanner.ByteDecreasedValueBy(newvalue,oldvalue: pointer):boolean;
begin
result:=pbyte(newvalue)^=pbyte(oldvalue)^-byte(value);
end;
function TScanner.ByteChanged(newvalue,oldvalue: pointer):boolean;
begin
result:=pbyte(newvalue)^<>pbyte(oldvalue)^;
end;
function TScanner.ByteUnchanged(newvalue,oldvalue: pointer):boolean; //also used for same as first
begin
result:=pbyte(newvalue)^=pbyte(oldvalue)^;
end;
//word:
function TScanner.WordExact(newvalue,oldvalue: pointer): boolean;
begin
result:=pword(newvalue)^=word(value);
end;
function TScanner.WordBetween(newvalue,oldvalue: pointer):boolean;
begin
result:=(pword(newvalue)^>=word(value)) and (pword(newvalue)^<=word(value2));
end;
function TScanner.WordBiggerThan(newvalue,oldvalue: pointer):boolean;
begin
result:=pword(newvalue)^>word(value);
end;
function TScanner.WordSmallerThan(newvalue,oldvalue: pointer):boolean;
begin
result:=pword(newvalue)^<word(value);
end;
function TScanner.WordIncreasedValue(newvalue,oldvalue: pointer):boolean;
begin
result:=pword(newvalue)^>pword(oldvalue)^;
end;
function TScanner.WordIncreasedValueBy(newvalue,oldvalue: pointer):boolean;
begin
result:=pword(newvalue)^=pword(oldvalue)^+word(value);
end;
function TScanner.WordDecreasedValue(newvalue,oldvalue: pointer):boolean;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -