forgot to commit luahandler changes

This commit is contained in:
Dark Byte 2021-05-11 10:12:35 +02:00
parent 43d8ffa31e
commit 115d71144d
13 changed files with 194 additions and 86 deletions

View File

@ -29,6 +29,8 @@ type
synchronizeparam: integer;
synchronizeparamcount: integer;
syncvm: Plua_State;
selfdestructing: boolean;
procedure NotifyEvent(sender: TObject);
procedure SelectionChangeEvent(Sender: TObject; User: boolean);
procedure MouseEvent(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
@ -99,6 +101,7 @@ type
procedure DisassemblerViewOverrideCallback(address: ptruint; var addressstring: string; var bytestring: string; var opcodestring: string; var parameterstring: string; var specialstring: string);
procedure synchronize;
procedure queue;
procedure pushFunction(L: PLua_state=nil);
@ -345,6 +348,8 @@ var
paramcount: integer;
i: integer;
begin
selfdestructing:=true;
//no locking here (should already be obtained by the caller)
PushFunction(syncvm);
if synchronizeparam>0 then
@ -368,6 +373,15 @@ begin
free;
end;
procedure TLuaCaller.queue;
begin
selfdestructing:=true;
PushFunction(syncvm);
lua_pcall(syncvm, 0,0,0);
free;
end;
procedure TLuaCaller.SelectionChangeEvent(Sender: TObject; User: boolean);
var oldstack: integer;
begin

View File

@ -3386,8 +3386,7 @@ begin
else
lc.synchronizeparam:=0;
tthread.Queue(tthread.CurrentThread, lc.synchronize);
tthread.Queue(nil, lc.queue);
result:=0;
end;
@ -14193,6 +14192,29 @@ begin
exit(1);
end;
function lua_extractfilenamewithoutext(L: Plua_State): integer; cdecl;
begin
if lua_gettop(L)>=1 then
begin
lua_pushstring(L, ExtractFileNameWithoutExt(Lua_ToString(L,1)));
exit(1);
end
else
exit(0);
end;
function lua_extractfileext(L: Plua_State): integer; cdecl;
begin
if lua_gettop(L)>=1 then
begin
lua_pushstring(L, ExtractFileExt(Lua_ToString(L,1)));
exit(1);
end
else
exit(0);
end;
function lua_extractFileName(L: Plua_State): integer; cdecl;
begin
if lua_gettop(L)>=1 then
@ -14213,6 +14235,7 @@ begin
end
else
exit(0);
end;
function lua_trim(L: Plua_State): integer; cdecl;
@ -14293,12 +14316,12 @@ var
a: ptruint=0;
bytes: tmemorystream=nil;
sl: TSymbolListHandler=nil;
symbollist: TStringlist=nil;
errorlog: tstringlist=nil;
bw: size_t;
si: PCESymbolInfo;
targetself: boolean;
ph: THandle;
@ -14306,7 +14329,7 @@ var
i: integer;
list: TStringlist=nil;
count: integer;
useKernelAlloc: boolean;
begin
if lua_gettop(L)>=1 then
begin
@ -14351,6 +14374,12 @@ begin
else
ph:=processhandle;
if lua_gettop(L)>=4 then
useKernelAlloc:=lua_toboolean(L,4)
else
useKernelAlloc:=false;
bytes:=tmemorystream.Create;
errorlog:=tstringlist.create;
@ -14381,7 +14410,11 @@ begin
exit(2);
end;
a:=ptruint(VirtualAllocEx(ph,nil, bytes.Size*2,MEM_RESERVE or MEM_COMMIT,PAGE_EXECUTE_READWRITE));
if useKernelAlloc then
a:=ptruint(kernelalloc(bytes.size*2))
else
a:=ptruint(VirtualAllocEx(ph,nil, bytes.Size*2,MEM_RESERVE or MEM_COMMIT,PAGE_EXECUTE_READWRITE));
if a=0 then
begin
lua_pop(L,lua_gettop(L));
@ -14397,15 +14430,15 @@ begin
errorlog.Clear;
end;
sl:=TSymbolListHandler.create;
symbollist:=TStringlist.create;
//actual compile
if ((list=nil) and (tcc.compileScript(s,a,bytes,sl,errorlog,nil,targetself)=false)) or
if ((list=nil) and (tcc.compileScript(s,a,bytes,symbollist,errorlog,nil,targetself)=false)) or
((list<>nil) and (
((isfile=false) and (tcc.compileScripts(list,a,bytes,sl,errorlog,targetself)=false) ) or
((isfile=true) and (tcc.compileProject(list,a,bytes,sl,errorlog,targetself)=false) )
((isfile=false) and (tcc.compileScripts(list,a,bytes,symbollist,errorlog,targetself)=false) ) or
((isfile=true) and (tcc.compileProject(list,a,bytes,symbollist,errorlog,targetself)=false) )
)) then
begin
lua_pop(L,lua_gettop(L));
@ -14415,8 +14448,8 @@ begin
if list<>nil then
freeandnil(list);
if sl<>nil then
freeandnil(sl);
if symbollist<>nil then
freeandnil(symbollist);
exit(2);
end;
@ -14424,18 +14457,16 @@ begin
begin
lua_newtable(L);
si:=sl.FindFirstSymbolFromBase(0);
while (si<>nil) and (si.address<a+bytes.size) do
for i:=0 to symbollist.count-1 do
begin
lua_pushstring(L,si.originalstring);
lua_pushinteger(L,si.address);
lua_settable(L,-3);
si:=si.next;
if ptruint(symbollist.objects[i])<a+bytes.size then
begin
lua_pushstring(L,symbollist[i]);
lua_pushinteger(L,ptruint(symbollist.objects[i]));
lua_settable(L,-3);
end;
end;
result:=1;
if errorlog.count>0 then
@ -14454,7 +14485,7 @@ begin
end;
finally
if sl<>nil then freeandnil(sl);
if symbollist<>nil then freeandnil(symbollist);
freeandnil(bytes);
freeandnil(errorlog);
end;
@ -15366,6 +15397,8 @@ begin
lua_register(L, 'getAutoRunPath', lua_getAutoRunPath);
lua_register(L, 'getAutorunPath', lua_getAutoRunPath);
lua_register(L, 'extractFileName', lua_extractFileName);
lua_register(L, 'extractFileExt', lua_extractFileExt);
lua_register(L, 'extractFileNameWithoutExt', lua_extractFileNameWithoutExt);
lua_register(L, 'extractFilePath', lua_extractFilePath);
lua_register(L, 'registerLuaFunctionHighlight', lua_registerLuaFunctionHighlight);

View File

@ -24,9 +24,10 @@ begin
owner:=nil;
ListView:=TCEListView.Create(owner);
ListView.ViewStyle:=vsReport;
if owner<>nil then
ListView.Parent:=owner;
ListView.ViewStyle:=vsReport;
luaclass_newClass(L, ListView);
result:=1;

View File

@ -117,7 +117,7 @@ end
function findDotNetMethodAddress(name, modulename)
print(string.format("findDotNetMethodAddress('%s','%s')", name, modulename));
--print(string.format("findDotNetMethodAddress('%s','%s')", name, modulename));
local result
local namespace, classname, methodname=SplitDotNetName(name)
@ -159,7 +159,7 @@ end
function detourdotnet(oldmethodaddress,newmethodaddress,oldmethodcalleraddress)
--write jmp newmethod at the compiled address of oldmethod and if oldmethodcaller is provided write a jmp <trampolinetoold> at oldmethodcaller
print(string.format("detourdotnet(%08x,%08x,%08x)",oldmethodaddress, newmethodaddress, oldmethodcalleraddress))
--print(string.format("detourdotnet(%08x,%08x,%08x)",oldmethodaddress, newmethodaddress, oldmethodcalleraddress))
local ahe,ahd=generateAPIHookScript(string.format("%.8x",oldmethodaddress), string.format("%.8x",newmethodaddress))
@ -169,13 +169,13 @@ jmp originalcall
]],oldmethodcalleraddress)
print('-------ENABLE-------')
print(script)
print('--------------------')
print('');
print('------DISABLE------')
print(ahd)
print('-------------------')
--print('-------ENABLE-------')
--print(script)
--print('--------------------')
--print('');
--print('------DISABLE------')
--print(ahd)
--print('-------------------')
local aaresult,disableinfo=autoAssemble(script)
if aaresult then
@ -190,10 +190,11 @@ function InjectDotNetDetour(dllmodule, oldmethodname, newmethodname, oldmethodca
--load the given dll, find and compile the methods, and call detourdotnet
if dllmodule==nil then
print(debug.traceback())
print('InjectDotNetDetour: dllmodule is nil')
error('InjectDotNetDetour: dllmodule is nil')
end
print(string.format("InjectDotNetDetour(%s, %s, %s, %s)", dllmodule, oldmethodname, newmethodname, oldmethodcaller))
--print(string.format("InjectDotNetDetour(%s, %s, %s, %s)", dllmodule, oldmethodname, newmethodname, oldmethodcaller))
if monopipe then
@ -214,44 +215,44 @@ function InjectDotNetDetour(dllmodule, oldmethodname, newmethodname, oldmethodca
else
LaunchDotNetInterface()
print("injecting module")
--print("injecting module")
if dotnet_loadModule(dllmodule)==false then
return false,'loading '..dllmodule..' failed'
end
print("Getting oldmethod address "..oldmethodname);
--print("Getting oldmethod address "..oldmethodname);
local oldmethodAddress=getAddressSafe(oldmethodname)
if oldmethodAddress==nil then
print(oldmethodname.." not perfect")
--print(oldmethodname.." not perfect")
oldmethodaddress=findDotNetMethodAddress(oldmethodname)
if oldmethodaddress==nil then error('Failure getting '..oldmethodname) end
end
printf("oldmethodaddress=%.8x",oldmethodaddress)
print("--------------")
--printf("oldmethodaddress=%.8x",oldmethodaddress)
--print("--------------")
print("Getting newmethod address "..newmethodname);
--print("Getting newmethod address "..newmethodname);
local newmethodaddress=getAddressSafe(newmethodname)
if newmethodaddress==nil then
print(newmethodname.." not perfect")
--print(newmethodname.." not perfect")
newmethodaddress=findDotNetMethodAddress(newmethodname, extractFileName(dllmodule))
if newmethodaddress==nil then error('Failure getting '..newmethodname) end
end
printf("newmethodaddress=%.8x",newmethodaddress)
print("--------------")
--printf("newmethodaddress=%.8x",newmethodaddress)
--print("--------------")
print("Getting oldmethodcaller address "..oldmethodcaller);
--print("Getting oldmethodcaller address "..oldmethodcaller);
local oldmethodcalleraddress=getAddressSafe(oldmethodcaller)
if oldmethodcalleraddress==nil then
print(oldmethodcaller.." not perfect")
--print(oldmethodcaller.." not perfect")
oldmethodcalleraddress=findDotNetMethodAddress(oldmethodcaller, extractFileName(dllmodule))
if oldmethodcalleraddress==nil then error('Failure getting '..oldmethodcalleraddress) end
end
printf("oldmethodcalleraddress=%.8x",oldmethodcalleraddress)
print("--------------")
--printf("oldmethodcalleraddress=%.8x",oldmethodcalleraddress)
-- print("--------------")
if oldmethodaddress and newmethodaddress and oldmethodcalleraddress then

View File

@ -1173,6 +1173,13 @@ end
function mono_class_getNestingType(class)
--returns the parent class if nested. 0 if not nested
if (class==nil) or (class==0) then
print("mono_class_getNestingType received an invalid class")
print(debug.traceback())
return nil
end
local result
monopipe.lock()
monopipe.writeByte(MONOCMD_GETCLASSNESTINGTYPE)

View File

@ -158,6 +158,8 @@ getFileVersion(pathtofile): returns the 64-bit file version, and a table that ha
getFileList(Path:string, searchMask:string OPTIONAL, SearchSubDirs: boolean OPTIONAL, DirAttrib: integer OPTIONAL): Returns an indexed table with filenames
getDirectoryList(Path:string, SearchSubDirs: boolean OPTIONAL): Returns an indexed table with directory names
extractFileName(filepath): returns the filename of the path
extractFileExt(filepath): returns the file extension of the path
extractFileNameWithoutExt(filepath): Returns the filename of the path, without the extension
extractFilePath(filepath): removes the filename from the path
enableWindowsSymbols(): Will download the PDB files of Windows and load them (Takes a long time the first time)
@ -189,9 +191,9 @@ autoAssemble(text, disableInfo OPTIONAL)
autoAssembleCheck(text, enable, targetself) : Checks the script for syntax errors. Returns true on succes, false with an error message on failure
compile(text, address OPTIONAL, targetself) : Compiles C code and returns a table with the addresses of the symbols on success, or nil with a secondary result containing the errormessage
compile({indexedtable containing scripts}, address OPTIONAL, targetself) : ^ but allows multiple scripts to be compiled into one
compileFiles({filelist}, address OPTIONAL, targetself): ^ but takes an indexed list of files
compile(text, address OPTIONAL, targetself OPTIONAL) : Compiles C code and returns a table with the addresses of the symbols on success, or nil with a secondary result containing the errormessage
compile({indexedtable containing scripts}, address OPTIONAL, targetself OPTIONAL) ) : ^ but allows multiple scripts to be compiled into one
compileFiles({filelist}, address OPTIONAL, targetself OPTIONAL) ): ^ but takes an indexed list of files
compileCS(text, {references}, coreAssembly OPTIONAL) - Compiles c# code and returns the autogenerated filename. references is a list of c# assemblies this code may reference. This file will be deleted when CE closes (or next time another CE closes and it's not in use anymore). Note: This requires .NET 4 to be installed, even if the target is mono. Tip: Handy with injectDotNetDLL

