add a deviate option for pointers must end with offset. (Handy for fixing pointers after an update)

This commit is contained in:
Dark Byte 2022-10-14 16:49:04 +02:00
parent 2e1107b7a2
commit a75bb09eb3
6 changed files with 181 additions and 91 deletions

View File

@ -12,7 +12,7 @@ object frmPointerScannerSettings: TfrmPointerScannerSettings
OnDestroy = FormDestroy
OnShow = FormShow
Position = poScreenCenter
LCLVersion = '2.0.6.0'
LCLVersion = '2.2.2.0'
object cbValueType: TComboBox
AnchorSideLeft.Control = cbAddress
AnchorSideLeft.Side = asrBottom
@ -831,11 +831,11 @@ object frmPointerScannerSettings: TfrmPointerScannerSettings
Left = 0
Height = 48
Top = 44
Width = 214
Width = 216
AutoSize = True
BevelOuter = bvNone
ClientHeight = 48
ClientWidth = 214
ClientWidth = 216
TabOrder = 4
Visible = False
object edtBaseFrom: TEdit
@ -844,11 +844,12 @@ object frmPointerScannerSettings: TfrmPointerScannerSettings
AnchorSideTop.Control = Panel12
AnchorSideRight.Control = Panel12
AnchorSideRight.Side = asrBottom
Left = 28
Left = 30
Height = 23
Top = 0
Width = 186
Anchors = [akTop, akRight]
BorderSpacing.Left = 2
TabOrder = 0
end
object Label2: TLabel
@ -882,11 +883,12 @@ object frmPointerScannerSettings: TfrmPointerScannerSettings
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Panel12
AnchorSideRight.Side = asrBottom
Left = 28
Left = 30
Height = 23
Top = 25
Width = 186
Anchors = [akTop, akRight]
BorderSpacing.Left = 2
BorderSpacing.Top = 2
TabOrder = 1
end
@ -1005,71 +1007,44 @@ object frmPointerScannerSettings: TfrmPointerScannerSettings
Left = 720
Top = 232
Bitmap = {
4C69020000001000000010000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006360
F80AFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF007774FF1F7774
FF2BFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00625FF82B5D5B
F76F5956F53EFFFFFF00FFFFFF00FFFFFF00FFFFFF007774FF1F7A77FFFF7976
FEFF726FFD2BFFFFFF00FFFFFF00FFFFFF00FFFFFF00615EF82B6461F8FF6A68
F9FF5451F3A84F4DF229FFFFFF00FFFFFF007774FF1F7A77FFFF817EFFFF817E
FEFF7471FDFF6C69FB2BFFFFFF00FFFFFF00605DF72B625FF8FF6F6DFBFF7E7C
FFFF625FF8FF4A47F06F4542EE02FFFFFF007673FF087471FEFD7D7AFEFF8A87
FFFF7C79FDFF6C69FBFF6361F92B5F5CF72B615EF8FF6E6CFAFF7D7AFFFF615F
F7FF4946F0FC4441EE05FFFFFF00FFFFFF00FFFFFF00716EFD086E6BFCFC7774
FDFF8682FFFF7673FCFF6462F8FF605DF7FF6D6AFAFF7B79FFFF605DF7FF4845
EFFC4341EE08FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006967FB086663
F9FC706DFBFF807EFFFF7E7BFFFF7C79FFFF7977FFFF5E5CF7FF4744EFFC4240
EE08FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00615E
F8085D5AF6FD7D79FFFF5E5BFFFF5B58FFFF7674FFFF4643EFFD413FED08FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005C59
F62B5D5BF7FF7976FFFF5956FFFF5754FFFF7270FFFF4846F0FF3C39EB2BFFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005B58F62B5C5A
F6FF6764FAFF7472FFFF7370FFFF706EFFFF6E6CFFFF5755F7FF3F3DEEFF3230
E82BFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005A57F52B5B59F6FF6663
FAFF7471FFFF5A58F6FF4341EEFC3E3CECFD504DF4FF6867FFFF504EF5FF3634
EBFF2A27E52BFFFFFF00FFFFFF00FFFFFF005956F52B5B58F6FF6562FAFF7170
FFFF5956F6FF4240EEFC3E3BEC083937EB083532E9FC4745F2FF6362FFFF4A48
F4FF2F2DE9FF2220E32BFFFFFF00FFFFFF005451F3415856F5FF6361FAFF5855
F6FF413FEDFC3D3AEC08FFFFFF00FFFFFF00302DE7082C2AE6FC413FF1FF4C4A
F6FF312FEAFF1F1DE241FFFFFF00FFFFFF00FFFFFF004A47F0414F4CF2FF403E
EDFD3C39EB08FFFFFF00FFFFFF00FFFFFF00FFFFFF002725E5082422E4FC312F
EAFF1F1DE241FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003F3DED413B38
EB08FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00211FE3081E1C
E241FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00EAC39DFFE6BF96FFE4BB92FFE4BB92FFD1A06CF5D09E6DF6CC96
5FDAC479427EB2673C09FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00E5BE96FFFFFFFEFFFDF3E9FFFDF3EAFFFCF2E8FFFAEFE3FFFAF2
E7FFEABB88FFCF8555B3B4693D0CFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00E4BB93FFFEF5EDFFFCDEC5FFFBE0C7FFF9DCC2FFF5D3B4FFFEF9
F3FFFAE2C4FFECC193FFC37D4893FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00E4BB92FFFEF6F0FFFCE2CDFFFCE3CDFFFADFC8FFF7D9BCFFF5E9
DDFFFAF3EBFFFBF8F3FFCA8353FEFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00E4BB92FFFEF7F1FFFCE5D2FFFCE4D1FFFBE2CCFFF9DDC4FFF6D7
BBFFF3D1AFFFFAEFE4FFCC8758FE34B4D9D05EC2E1FA60C3E2FA60C3E2FA60C3
E2FA5FC3E2FAE4BB91FFFFF7F2FFFEE7D5FFFEE7D5FFFDE5D1FFFAE0CAFFF9DE
C4FFF7D9BCFFFDF2E7FFCC8757FE36B3DAF8FDFEFEFFFEFFFFFFFEFEFFFFFDFE
FFFFFEFFFFFFE4BA91FFFFF7F0FFFFE7D5FFFDE7D6FFFDE6D4FFFCE4D0FFFBE3
CBFFFADCC2FFFEF3E8FFCC8656FE35AFDAF0F7FCFEFF8EE4F8FF91DEF5FF9FE0
F5FFACE1F6FFCA8452FFFFF7F1FFFFE9D9FFFFEADBFFFFE9D9FFFFE7D7FFFFE5
D2FFFFE2CBFFFFF7F1FFCB8555FE36AADAF2F1FAFDFF94DEF5FF93DCF4FF64BC
E9FF3594DAFF3594DAFF3594DAFF3594DAFF3594DAFF3594DAFF3594DAFF3594
DAFF3594DAFFFBF6EFFFCC8355FE35ABDAFAE8F6FBFF70BCE7FF55AAE2FF4DA5
E0FF91C9EBFFFAF3EFFFFDFEFDFFFFFDFCFFFFFDFCFFFEFDFCFFFEFCFBFFFEFE
FDFF3594DAFFEFF2E8FFCE8156FF37A6DAFAFEFFFFFFF8FDFFFFF6FDFFFFF5FC
FFFFF3FCFEFF9AE4F4FF9AE6F7FF9BE6F6FF9DE5F5FF9EE5F5FF9FE5F4FFDAF3
F8FF3594DAFFFDF4EEFFCA8054F936A1DAF9F6FCFEFF94E5F8FF93E5F8FF93E5
F8FF91E5F8FF93DBE9FF93D7E3FF93D2DCFF90CED7FF8CC8CFFF86C1C6FFC9D8
D6FF3594DAFFC57444E8CA7F53F1369ADAF8F2FAFDFF94E6F8FF92E5F8FF90E5
F8FF8BE3F8FF86E2F7FF7FE1F7FF77DEF6FF6CDCF6FF5ED9F4FF4FD5F3FFCCF2
FBFF3594DAFFFFFFFF00FFFFFF003594DAF7EFFAFEFF93E5F8FF8FE4F8FF89E3
F8FF82E1F7FF7ADFF7FF71DEF6FF67DBF5FF5BD8F4FF4DD4F3FF40D1F2FFCAF2
FBFF3594DAFFFFFFFF00FFFFFF00338ED9FBDCF0FAFF98E1F6FF95E0F6FF92DF
F6FF8EDEF5FF89DCF5FF85DAF4FF80D9F4FF7AD7F3FF74D5F3FF70D3F2FFC2EA
F8FF3594DAFFFFFFFF00FFFFFF002C86D8002D88D8F72D87D8F72D88D8F72D88
D8F72D88D8F72D88D8F72D88D8F72D88D8F72D88D8F72D88D8F72D87D8F72D88
D8F72C86D800FFFFFF00FFFFFF00
4C7A020000001000000010000000940400000000000078DAAD92EB6F936518C6
89894935FE092A4A3444CA02221B223B95E3244C50E8E8D61DD8410638B6161A
960D364EB20D35C856240603E8078D411312D92747348CA1500A6C9CB6953246
8F6BBBAD5DDBF7D0F77479BF15160E1DC4C40F579E27799EDF7DB8EE1BC034FC
07556EE05F9EEAADDE82E924ED54EF1565BCB6C4C8D5151630D9A9D8C67AA061
87826D75F25331CA4B796D55398F2D9B1258F771ECE7D5F9D1779E64F736AB52
6031CBA8D92C4EC6D850C2692937EAB68A68DE05A8F7952B2275CB168FBFA0BE
EFD80E8DC5ACC84D8D0ABE680576352479549627B465C59C9672A3B646405323
505EC6E1C3E51169A96EFCC547EB33D7CA9ADACF24A9DE22A3651FB063BB84AA
0A1E941B5BB708D8D980E43D6F59585AA21BD7A4F26773B5A8D95899904C54E7
1EEAA579A75A0B7942BD95167358B1342C2DCE4DCD3EE293A6A488959B882B35
024603D56201962F09CBBA9C31CDF3E65B5CC8AA33A239008505C0FA75C03613
90B73C82CC8521EDB358A381D51617B1A8AE1260D9066C27CE540BF28EE2E839
E4648D63DEDC9194318AD6335A63218B8D95C49A8122030BF249CACE1C95D7E4
C7B1A91A58F311838CF921CC9AE97D2C06ED939672E3D30A0166935A370BF249
CA5E34AA59B820A4499F1790562C8BA2B202589917C79CB40066BCE19E8C41FB
A4331430346F01063D0BF249CAFA6074D2ABB9697ECDEC593E49973381552B59
BC3B2788E9AFB9748FD640FBA45BBD2A8ADCEC31997C7ACAE7996F7B356FCDF0
48A9D887CAC91AD32D7A3F34E58CDE9CEED6BCFE6A6AF6FF56F0FC71F8FE3C0A
4F5747527DDFD730BD27B6B2F6A3658E9E86C5CDBF5567BEF42CDEFBC7513A14
C8B1002908293A0221EC8610F523D8D5866B07F4673A3767BD3215EFE9B24261
C6200D5D8038FC3712CE6E30373AA12462105C3D183D67C5F9A63CEBD47C0714
3602C9750592FB0A847B17C10D9E0513B80B211682C8C760DBBF567926CF4D40
F25E87E4E983E8B22371B7076C7F17627DA7A9170FECAD06657EE7606F69F77D
61C379D7A4CA489EAE76808B42F1DF4A4AF6F64118B62131D493AC43261FECAD
EB958C330E5E5614A885D0015941F2EEF95DE52380CAFA6F43F6DDA43A7A21BA
2F43202F94D808EC2D054AFA69478493141CF2F0681F62707298C1AFF759D83E
FF84F80920300804EFFC7BFAFB01EA07AECBC9B7CB07F44AC629477442907184
58AB338EAAB301A41F713C57221B867DBF5E49FFC5218CB0224C67FDD09F7221
FFC761B45F0A91C761EA45A686A4A4145592483DCA493E4CFB70756F0116FCE4
10D47E79FACA9218FA1EA37E8E79E238E6E3F09D8FC5712F8313A493DE381C31
3EC9CBF171D8F6AC4B64FCE048B0F4FF889787F581DAD5F34E00D67E37ACD79D
387CB51F5F5DBC8696737FE1D2C0ED247FC1B274C4B67BED44C631071F55FBF7
F1E820EE30E94B378F161787DDF739D40FB1A871B2281D8C63F5AD18EC5131C9
3FDC13BA7361EA40CDFB35CDE020B1FB886BBCC7C14C6CF51D06C68138F26FC6
90DB1785ED09FEBD4383A23322E05B9AD937C32C3AEEB13844B338E86470C011
C71ECADBD81F8385729B6E44D11DE41FE367B70C4C4B6B1BE0D25A496DCFD183
3F2AF390FF072C5CDE8E
}
end
object odLoadRegionFile: TOpenDialog

View File

@ -84,6 +84,7 @@ type TOffsetEntry=class(Tedit)
procedure setOffset(x: dword);
protected
procedure KeyPress(var Key: Char); override;
procedure SetParent(NewParent: TWinControl); override;
public
constructor create(AOwner: TComponent); override;
published
@ -222,9 +223,13 @@ type
codescan: boolean;
threadcount: integer;
maxOffsetDeviation: integer;
baseAddressRange: TComponentList;
lblOffsetListMaxDeviation: TLabel;
edtOffsetListMaxDeviation: tedit;
offsetlist: TComponentList;
btnAddOffset: TButton;
btnRemoveOffset: TButton;
@ -282,6 +287,9 @@ resourcestring
rsLastOffset = 'Last offset';
rsHasNotBeenGivenAValidAddress = '%s has not been given a valid address';
rsLimitScanToSpecifiedRegionFile = 'Limit scan to specified region file';
rsMaxDeviation = 'Max deviation';
rsMaxDeviationExplentation = 'The maximum offset size by which the ending '
+'offset can differ';
//helper
@ -498,6 +506,9 @@ begin
if assigned(fonsetfilename) then
fonSetFileName(self);
if (cbAddress.Text='') and (cbAddress.items.count=1) then
cbAddress.ItemIndex:=0;
end;
@ -684,6 +695,14 @@ begin
key:=#0;
end;
procedure TOffsetEntry.SetParent(NewParent: TWinControl);
begin
inherited SetParent(newparent);
if (newparent<>nil) and (newparent is TCustomControl) then
Constraints.MinWidth:=TCustomControl(newparent).canvas.TextWidth(' XXX ');
end;
function TOffsetEntry.getOffset: dword;
var o: integer;
begin
@ -703,6 +722,9 @@ var
comparecount: integer=0;
reg: TRegistry=nil;
begin
if edtOffsetListMaxDeviation<>nil then
maxOffsetDeviation:=strtoint('$'+edtOffsetListMaxDeviation.Text);
if cbMaxOffsetsPerNode.checked then
begin
maxOffsetsPerNode:=strtoint(edtMaxOffsetsPerNode.text);
@ -979,6 +1001,33 @@ begin
btnAddOffset.Width:=i;
btnRemoveOffset.Width:=i;
lblOffsetListMaxDeviation:=TLabel.create(Self);
lblOffsetListMaxDeviation.parent:=panel10;
lblOffsetListMaxDeviation.Caption:=rsMaxDeviation;
lblOffsetListMaxDeviation.AutoSize:=true;
lblOffsetListMaxDeviation.AnchorSideLeft.Control:=cbMustEndWithSpecificOffset;
lblOffsetListMaxDeviation.AnchorSideLeft.Side:=asrRight;
lblOffsetListMaxDeviation.BorderSpacing.Left:=8;
edtOffsetListMaxDeviation:=TEdit.Create(self);
edtOffsetListMaxDeviation.parent:=panel10;
edtOffsetListMaxDeviation.AnchorSideLeft.Control:=lblOffsetListMaxDeviation;
edtOffsetListMaxDeviation.AnchorSideLeft.Side:=asrLeft;
edtOffsetListMaxDeviation.AnchorSideTop.Control:=offsetentry;
edtOffsetListMaxDeviation.AnchorSideTop.Side:=asrtop;
edtOffsetListMaxDeviation.Text:='0';
edtOffsetListMaxDeviation.Hint:=rsMaxDeviationExplentation;
edtOffsetListMaxDeviation.ShowHint:=true;
edtOffsetListMaxDeviation.Constraints.MinWidth:=canvas.TextWidth(' xxx ');
lblOffsetListMaxDeviation.AnchorSideBottom.Control:=edtOffsetListMaxDeviation;
lblOffsetListMaxDeviation.AnchorSideBottom.Side:=asrTop;
lblOffsetListMaxDeviation.Anchors:=[akLeft, akBottom];
edtOffsetListMaxDeviation.Anchors:=[akTop, akLeft];
end
else
begin
@ -988,6 +1037,12 @@ begin
btnAddOffset.Visible:=false;
btnRemoveOffset.Visible:=false;
lblInfoLastOffset.Visible:=false;
if edtOffsetListMaxDeviation<>nil then
edtOffsetListMaxDeviation.free;
if lblOffsetListMaxDeviation<>nil then
lblOffsetListMaxDeviation.free;
end;
updatepositions;
@ -1046,6 +1101,9 @@ begin
begin
tstrings(cbAddress.tag).LoadFromFile(odLoadPointermap.FileName+'.addresslist');
UpdateAddressList(cbAddress);
if (cbAddress.Text='') and (cbAddress.Items.Count=1) then
cbAddress.ItemIndex:=0;
end;
end