View File

@ -1,7 +1,7 @@
object formAddressChange: TformAddressChange
Left = 806
Left = 828
Height = 295
Top = 226
Top = 182
Width = 263
AutoSize = True
BorderIcons = [biSystemMenu]
@ -47,6 +47,7 @@ object formAddressChange: TformAddressChange
Width = 36
Caption = '=Value'
ParentColor = False
PopupMenu = pmValue
end
object btnOk: TButton
AnchorSideLeft.Control = Owner
@ -685,4 +686,15 @@ object formAddressChange: TformAddressChange
FF00FFFFFF00FFFFFF00FFFFFF00
}
end
object pmValue: TPopupMenu
Left = 184
object miCopyFinalAddressToClipboard: TMenuItem
Caption = 'Copy this address to Clipboard'
OnClick = miCopyFinalAddressToClipboardClick
end
object miCopyValueToClipboard: TMenuItem
Caption = 'Copy this value to Clipboard'
OnClick = miCopyValueToClipboardClick
end
end
end

View File

@ -149,6 +149,8 @@ type
LabelType: TLabel;
LabelDescription: TLabel;
lblValue: TLabel;
miCopyFinalAddressToClipboard: TMenuItem;
miCopyValueToClipboard: TMenuItem;
miAddOffsetAbove: TMenuItem;
miAddOffsetBelow: TMenuItem;
miRemoveOffset: TMenuItem;
@ -183,6 +185,7 @@ type
lengthlabel: TLabel;
pnlExtra: TPanel;
pmOffset: TPopupMenu;
pmValue: TPopupMenu;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
RadioButton3: TRadioButton;
@ -206,6 +209,8 @@ type
procedure FormDestroy(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure miCopyFinalAddressToClipboardClick(Sender: TObject);
procedure miCopyValueToClipboardClick(Sender: TObject);
procedure miAddAddressToListClick(Sender: TObject);
procedure miCopyAddressToClipboardClick(Sender: TObject);
procedure miAddOffsetAboveClick(Sender: TObject);
@ -1817,6 +1822,24 @@ begin
//autosize:=true;
end;
procedure TformAddressChange.miCopyFinalAddressToClipboardClick(Sender: TObject);
var e: boolean;
a: ptruint;
begin
if (memoryrecord<>nil) then
e:=not memoryrecord.parseAddressString(utf8toansi(editAddress.Text),a)
else
a:=symhandler.getAddressFromName(utf8toansi(editAddress.Text),false,e);
if not e then
Clipboard.AsText:=inttohex(a,8);
end;
procedure TformAddressChange.miCopyValueToClipboardClick(Sender: TObject);
begin
Clipboard.AsText:=copy(lblValue.Caption,2);
end;
procedure TformAddressChange.miAddAddressToListClick(Sender: TObject);
var
oi: TOffsetInfo;

View File

@ -1,31 +1,31 @@
object frmExceptionIgnoreList: TfrmExceptionIgnoreList
Left = 1013
Left = 1023
Height = 240
Top = 160
Width = 320
Top = 214
Width = 335
Caption = 'Exception ignore list'
ClientHeight = 240
ClientWidth = 320
ClientWidth = 335
OnCreate = FormCreate
OnDestroy = FormDestroy
OnShow = FormShow
Position = poScreenCenter
LCLVersion = '2.0.0.4'
LCLVersion = '2.0.6.0'
object Panel1: TPanel
Left = 0
Height = 225
Top = 15
Width = 320
Width = 335
Align = alClient
BevelOuter = bvNone
ClientHeight = 225
ClientWidth = 320
ClientWidth = 335
TabOrder = 0
object lbExceptionCodeList: TListBox
Left = 0
Height = 225
Top = 0
Width = 176
Width = 191
Align = alClient
ItemHeight = 0
OnDblClick = lbExceptionCodeListDblClick
@ -33,7 +33,7 @@ object frmExceptionIgnoreList: TfrmExceptionIgnoreList
TabOrder = 0
end
object Panel2: TPanel
Left = 176
Left = 191
Height = 225
Top = 0
Width = 144
@ -60,7 +60,7 @@ object frmExceptionIgnoreList: TfrmExceptionIgnoreList
Left = 7
Height = 15
Top = 5
Width = 80
Width = 81
BorderSpacing.Left = 6
BorderSpacing.Top = 4
Caption = 'Exception code'
@ -71,10 +71,10 @@ object frmExceptionIgnoreList: TfrmExceptionIgnoreList
AnchorSideLeft.Side = asrCenter
AnchorSideTop.Control = edtExceptionCode
AnchorSideTop.Side = asrBottom
Left = 20
Left = 19
Height = 25
Top = 48
Width = 105
Width = 106
AutoSize = True
BorderSpacing.Top = 5
Caption = 'Add Exception '
@ -88,7 +88,7 @@ object frmExceptionIgnoreList: TfrmExceptionIgnoreList
Left = 0
Height = 15
Top = 0
Width = 320
Width = 335
Align = alTop
Caption = 'The following exceptions will be ignored'
ParentColor = False
@ -96,8 +96,8 @@ object frmExceptionIgnoreList: TfrmExceptionIgnoreList
end
object PopupMenu1: TPopupMenu
OnPopup = PopupMenu1Popup
left = 54
top = 53
Left = 54
Top = 53
object miDelete: TMenuItem
Caption = 'Delete'
OnClick = lbExceptionCodeListDblClick

View File

@ -30,6 +30,7 @@ type
procedure PopupMenu1Popup(Sender: TObject);
private
{ private declarations }
loadedPosition: boolean;
public
{ public declarations }
procedure updateList;
@ -42,13 +43,13 @@ implementation
{$R *.lfm}
uses UnexpectedExceptionsHelper, CEFuncProc;
uses UnexpectedExceptionsHelper, CEFuncProc, math;
{ TfrmExceptionIgnoreList }
procedure TfrmExceptionIgnoreList.FormCreate(Sender: TObject);
begin
LoadFormPosition(self);
loadedPosition:=LoadFormPosition(self);
end;
procedure TfrmExceptionIgnoreList.btnAddClick(Sender: TObject);
@ -72,6 +73,13 @@ begin
updateList;
edtExceptionCode.Width:=btnAdd.Width+2;
if not loadedPosition then
begin
clientwidth:=max(clientwidth, canvas.TextWidth(label1.Caption)*2);
clientheight:=max(clientheight, canvas.TextHeight('jf')*20);
end;
end;
procedure TfrmExceptionIgnoreList.lbExceptionCodeListDblClick(Sender: TObject);

View File

@ -1,6 +1,6 @@
Additions and changes:
Added dark mode support (restart CE when you channge the setting)
Hotkeys can be repeated by releasing the key anbd repressing if the repeat timer hasn't finished yet
Hotkeys can be repeated by releasing the key and repressing if the repeat timer hasn't finished yet
structure dissect add to addresslist uses the addressstring instead of number, so symbols will be preserved
structure dissect now has a option to save the previous state of a column and show changes easier
Added {$LUACODE} blocks for inline Lua coding
@ -15,6 +15,9 @@ Additions and changes:
The change address window now also supports relative offsets
DBVM speed improvements
New debugger interface: DBVM-level debugger
Improved performance of "Find what access/writes this address"
Dissect code now lets you specify custom ranges
Addresslist value sort now sorts values by alphabet if the record is a string type
@ -30,12 +33,13 @@ Fixes:
fixed ultimap ret filter
fixed luapipe never calling OnError
fixed DBVM find what access/writes sometimes skipping entries on AMD
fixed undo not working on memory records when using the single line editor
lua:
changes:
saveTable won't ask to sign the table anymore
messageDialog will work if you omit the buttonlist. (Defaults to mbOK then)
added custom designable button
added more customizabe button
New functions:
form.saveToStream

View File

@ -12,15 +12,15 @@ object frmSymbolhandler: TfrmSymbolhandler
Position = poScreenCenter
LCLVersion = '2.0.6.0'
object Panel1: TPanel
Left = 332
Left = 371
Height = 432
Top = 0
Width = 165
Width = 126
Align = alRight
AutoSize = True
BevelOuter = bvNone
ClientHeight = 432
ClientWidth = 165
ClientWidth = 126
Constraints.MinHeight = 250
TabOrder = 0
object Label2: TLabel
@ -32,7 +32,7 @@ object frmSymbolhandler: TfrmSymbolhandler
Left = 8
Height = 15
Top = 58
Width = 149
Width = 110
Alignment = taCenter
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 8
@ -45,10 +45,13 @@ object frmSymbolhandler: TfrmSymbolhandler
AnchorSideLeft.Control = Panel1
AnchorSideTop.Control = Label2
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Panel1
AnchorSideRight.Side = asrBottom
Left = 8
Height = 23
Top = 73
Width = 149
Width = 110
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 8
BorderSpacing.Right = 8
TabOrder = 1
@ -58,7 +61,7 @@ object frmSymbolhandler: TfrmSymbolhandler
AnchorSideLeft.Side = asrCenter
AnchorSideTop.Control = edtAddress
AnchorSideTop.Side = asrBottom
Left = 37
Left = 18
Height = 25
Top = 104
Width = 90
@ -85,7 +88,7 @@ object frmSymbolhandler: TfrmSymbolhandler
Left = 8
Height = 15
Top = 16
Width = 149
Width = 110
Alignment = taCenter
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 8
@ -103,7 +106,7 @@ object frmSymbolhandler: TfrmSymbolhandler
Left = 8
Height = 23
Top = 31
Width = 149
Width = 110
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 8
BorderSpacing.Right = 8
@ -115,17 +118,17 @@ object frmSymbolhandler: TfrmSymbolhandler
Left = 0
Height = 432
Top = 0
Width = 332
Width = 371
Align = alClient
BevelOuter = bvNone
ClientHeight = 432
ClientWidth = 332
ClientWidth = 371
TabOrder = 1
object Label1: TLabel
Left = 0
Height = 15
Top = 0
Width = 332
Width = 371
Align = alTop
Caption = 'Userdefined symbols:'
ParentColor = False
@ -134,7 +137,7 @@ object frmSymbolhandler: TfrmSymbolhandler
Left = 0
Height = 238
Top = 15
Width = 332
Width = 371
Align = alTop
Columns = <
item
@ -161,7 +164,7 @@ object frmSymbolhandler: TfrmSymbolhandler
Left = 0
Height = 159
Top = 273
Width = 332
Width = 371
Align = alClient
PopupMenu = PopupMenu2
ReadOnly = True
@ -175,7 +178,7 @@ object frmSymbolhandler: TfrmSymbolhandler
Left = 0
Height = 5
Top = 253
Width = 332
Width = 371
Align = alTop
ResizeAnchor = akTop
end
@ -183,7 +186,7 @@ object frmSymbolhandler: TfrmSymbolhandler
Left = 0
Height = 15
Top = 258
Width = 332
Width = 371
Align = alTop
Caption = 'Symbol groups:'
ParentColor = False

View File

@ -107,10 +107,10 @@ begin
li:=listview1.Items.Add;
li.Caption:=sl[i];
extradata:=pointer(sl.objects[i]);
li.SubItems.Add(extradata^.addressstring);
if extradata^.doNotSave=false then
begin
li.SubItems.Add(extradata^.addressstring);
if extradata^.allocsize>0 then
li.SubItems.Add(inttohex(dword(extradata^.allocsize),8));
end;