View File

@ -9,7 +9,7 @@ interface
uses
{$ifdef windows}
windows, Classes, SysUtils, Sockets, winsock, ssockets, NewKernelHandler;
windows, Classes, SysUtils, Sockets, winsock, ssockets, NewKernelHandler, syncobjs2;
{$endif}
{$ifdef darwin}
Classes, SysUtils, Sockets, ssockets, NewKernelHandler, ctypes, baseunix, macport;
@ -155,7 +155,13 @@ var
i: integer;
t: TTimeVal;
fdset: TFDSet;
{$ifdef THREADNAMESUPPORT}
tname: string;
{$endif}
begin
{$ifdef THREADNAMESUPPORT}
tname:=GetThreadName;
{$endif}
{$ifdef DEBUGPROTOCOL}
timeout:=0; //just let me test in peace
{$endif}
@ -201,18 +207,18 @@ begin
i:={$ifdef unix}fpselect{$else}select{$endif}(socket, nil, @fdset, nil, nil);
if i=0 then
raise TSocketException.create(rsTimeoutWhileSendingData);
raise TSocketException.create({$ifdef THREADNAMESUPPORT}'Thread '+tname+':'+{$endif}rsTimeoutWhileSendingData);
if i<0 then
raise TSocketException.create(rsErrorWhileSendingData+inttostr(socketerror));
raise TSocketException.create({$ifdef THREADNAMESUPPORT}'Thread '+tname+':'+{$endif}rsErrorWhileSendingData+inttostr(socketerror));
i:=0;
end
else
raise TSocketException.Create(rsErrorWhileSendingData+inttostr(i));
raise TSocketException.Create({$ifdef THREADNAMESUPPORT}'Thread '+tname+':'+{$endif}rsErrorWhileSendingData+inttostr(i));
end
else
raise TSocketException.Create(rsDisconnectedWhileSendingData);
raise TSocketException.Create({$ifdef THREADNAMESUPPORT}'Thread '+tname+':'+{$endif}rsDisconnectedWhileSendingData);
end;
inc(result, i);
@ -224,13 +230,20 @@ var
i: integer;
t: TTimeVal;
fdset: TFDSet;
{$ifdef THREADNAMESUPPORT}
tname: string;
{$endif}
begin
{$ifdef THREADNAMESUPPORT}
tname:=GetThreadName;
{$endif}
{$ifdef DEBUGPROTOCOL}
timeout:=0;
{$endif}
if debug_connectionfailure then
raise TSocketException.Create(rsWhoopdeedoo);
raise TSocketException.Create({$ifdef THREADNAMESUPPORT}'Thread '+tname+':'+{$endif}rsWhoopdeedoo);
result:=0;
while (result<size) do
@ -267,20 +280,22 @@ begin
if i=0 then
begin
OutputDebugString('Timeout');
raise TSocketException.create(rsTimeoutWhileReceivingData);
raise TSocketException.create({$ifdef THREADNAMESUPPORT}'Thread '+tname+':'+{$endif}rsTimeoutWhileReceivingData);
end;
if i<0 then
raise TSocketException.create(rsErrorWhileReceivingData+inttostr(i));
raise TSocketException.create({$ifdef THREADNAMESUPPORT}'Thread '+tname+':'+{$endif}rsErrorWhileReceivingData+inttostr(i));
i:=0;
end
else
raise TSocketException.Create(rsErrorWhileReceivingData+inttostr(i));
begin
raise TSocketException.Create({$ifdef THREADNAMESUPPORT}'Thread '+tname+':'+{$endif}rsErrorWhileReceivingData+inttostr(i));
end;
end
else
raise TSocketException.Create(rsDisconnectedWhileReceivingData);
raise TSocketException.Create({$ifdef THREADNAMESUPPORT}'Thread '+tname+':'+{$endif}rsDisconnectedWhileReceivingData);
end;
inc(result, i);

View File

@ -309,6 +309,7 @@ type
mustEndWithSpecificOffset: boolean;
mustEndWithSpecificOffsetMaxDeviation: dword;
mustendwithoffsetlist: array of dword;
onlyOneStaticInPath: boolean;
noReadOnly: boolean;
@ -551,7 +552,11 @@ begin
if fcontroller.compressedptr then
begin
EntrySize:=fcontroller.MaxBitCountModuleOffset+fcontroller.MaxBitCountModuleIndex+fcontroller.MaxBitCountLevel+fcontroller.MaxBitCountOffset*(fcontroller.maxlevel-length(fcontroller.mustendwithoffsetlist));
if fcontroller.mustEndWithSpecificOffsetMaxDeviation=0 then
EntrySize:=fcontroller.MaxBitCountModuleOffset+fcontroller.MaxBitCountModuleIndex+fcontroller.MaxBitCountLevel+fcontroller.MaxBitCountOffset*(fcontroller.maxlevel-length(fcontroller.mustendwithoffsetlist))
else
EntrySize:=fcontroller.MaxBitCountModuleOffset+fcontroller.MaxBitCountModuleIndex+fcontroller.MaxBitCountLevel+fcontroller.MaxBitCountOffset*(fcontroller.maxlevel);
EntrySize:=(EntrySize+7) div 8;
end
else
@ -801,6 +806,7 @@ begin
s.WriteQWord(BaseStop);
s.WriteByte(ifthen(onlyOneStaticInPath,1,0));
s.writebyte(ifthen(mustEndWithSpecificOffset,1,0));
s.writeDword(mustEndWithSpecificOffsetMaxDeviation);
s.writeWord(length(mustendwithoffsetlist));
for i:=0 to length(mustendwithoffsetlist)-1 do
s.WriteDWord(mustendwithoffsetlist[i]);
@ -3505,7 +3511,11 @@ begin
MaxBitCountModuleOffset:=32;
MaxBitCountLevel:=getMaxBitCount(maxlevel-length(mustendwithoffsetlist) , false); //counted from 1. (if level=4 then value goes from 1,2,3,4) 0 means no offsets. This can happen in case of a pointerscan with specific end offsets, which do not get saved.
if mustEndWithSpecificOffsetMaxDeviation=0 then
MaxBitCountLevel:=getMaxBitCount(maxlevel-length(mustendwithoffsetlist) , false) //counted from 1. (if level=4 then value goes from 1,2,3,4) 0 means no offsets. This can happen in case of a pointerscan with specific end offsets, which do not get saved.
else
MaxBitCountLevel:=getMaxBitCount(maxlevel, false);
MaxBitCountOffset:=getMaxBitCount(sz, false);
if unalligned=false then MaxBitCountOffset:=MaxBitCountOffset - 2;
@ -3599,6 +3609,7 @@ begin
BaseStop:=ReadQword;
onlyOneStaticInPath:=readByte=1;
mustEndWithSpecificOffset:=readbyte=1;
mustEndWithSpecificOffsetMaxDeviation:=ReadDWord;
setlength(mustendwithoffsetlist, ReadWord);
for i:=0 to length(mustendwithoffsetlist)-1 do
mustendwithoffsetlist[i]:=ReadDWord;
@ -4711,9 +4722,14 @@ begin
result.writeByte(MaxBitCountLevel);
result.writeByte(MaxBitCountOffset);
result.writeByte(length(mustendwithoffsetlist));
for i:=0 to length(mustendwithoffsetlist)-1 do
result.writeDword(mustendwithoffsetlist[i]);
if mustEndWithSpecificOffsetMaxDeviation=0 then
begin
result.writeByte(length(mustendwithoffsetlist));
for i:=0 to length(mustendwithoffsetlist)-1 do
result.writeDword(mustendwithoffsetlist[i]);
end
else
result.writeByte(0);
end;
result.writebyte(ifthen(mustStartWithBase,1,0));
@ -5198,6 +5214,7 @@ begin
scanner.OutOfDiskSpace:=@outofdiskspace;
scanner.mustEndWithSpecificOffset:=mustEndWithSpecificOffset;
scanner.mustEndWithSpecificOffsetMaxDeviation:=mustEndWithSpecificOffsetMaxDeviation;
scanner.mustendwithoffsetlist:=mustendwithoffsetlist;
scanner.useHeapData:=useHeapData;
scanner.useOnlyHeapData:=useHeapData;
@ -5338,6 +5355,7 @@ LimitToMaxOffsetsPerNode: byte //boolean
onlyOneStaticInPath: byte; //boolean
instantrescan: byte //boolean (not really needed, but it's a nice padding)
mustEndWithSpecificOffset: byte; //boolean ( ^ ^ )
mustEndWithSpecificOffsetMaxDeviation: dword;
maxoffsetspernode: integer;
basestart: qword;
basestop: qword;
@ -5374,6 +5392,7 @@ begin
s.writebyte(ifthen(onlyOneStaticInPath,1,0));
s.writebyte(ifthen(instantrescan,1,0));
s.writebyte(ifthen(mustEndWithSpecificOffset,1,0));
s.WriteDword(mustEndWithSpecificOffsetMaxDeviation);
s.WriteDWord(maxoffsetspernode);
s.WriteQWord(basestart);
s.WriteQWord(basestop);

View File

@ -1123,6 +1123,8 @@ begin
setlength(staticscanner.mustendwithoffsetlist, frmpointerscannersettings.offsetlist.count);
for i:=0 to frmpointerscannersettings.offsetlist.count-1 do
staticscanner.mustendwithoffsetlist[i]:=TOffsetEntry(frmpointerscannersettings.offsetlist[i]).offset;
staticscanner.mustEndWithSpecificOffsetMaxDeviation:=frmpointerscannersettings.maxOffsetDeviation;
end;
staticscanner.instantrescan:=frmpointerscannersettings.cbCompareToOtherPointermaps.checked;

View File

@ -52,6 +52,7 @@ type
OutOfDiskSpace: ^boolean;
mustEndWithSpecificOffset: boolean;
mustEndWithSpecificOffsetMaxDeviation: dword;
mustendwithoffsetlist: array of dword;
useHeapData: boolean;
@ -358,7 +359,11 @@ begin
try
Initialize;
compressedEntrySize:=MaxBitCountModuleOffset+MaxBitCountModuleIndex+MaxBitCountLevel+MaxBitCountOffset*(maxlevel-mustendwithoffsetlistlength);
if mustEndWithSpecificOffsetMaxDeviation=0 then
compressedEntrySize:=MaxBitCountModuleOffset+MaxBitCountModuleIndex+MaxBitCountLevel+MaxBitCountOffset*(maxlevel-mustendwithoffsetlistlength)
else
compressedEntrySize:=MaxBitCountModuleOffset+MaxBitCountModuleIndex+MaxBitCountLevel+MaxBitCountOffset*maxlevel;
compressedEntrySize:=(compressedEntrySize+7) div 8;
getmem(compressedEntry, compressedEntrySize+4); //+4 so there's some space for overhead (writing using a dword pointer to the last byte)
@ -501,6 +506,7 @@ var
bd8, bm8: dword;
bit: integer;
endlevel: integer;
begin
if instantrescan and (not DoRescan(level, moduleid, offset)) then exit;
@ -549,7 +555,8 @@ begin
//so, the compressed version should be almost 3 times as small on a default scan (the shifting and alignment might cause a slightly slower scan)
if level<(mustendwithoffsetlistlength-1) then exit; //on a multi offset end scan, entries with a partial match resulting in a static are saved as well. Don't as they are not what the user wished, and would cause problems
if (mustEndWithSpecificOffsetMaxDeviation=0) and (level<(mustendwithoffsetlistlength-1)) then exit; //on a multi offset end scan, entries with a partial match resulting in a static are saved as well. Don't as they are not what the user wished, and would cause problems
bit:=0;
@ -565,13 +572,22 @@ begin
bd8:=bit shr 3; //bit div 8;
bm8:=bit and $7; //bit mod 8;
pdword(@compressedEntry[bd8])^:=pdword(@compressedEntry[bd8])^ and (not (MaskLevel shl bm8)) or ((1+(level-mustendwithoffsetlistlength)) shl bm8);
if mustEndWithSpecificOffsetMaxDeviation=0 then
pdword(@compressedEntry[bd8])^:=pdword(@compressedEntry[bd8])^ and (not (MaskLevel shl bm8)) or ((1+(level-mustendwithoffsetlistlength)) shl bm8)
else
pdword(@compressedEntry[bd8])^:=pdword(@compressedEntry[bd8])^ and (not (MaskLevel shl bm8)) or ((1+(level)) shl bm8);
bit:=bit+MaxBitCountLevel; //next section
//compress the offsets
for i:=mustendwithoffsetlistlength to level do
if mustEndWithSpecificOffsetMaxDeviation=0 then
endlevel:=mustendwithoffsetlistlength
else
endlevel:=0;
for i:=endlevel to level do
begin
bd8:=bit shr 3; //bit div 8;
bm8:=bit and $7; //bit mod 8;
@ -627,6 +643,7 @@ var p: ^byte;
mae: TMemoryAllocEvent;
{$endif}
ev: ptruint;
startvalue: ptrUint;
stopvalue: ptrUint;
plist: PPointerlist;
@ -649,8 +666,12 @@ begin
if exactOffset then
begin
startvalue:=valuetofind-mustendwithoffsetlist[level];
stopvalue:=startvalue;
ev:=valuetofind-mustendwithoffsetlist[level];
startvalue:=ev-mustEndWithSpecificOffsetMaxDeviation;
stopvalue:=ev+mustEndWithSpecificOffsetMaxDeviation;
if stopvalue>valuetofind then
stopvalue:=valuetofind;
end
else
begin