diff --git a/.gitignore b/.gitignore
index 6e6e0ba5..4a377749 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,6 +2,8 @@
*/obj/
bin/*/*
ipch/*
+x64_dbg_*/Win32/*
+x64_dbg_*/x64/*
#global filetypes to ignore
*.depend
diff --git a/help/cmt_cmtset_commentset.htm b/help/cmt_cmtset_commentset.htm
new file mode 100644
index 00000000..bcc61ab3
--- /dev/null
+++ b/help/cmt_cmtset_commentset.htm
@@ -0,0 +1,34 @@
+
+
+
+cmt/cmtset/commentset
+
+
+
+
+
+
+
+cmt[,cmtset,commentset]
Set a
+comment.
+
+
+arguments
+
arg1: Address to set the comment at (preferably inside a
+module).
+
+
+arg2: Comment text.
+
+
+
+result
+
+ This command does not set
+any result variables.
\ No newline at end of file
diff --git a/help/cmtc_cmtdel_commentdel.htm b/help/cmtc_cmtdel_commentdel.htm
new file mode 100644
index 00000000..bd497db6
--- /dev/null
+++ b/help/cmtc_cmtdel_commentdel.htm
@@ -0,0 +1,29 @@
+
+
+
+cmtc/cmtdel/commentdel
+
+
+
+
+
+
+
+cmtc[,cmtdel,commentdel]
Delete a comment.
+
+
+arguments
+
+
arg1: Address of the comment to delete.
+
+
+ result
+
+
+This command does not set any result variables.
diff --git a/help/lbl_lblset_labelset.htm b/help/lbl_lblset_labelset.htm
new file mode 100644
index 00000000..db7deb05
--- /dev/null
+++ b/help/lbl_lblset_labelset.htm
@@ -0,0 +1,33 @@
+
+
+
+lbl/lblset/labelset
+
+
+
+
+
+
+
+lbl[,lblset,labelset]
Set a label.
+
+
+arguments
+
+
+
arg1: Address to set the label at (preferably
+inside a module).
+
+ arg2: Label text.
+
+
+
+result
+
This command does not set any result
+variables.
\ No newline at end of file
diff --git a/help/lblc_lbldel_labeldel.htm b/help/lblc_lbldel_labeldel.htm
new file mode 100644
index 00000000..92f598a5
--- /dev/null
+++ b/help/lblc_lbldel_labeldel.htm
@@ -0,0 +1,22 @@
+
+
+
+lblc/lbldel/labeldel
+
+
+
+
+
+
+
+lblc[,lbldel,labeldel]
Delete a label.
+arguments
arg1: Address of the label to delete.
+result
This command does not set any result
+variables.
+
\ No newline at end of file
diff --git a/help/x64_dbg.wcp b/help/x64_dbg.wcp
index 84e06e42..e99db68a 100644
--- a/help/x64_dbg.wcp
+++ b/help/x64_dbg.wcp
@@ -96,7 +96,7 @@ Font=
DefaultTopic=Introduction.htm
[TOPICS]
-TitleList=36
+TitleList=39
TitleList.Title.0=Introduction
TitleList.Level.0=0
TitleList.Url.0=Introduction.htm
@@ -137,324 +137,354 @@ TitleList.ContextNumber.3=1020
TitleList.ApplyTemp.3=0
TitleList.Expanded.3=0
TitleList.Kind.3=0
-TitleList.Title.4=Hotkeys
-TitleList.Level.4=1
-TitleList.Url.4=Hotkeys.htm
+TitleList.Title.4=Commands
+TitleList.Level.4=0
+TitleList.Url.4=Commands.htm
TitleList.Icon.4=0
TitleList.Status.4=0
TitleList.Keywords.4=
-TitleList.ContextNumber.4=1034
+TitleList.ContextNumber.4=1003
TitleList.ApplyTemp.4=0
-TitleList.Expanded.4=0
+TitleList.Expanded.4=1
TitleList.Kind.4=0
-TitleList.Title.5=Commands
-TitleList.Level.5=0
-TitleList.Url.5=Commands.htm
+TitleList.Title.5=x/exit
+TitleList.Level.5=1
+TitleList.Url.5=x_exit.htm
TitleList.Icon.5=0
TitleList.Status.5=0
TitleList.Keywords.5=
-TitleList.ContextNumber.5=1003
+TitleList.ContextNumber.5=1004
TitleList.ApplyTemp.5=0
TitleList.Expanded.5=0
TitleList.Kind.5=0
-TitleList.Title.6=x/exit
+TitleList.Title.6=strlen/charcount/ccount
TitleList.Level.6=1
-TitleList.Url.6=x_exit.htm
+TitleList.Url.6=strlen_charcount_ccount.htm
TitleList.Icon.6=0
TitleList.Status.6=0
TitleList.Keywords.6=
-TitleList.ContextNumber.6=1004
+TitleList.ContextNumber.6=1005
TitleList.ApplyTemp.6=0
TitleList.Expanded.6=0
TitleList.Kind.6=0
-TitleList.Title.7=strlen/charcount/ccount
+TitleList.Title.7=var/varnew
TitleList.Level.7=1
-TitleList.Url.7=strlen_charcount_ccount.htm
+TitleList.Url.7=var_varnew.htm
TitleList.Icon.7=0
TitleList.Status.7=0
TitleList.Keywords.7=
-TitleList.ContextNumber.7=1005
+TitleList.ContextNumber.7=1006
TitleList.ApplyTemp.7=0
TitleList.Expanded.7=0
TitleList.Kind.7=0
-TitleList.Title.8=var/varnew
+TitleList.Title.8=vardel
TitleList.Level.8=1
-TitleList.Url.8=var_varnew.htm
+TitleList.Url.8=vardel.htm
TitleList.Icon.8=0
TitleList.Status.8=0
TitleList.Keywords.8=
-TitleList.ContextNumber.8=1006
+TitleList.ContextNumber.8=1007
TitleList.ApplyTemp.8=0
TitleList.Expanded.8=0
TitleList.Kind.8=0
-TitleList.Title.9=vardel
+TitleList.Title.9=mov/set
TitleList.Level.9=1
-TitleList.Url.9=vardel.htm
+TitleList.Url.9=mov_set.htm
TitleList.Icon.9=0
TitleList.Status.9=0
TitleList.Keywords.9=
-TitleList.ContextNumber.9=1007
+TitleList.ContextNumber.9=1008
TitleList.ApplyTemp.9=0
TitleList.Expanded.9=0
TitleList.Kind.9=0
-TitleList.Title.10=mov/set
+TitleList.Title.10=cls
TitleList.Level.10=1
-TitleList.Url.10=mov_set.htm
+TitleList.Url.10=cls.htm
TitleList.Icon.10=0
TitleList.Status.10=0
TitleList.Keywords.10=
-TitleList.ContextNumber.10=1008
+TitleList.ContextNumber.10=1009
TitleList.ApplyTemp.10=0
TitleList.Expanded.10=0
TitleList.Kind.10=0
-TitleList.Title.11=cls
+TitleList.Title.11=varlist
TitleList.Level.11=1
-TitleList.Url.11=cls.htm
+TitleList.Url.11=varlist.htm
TitleList.Icon.11=0
TitleList.Status.11=0
TitleList.Keywords.11=
-TitleList.ContextNumber.11=1009
+TitleList.ContextNumber.11=1010
TitleList.ApplyTemp.11=0
TitleList.Expanded.11=0
TitleList.Kind.11=0
-TitleList.Title.12=varlist
+TitleList.Title.12=InitDebug/initdbg/init
TitleList.Level.12=1
-TitleList.Url.12=varlist.htm
+TitleList.Url.12=InitDebug_initdbg_init.htm
TitleList.Icon.12=0
TitleList.Status.12=0
TitleList.Keywords.12=
-TitleList.ContextNumber.12=1010
+TitleList.ContextNumber.12=1011
TitleList.ApplyTemp.12=0
TitleList.Expanded.12=0
TitleList.Kind.12=0
-TitleList.Title.13=InitDebug/initdbg/init
+TitleList.Title.13=run/go/r/g
TitleList.Level.13=1
-TitleList.Url.13=InitDebug_initdbg_init.htm
+TitleList.Url.13=run_go_r_g.htm
TitleList.Icon.13=0
TitleList.Status.13=0
TitleList.Keywords.13=
-TitleList.ContextNumber.13=1011
+TitleList.ContextNumber.13=1013
TitleList.ApplyTemp.13=0
TitleList.Expanded.13=0
TitleList.Kind.13=0
-TitleList.Title.14=run/go/r/g
+TitleList.Title.14=SetBPXOptions/bptype
TitleList.Level.14=1
-TitleList.Url.14=run_go_r_g.htm
+TitleList.Url.14=SetBPXOptions_bptype.htm
TitleList.Icon.14=0
TitleList.Status.14=0
TitleList.Keywords.14=
-TitleList.ContextNumber.14=1013
+TitleList.ContextNumber.14=1018
TitleList.ApplyTemp.14=0
TitleList.Expanded.14=0
TitleList.Kind.14=0
-TitleList.Title.15=SetBPXOptions/bptype
+TitleList.Title.15=SetBPX/bp/bpx
TitleList.Level.15=1
-TitleList.Url.15=SetBPXOptions_bptype.htm
+TitleList.Url.15=SetBPX_bp_bpx.htm
TitleList.Icon.15=0
TitleList.Status.15=0
TitleList.Keywords.15=
-TitleList.ContextNumber.15=1018
+TitleList.ContextNumber.15=1012
TitleList.ApplyTemp.15=0
TitleList.Expanded.15=0
TitleList.Kind.15=0
-TitleList.Title.16=SetBPX/bp/bpx
+TitleList.Title.16=EnableBPX/bpe/be
TitleList.Level.16=1
-TitleList.Url.16=SetBPX_bp_bpx.htm
+TitleList.Url.16=EnableBPX_bpe_be.htm
TitleList.Icon.16=0
TitleList.Status.16=0
TitleList.Keywords.16=
-TitleList.ContextNumber.16=1012
+TitleList.ContextNumber.16=1014
TitleList.ApplyTemp.16=0
TitleList.Expanded.16=0
TitleList.Kind.16=0
-TitleList.Title.17=EnableBPX/bpe/be
+TitleList.Title.17=DisableBPX/bpd/bd
TitleList.Level.17=1
-TitleList.Url.17=EnableBPX_bpe_be.htm
+TitleList.Url.17=DisableBPX_bpd_bd.htm
TitleList.Icon.17=0
TitleList.Status.17=0
TitleList.Keywords.17=
-TitleList.ContextNumber.17=1014
+TitleList.ContextNumber.17=1016
TitleList.ApplyTemp.17=0
TitleList.Expanded.17=0
TitleList.Kind.17=0
-TitleList.Title.18=DisableBPX/bpd/bd
+TitleList.Title.18=ToggleBPX/bpt/bt
TitleList.Level.18=1
-TitleList.Url.18=DisableBPX_bpd_bd.htm
+TitleList.Url.18=ToggleBPX_bpt_bt.htm
TitleList.Icon.18=0
TitleList.Status.18=0
TitleList.Keywords.18=
-TitleList.ContextNumber.18=1016
+TitleList.ContextNumber.18=1019
TitleList.ApplyTemp.18=0
TitleList.Expanded.18=0
TitleList.Kind.18=0
-TitleList.Title.19=ToggleBPX/bpt/bt
+TitleList.Title.19=DeleteBPX/bpc/bc
TitleList.Level.19=1
-TitleList.Url.19=ToggleBPX_bpt_bt.htm
+TitleList.Url.19=DeleteBPX_bpc_bc.htm
TitleList.Icon.19=0
TitleList.Status.19=0
TitleList.Keywords.19=
-TitleList.ContextNumber.19=1019
+TitleList.ContextNumber.19=1017
TitleList.ApplyTemp.19=0
TitleList.Expanded.19=0
TitleList.Kind.19=0
-TitleList.Title.20=DeleteBPX/bpc/bc
+TitleList.Title.20=bplist
TitleList.Level.20=1
-TitleList.Url.20=DeleteBPX_bpc_bc.htm
+TitleList.Url.20=bplist.htm
TitleList.Icon.20=0
TitleList.Status.20=0
TitleList.Keywords.20=
-TitleList.ContextNumber.20=1017
+TitleList.ContextNumber.20=1015
TitleList.ApplyTemp.20=0
TitleList.Expanded.20=0
TitleList.Kind.20=0
-TitleList.Title.21=bplist
+TitleList.Title.21=StepInto/sti
TitleList.Level.21=1
-TitleList.Url.21=bplist.htm
+TitleList.Url.21=StepInto.htm
TitleList.Icon.21=0
TitleList.Status.21=0
TitleList.Keywords.21=
-TitleList.ContextNumber.21=1015
+TitleList.ContextNumber.21=1021
TitleList.ApplyTemp.21=0
TitleList.Expanded.21=0
TitleList.Kind.21=0
-TitleList.Title.22=StepInto/sti
+TitleList.Title.22=StepOver/step/sto/st
TitleList.Level.22=1
-TitleList.Url.22=StepInto.htm
+TitleList.Url.22=StepOver.htm
TitleList.Icon.22=0
TitleList.Status.22=0
TitleList.Keywords.22=
-TitleList.ContextNumber.22=1021
+TitleList.ContextNumber.22=1022
TitleList.ApplyTemp.22=0
TitleList.Expanded.22=0
TitleList.Kind.22=0
-TitleList.Title.23=StepOver/step/sto/st
+TitleList.Title.23=SingleStep/sstep/sst
TitleList.Level.23=1
-TitleList.Url.23=StepOver.htm
+TitleList.Url.23=SingleStep.htm
TitleList.Icon.23=0
TitleList.Status.23=0
TitleList.Keywords.23=
-TitleList.ContextNumber.23=1022
+TitleList.ContextNumber.23=1023
TitleList.ApplyTemp.23=0
TitleList.Expanded.23=0
TitleList.Kind.23=0
-TitleList.Title.24=SingleStep/sstep/sst
+TitleList.Title.24=HideDebugger/dbh/hide
TitleList.Level.24=1
-TitleList.Url.24=SingleStep.htm
+TitleList.Url.24=HideDebugger_dbh_hide.htm
TitleList.Icon.24=0
TitleList.Status.24=0
TitleList.Keywords.24=
-TitleList.ContextNumber.24=1023
+TitleList.ContextNumber.24=1025
TitleList.ApplyTemp.24=0
TitleList.Expanded.24=0
TitleList.Kind.24=0
-TitleList.Title.25=HideDebugger/dbh/hide
+TitleList.Title.25=disasm/dis/d
TitleList.Level.25=1
-TitleList.Url.25=HideDebugger_dbh_hide.htm
+TitleList.Url.25=disasm_dis_d.htm
TitleList.Icon.25=0
TitleList.Status.25=0
TitleList.Keywords.25=
-TitleList.ContextNumber.25=1025
+TitleList.ContextNumber.25=1026
TitleList.ApplyTemp.25=0
TitleList.Expanded.25=0
TitleList.Kind.25=0
-TitleList.Title.26=disasm/dis/d
+TitleList.Title.26=SetMemoryBPX/membp/bpm
TitleList.Level.26=1
-TitleList.Url.26=disasm_dis_d.htm
+TitleList.Url.26=SetMemoryBPX_membp_bpm.htm
TitleList.Icon.26=0
TitleList.Status.26=0
TitleList.Keywords.26=
-TitleList.ContextNumber.26=1026
+TitleList.ContextNumber.26=1027
TitleList.ApplyTemp.26=0
TitleList.Expanded.26=0
TitleList.Kind.26=0
-TitleList.Title.27=SetMemoryBPX/membp/bpm
+TitleList.Title.27=chd
TitleList.Level.27=1
-TitleList.Url.27=SetMemoryBPX_membp_bpm.htm
+TitleList.Url.27=chd.htm
TitleList.Icon.27=0
TitleList.Status.27=0
TitleList.Keywords.27=
-TitleList.ContextNumber.27=1027
+TitleList.ContextNumber.27=1029
TitleList.ApplyTemp.27=0
TitleList.Expanded.27=0
TitleList.Kind.27=0
-TitleList.Title.28=chd
+TitleList.Title.28=rtr
TitleList.Level.28=1
-TitleList.Url.28=chd.htm
+TitleList.Url.28=rtr.htm
TitleList.Icon.28=0
TitleList.Status.28=0
TitleList.Keywords.28=
-TitleList.ContextNumber.28=1029
+TitleList.ContextNumber.28=1028
TitleList.ApplyTemp.28=0
TitleList.Expanded.28=0
TitleList.Kind.28=0
-TitleList.Title.29=rtr
+TitleList.Title.29=SetHardwareBreakpoint/bph/bphws
TitleList.Level.29=1
-TitleList.Url.29=rtr.htm
+TitleList.Url.29=SetHardwareBreakpoint_bph_bphws.htm
TitleList.Icon.29=0
TitleList.Status.29=0
TitleList.Keywords.29=
-TitleList.ContextNumber.29=1028
+TitleList.ContextNumber.29=1030
TitleList.ApplyTemp.29=0
TitleList.Expanded.29=0
TitleList.Kind.29=0
-TitleList.Title.30=SetHardwareBreakpoint/bph/bphws
+TitleList.Title.30=alloc
TitleList.Level.30=1
-TitleList.Url.30=SetHardwareBreakpoint_bph_bphws.htm
+TitleList.Url.30=alloc.htm
TitleList.Icon.30=0
TitleList.Status.30=0
TitleList.Keywords.30=
-TitleList.ContextNumber.30=1030
+TitleList.ContextNumber.30=1032
TitleList.ApplyTemp.30=0
TitleList.Expanded.30=0
TitleList.Kind.30=0
-TitleList.Title.31=alloc
+TitleList.Title.31=free
TitleList.Level.31=1
-TitleList.Url.31=alloc.htm
+TitleList.Url.31=free.htm
TitleList.Icon.31=0
TitleList.Status.31=0
TitleList.Keywords.31=
-TitleList.ContextNumber.31=1032
+TitleList.ContextNumber.31=1031
TitleList.ApplyTemp.31=0
TitleList.Expanded.31=0
TitleList.Kind.31=0
-TitleList.Title.32=free
+TitleList.Title.32=Fill/memset
TitleList.Level.32=1
-TitleList.Url.32=free.htm
+TitleList.Url.32=Fill_memset.htm
TitleList.Icon.32=0
TitleList.Status.32=0
TitleList.Keywords.32=
-TitleList.ContextNumber.32=1031
+TitleList.ContextNumber.32=1033
TitleList.ApplyTemp.32=0
TitleList.Expanded.32=0
TitleList.Kind.32=0
-TitleList.Title.33=Fill/memset
+TitleList.Title.33=cmt/cmtset/commentset
TitleList.Level.33=1
-TitleList.Url.33=Fill_memset.htm
+TitleList.Url.33=cmt_cmtset_commentset.htm
TitleList.Icon.33=0
TitleList.Status.33=0
TitleList.Keywords.33=
-TitleList.ContextNumber.33=1033
+TitleList.ContextNumber.33=1035
TitleList.ApplyTemp.33=0
TitleList.Expanded.33=0
TitleList.Kind.33=0
-TitleList.Title.34=Special Thanks
-TitleList.Level.34=0
-TitleList.Url.34=Special_Thanks.htm
+TitleList.Title.34=cmtc/cmtdel/commentdel
+TitleList.Level.34=1
+TitleList.Url.34=cmtc_cmtdel_commentdel.htm
TitleList.Icon.34=0
TitleList.Status.34=0
TitleList.Keywords.34=
-TitleList.ContextNumber.34=1024
+TitleList.ContextNumber.34=1036
TitleList.ApplyTemp.34=0
TitleList.Expanded.34=0
TitleList.Kind.34=0
-TitleList.Title.35=Fixed Top Style
-TitleList.Level.35=0
-TitleList.Url.35=template\fixedtop.htm
+TitleList.Title.35=lbl/lblset/labelset
+TitleList.Level.35=1
+TitleList.Url.35=lbl_lblset_labelset.htm
TitleList.Icon.35=0
TitleList.Status.35=0
TitleList.Keywords.35=
-TitleList.ContextNumber.35=
+TitleList.ContextNumber.35=1037
TitleList.ApplyTemp.35=0
TitleList.Expanded.35=0
-TitleList.Kind.35=2
+TitleList.Kind.35=0
+TitleList.Title.36=lblc/lbldel/labeldel
+TitleList.Level.36=1
+TitleList.Url.36=lblc_lbldel_labeldel.htm
+TitleList.Icon.36=0
+TitleList.Status.36=0
+TitleList.Keywords.36=
+TitleList.ContextNumber.36=1038
+TitleList.ApplyTemp.36=0
+TitleList.Expanded.36=0
+TitleList.Kind.36=0
+TitleList.Title.37=Special Thanks
+TitleList.Level.37=0
+TitleList.Url.37=Special_Thanks.htm
+TitleList.Icon.37=0
+TitleList.Status.37=0
+TitleList.Keywords.37=
+TitleList.ContextNumber.37=1024
+TitleList.ApplyTemp.37=0
+TitleList.Expanded.37=0
+TitleList.Kind.37=0
+TitleList.Title.38=Fixed Top Style
+TitleList.Level.38=0
+TitleList.Url.38=template\fixedtop.htm
+TitleList.Icon.38=0
+TitleList.Status.38=0
+TitleList.Keywords.38=
+TitleList.ContextNumber.38=
+TitleList.ApplyTemp.38=0
+TitleList.Expanded.38=0
+TitleList.Kind.38=2
diff --git a/x64_dbg_bridge/_global.cpp b/x64_dbg_bridge/_global.cpp
index c70df78b..91dd66e3 100644
--- a/x64_dbg_bridge/_global.cpp
+++ b/x64_dbg_bridge/_global.cpp
@@ -28,3 +28,4 @@ DBGADDRINFOSET _dbg_addrinfoset;
DBGBPGETTYPEAT _dbg_bpgettypeat;
DBGGETREGDUMP _dbg_getregdump;
DBGVALTOSTRING _dbg_valtostring;
+DBGMEMISVALIDREADPTR _dbg_memisvalidreadptr;
diff --git a/x64_dbg_bridge/_global.h b/x64_dbg_bridge/_global.h
index 7b4c1b9a..4beac1f4 100644
--- a/x64_dbg_bridge/_global.h
+++ b/x64_dbg_bridge/_global.h
@@ -60,6 +60,7 @@ typedef bool (*DBGADDRINFOSET)(duint addr, ADDRINFO* addrinfo);
typedef BPXTYPE (*DBGBPGETTYPEAT)(duint addr);
typedef bool (*DBGGETREGDUMP)(REGDUMP* regdump);
typedef bool (*DBGVALTOSTRING)(const char* string, duint* value);
+typedef bool (*DBGMEMISVALIDREADPTR)(duint addr);
//DBG functions
extern DBGDBGINIT _dbg_dbginit;
@@ -76,5 +77,6 @@ extern DBGADDRINFOSET _dbg_addrinfoset;
extern DBGBPGETTYPEAT _dbg_bpgettypeat;
extern DBGGETREGDUMP _dbg_getregdump;
extern DBGVALTOSTRING _dbg_valtostring;
+extern DBGMEMISVALIDREADPTR _dbg_memisvalidreadptr;
#endif // _GLOBAL_H
diff --git a/x64_dbg_bridge/bridgemain.cpp b/x64_dbg_bridge/bridgemain.cpp
index c5ded808..b0864e48 100644
--- a/x64_dbg_bridge/bridgemain.cpp
+++ b/x64_dbg_bridge/bridgemain.cpp
@@ -108,6 +108,10 @@ DLL_IMPEXP const char* BridgeInit()
_dbg_valtostring=(DBGVALTOSTRING)GetProcAddress(hInstDbg, "_dbg_valtostring");
if(!_dbg_valtostring)
return "Export \"_dbg_valtostring\" could not be found!";
+ //_dbg_memisvalidreadptr
+ _dbg_memisvalidreadptr=(DBGMEMISVALIDREADPTR)GetProcAddress(hInstDbg, "_dbg_memisvalidreadptr");
+ if(!_dbg_memisvalidreadptr)
+ return "Export \"_dbg_memisvalidreadptr\" could not be found!";
return 0;
}
@@ -187,24 +191,8 @@ DLL_IMPEXP bool DbgIsJumpGoingToExecute(duint addr)
DLL_IMPEXP bool DbgGetLabelAt(duint addr, SEGMENTREG segment, char* text) //(module.)+label
{
- if(!text or !addr)
+ if(!text || !addr)
return false;
- //test code (highlighting.exe|x32)
- /*if(addr==0x40102b)
- {
- strcpy(text, "highlighting.retn");
- return true;
- }
- else if(addr==0x401020 || addr==0x401022)
- {
- strcpy(text, "highlighting.label");
- return true;
- }
- else if(addr==0x402000)
- {
- strcpy(text, "highlighting.dataLabel");
- return true;
- }*/
ADDRINFO info;
memset(&info, 0, sizeof(info));
info.flags=label;
@@ -216,7 +204,7 @@ DLL_IMPEXP bool DbgGetLabelAt(duint addr, SEGMENTREG segment, char* text) //(mod
DLL_IMPEXP bool DbgSetLabelAt(duint addr, const char* text)
{
- if(!text or strlen(text)>=MAX_LABEL_SIZE or !addr)
+ if(!text || strlen(text)>=MAX_LABEL_SIZE || !addr)
return false;
ADDRINFO info;
memset(&info, 0, sizeof(info));
@@ -229,14 +217,8 @@ DLL_IMPEXP bool DbgSetLabelAt(duint addr, const char* text)
DLL_IMPEXP bool DbgGetCommentAt(duint addr, char* text) //comment (not live)
{
- if(!text or !addr)
+ if(!text || !addr)
return false;
- //test code (highlighting.exe)
- /*if(addr==0x401000)
- {
- strcpy(text, "test comment");
- return true;
- }*/
ADDRINFO info;
memset(&info, 0, sizeof(info));
info.flags=comment;
@@ -248,7 +230,7 @@ DLL_IMPEXP bool DbgGetCommentAt(duint addr, char* text) //comment (not live)
DLL_IMPEXP bool DbgSetCommentAt(duint addr, const char* text)
{
- if(!text or strlen(text)>=MAX_COMMENT_SIZE or !addr)
+ if(!text || strlen(text)>=MAX_COMMENT_SIZE || !addr)
return false;
ADDRINFO info;
memset(&info, 0, sizeof(info));
@@ -261,7 +243,7 @@ DLL_IMPEXP bool DbgSetCommentAt(duint addr, const char* text)
DLL_IMPEXP bool DbgGetModuleAt(duint addr, char* text)
{
- if(!text or !addr)
+ if(!text || !addr)
return false;
ADDRINFO info;
memset(&info, 0, sizeof(info));
@@ -295,6 +277,11 @@ DLL_IMPEXP bool DbgValToString(const char* string, duint value)
return _dbg_valtostring(string, &valueCopy);
}
+DLL_IMPEXP bool DbgMemIsValidReadPtr(duint addr)
+{
+ return _dbg_memisvalidreadptr(addr);
+}
+
//GUI
DLL_IMPEXP void GuiDisasmAt(duint addr, duint cip)
{
diff --git a/x64_dbg_bridge/bridgemain.h b/x64_dbg_bridge/bridgemain.h
index 30022ced..564b15fb 100644
--- a/x64_dbg_bridge/bridgemain.h
+++ b/x64_dbg_bridge/bridgemain.h
@@ -158,6 +158,7 @@ DLL_IMPEXP BPXTYPE DbgGetBpxTypeAt(duint addr);
DLL_IMPEXP duint DbgValFromString(const char* string);
DLL_IMPEXP bool DbgGetRegDump(REGDUMP* regdump);
DLL_IMPEXP bool DbgValToString(const char* string, duint value);
+DLL_IMPEXP bool DbgMemIsValidReadPtr(duint addr);
//GUI functions
DLL_IMPEXP void GuiDisasmAt(duint addr, duint cip);
diff --git a/x64_dbg_dbg/_exports.cpp b/x64_dbg_dbg/_exports.cpp
index b8ae58c0..ab2db1a7 100644
--- a/x64_dbg_dbg/_exports.cpp
+++ b/x64_dbg_dbg/_exports.cpp
@@ -60,6 +60,11 @@ extern "C" DLL_EXPORT bool _dbg_memmap(MEMMAP* memmap)
return true;
}
+extern "C" DLL_EXPORT bool _dbg_memisvalidreadptr(duint addr)
+{
+ return memisvalidreadptr(fdProcessInfo->hProcess, addr);
+}
+
extern "C" DLL_EXPORT void _dbg_dbgexitsignal()
{
//TODO: handle exit signal
@@ -106,18 +111,39 @@ extern "C" DLL_EXPORT bool _dbg_addrinfoget(duint addr, SEGMENTREG segment, ADDR
}
if(addrinfo->flags&label) //TODO: get label
{
- //TODO: label exports
+ if(labelget(addr, addrinfo->label))
+ retval=true;
+ else
+ {
+ //TODO: label exports
+ }
}
if(addrinfo->flags&comment) //TODO: get comment
{
- //TODO: auto-comments
+ if(commentget(addr, addrinfo->comment))
+ retval=true;
+ else
+ {
+ //TODO: auto-comments
+ }
}
return retval;
}
extern "C" DLL_EXPORT bool _dbg_addrinfoset(duint addr, ADDRINFO* addrinfo)
{
- return false;
+ bool retval=false;
+ if(addrinfo->flags&label) //set label
+ {
+ if(labelset(addr, addrinfo->label))
+ retval=true;
+ }
+ else if(addrinfo->flags&comment) //set comment
+ {
+ if(commentset(addr, addrinfo->comment))
+ retval=true;
+ }
+ return retval;
}
extern "C" DLL_EXPORT int _dbg_bpgettypeat(duint addr)
diff --git a/x64_dbg_dbg/_exports.h b/x64_dbg_dbg/_exports.h
index 7c5ff7ef..3a29e740 100644
--- a/x64_dbg_dbg/_exports.h
+++ b/x64_dbg_dbg/_exports.h
@@ -11,6 +11,7 @@ extern "C"
DLL_EXPORT duint _dbg_memfindbaseaddr(duint addr, duint* size);
DLL_EXPORT bool _dbg_memread(duint addr, unsigned char* dest, duint size, duint* read);
DLL_EXPORT bool _dbg_memmap(MEMMAP* memmap);
+extern "C" DLL_EXPORT bool _dbg_memisvalidreadptr(duint addr);
DLL_EXPORT void _dbg_dbgexitsignal();
DLL_EXPORT bool _dbg_valfromstring(const char* string, duint* value);
DLL_EXPORT bool _dbg_isdebugging();
diff --git a/x64_dbg_dbg/_global.cpp b/x64_dbg_dbg/_global.cpp
index 9174f1e5..73b3d43c 100644
--- a/x64_dbg_dbg/_global.cpp
+++ b/x64_dbg_dbg/_global.cpp
@@ -1,6 +1,8 @@
#include "_global.h"
HINSTANCE hInst;
+char sqlitedb_basedir[deflen]="";
+char dbpath[deflen]="";
void* emalloc(size_t size)
{
diff --git a/x64_dbg_dbg/_global.h b/x64_dbg_dbg/_global.h
index 1c85acbb..dbc91720 100644
--- a/x64_dbg_dbg/_global.h
+++ b/x64_dbg_dbg/_global.h
@@ -16,6 +16,7 @@
#include
#include
#include "..\x64_dbg_bridge\bridgemain.h"
+#include "sqlite\sqlite3.h"
#ifdef __GNUC__
#include "dbghelp\dbghelp.h"
@@ -90,6 +91,8 @@ enum BITMASK
//superglobal variables
extern HINSTANCE hInst;
+extern char sqlitedb_basedir[deflen];
+extern char dbpath[deflen];
//functions
void* emalloc(size_t size);
diff --git a/x64_dbg_dbg/addrinfo.cpp b/x64_dbg_dbg/addrinfo.cpp
index 33652c85..5dd227f0 100644
--- a/x64_dbg_dbg/addrinfo.cpp
+++ b/x64_dbg_dbg/addrinfo.cpp
@@ -1,5 +1,33 @@
#include "addrinfo.h"
#include "debugger.h"
+#include "console.h"
+#include "memory.h"
+
+void dbinit()
+{
+ CreateDirectoryA(sqlitedb_basedir, 0); //create database directory
+ sqlite3* db;
+ if(sqlite3_open(dbpath, &db))
+ {
+ dputs("failed to open database!");
+ return;
+ }
+ char sql[deflen]="";
+ char* errorText=0;
+ strcpy(sql, "CREATE TABLE IF NOT EXISTS comments (id INTEGER PRIMARY KEY AUTOINCREMENT, mod TEXT, addr INT64 NOT NULL, text TEXT NOT NULL)");
+ if(sqlite3_exec(db, sql, 0, 0, &errorText)!=SQLITE_OK) //error
+ {
+ dprintf("SQL Error: %s\n", errorText);
+ sqlite3_free(errorText);
+ }
+ strcpy(sql, "CREATE TABLE IF NOT EXISTS labels (id INTEGER PRIMARY KEY AUTOINCREMENT, mod TEXT, addr INT64 NOT NULL, text TEXT NOT NULL)");
+ if(sqlite3_exec(db, sql, 0, 0, &errorText)!=SQLITE_OK) //error
+ {
+ dprintf("SQL Error: %s\n", errorText);
+ sqlite3_free(errorText);
+ }
+ sqlite3_close(db);
+}
bool modnamefromaddr(uint addr, char* modname)
{
@@ -12,3 +40,303 @@ bool modnamefromaddr(uint addr, char* modname)
strcpy(modname, modInfo.ModuleName);
return true;
}
+
+uint modbasefromaddr(uint addr)
+{
+ IMAGEHLP_MODULE64 modInfo;
+ memset(&modInfo, 0, sizeof(modInfo));
+ modInfo.SizeOfStruct=sizeof(IMAGEHLP_MODULE64);
+ if(!SymGetModuleInfo64(fdProcessInfo->hProcess, (DWORD64)addr, &modInfo))
+ return 0;
+ return (uint)modInfo.BaseOfImage;
+}
+
+bool commentset(uint addr, const char* text)
+{
+ if(!IsFileBeingDebugged() or !memisvalidreadptr(fdProcessInfo->hProcess, addr) or !text or strlen(text)>=MAX_COMMENT_SIZE-1)
+ return false;
+ if(!*text) //NOTE: delete when there is no text
+ return commentdel(addr);
+ int len=strlen(text);
+ char* newtext=(char*)emalloc(len+1);
+ *newtext=0;
+ for(int i=0,j=0; ihProcess, addr) or !text)
+ return false;
+ sqlite3* db;
+ if(sqlite3_open(dbpath, &db))
+ {
+ dputs("failed to open database!");
+ return false;
+ }
+ char modname[35]="";
+ char sql[256]="";
+ sqlite3_stmt* stmt;
+ if(!modnamefromaddr(addr, modname)) //comments without module
+ sprintf(sql, "SELECT text FROM comments WHERE mod IS NULL AND addr=%"fext"u", addr);
+ else
+ sprintf(sql, "SELECT text FROM comments WHERE mod='%s' AND addr=%"fext"u", modname, addr-modbasefromaddr(addr));
+ if(sqlite3_prepare_v2(db, sql, -1, &stmt, 0)!=SQLITE_OK)
+ {
+ sqlite3_close(db);
+ return false;
+ }
+ if(sqlite3_step(stmt)!=SQLITE_ROW) //there is a comment already
+ {
+ sqlite3_close(db);
+ return false;
+ }
+ strcpy(text, (const char*)sqlite3_column_text(stmt, 0));
+ sqlite3_finalize(stmt);
+ sqlite3_close(db);
+ return true;
+}
+
+bool commentdel(uint addr)
+{
+ if(!IsFileBeingDebugged() or !memisvalidreadptr(fdProcessInfo->hProcess, addr))
+ return false;
+ sqlite3* db;
+ if(sqlite3_open(dbpath, &db))
+ {
+ dputs("failed to open database!");
+ return false;
+ }
+ char modname[35]="";
+ char sql[256]="";
+ sqlite3_stmt* stmt;
+ if(!modnamefromaddr(addr, modname)) //comments without module
+ sprintf(sql, "SELECT id FROM comments WHERE mod IS NULL AND addr=%"fext"u", addr);
+ else
+ {
+ uint modbase=modbasefromaddr(addr);
+ uint rva=addr-modbase;
+ sprintf(sql, "SELECT id FROM comments WHERE mod='%s' AND addr=%"fext"u", modname, rva);
+ }
+ if(sqlite3_prepare_v2(db, sql, -1, &stmt, 0)!=SQLITE_OK)
+ {
+ sqlite3_close(db);
+ return false;
+ }
+ if(sqlite3_step(stmt)!=SQLITE_ROW) //no comment to delete
+ return false;
+ int del_id=sqlite3_column_int(stmt, 0);
+ sqlite3_finalize(stmt);
+ char* errorText=0;
+ sprintf(sql, "DELETE FROM comments WHERE id=%d", del_id);
+ if(sqlite3_exec(db, sql, 0, 0, &errorText)!=SQLITE_OK) //error
+ {
+ dprintf("SQL Error: %s\n", errorText);
+ sqlite3_free(errorText);
+ sqlite3_close(db);
+ return false;
+ }
+ sqlite3_close(db);
+ GuiUpdateAllViews();
+ return true;
+}
+
+bool labelset(uint addr, const char* text)
+{
+ if(!IsFileBeingDebugged() or !memisvalidreadptr(fdProcessInfo->hProcess, addr) or !text or strlen(text)>=MAX_LABEL_SIZE-1)
+ return false;
+ if(!*text) //NOTE: delete when there is no text
+ return labeldel(addr);
+ int len=strlen(text);
+ char* newtext=(char*)emalloc(len+1);
+ *newtext=0;
+ for(int i=0,j=0; ihProcess, addr) or !text)
+ return false;
+ sqlite3* db;
+ if(sqlite3_open(dbpath, &db))
+ {
+ dputs("failed to open database!");
+ return false;
+ }
+ char modname[35]="";
+ char sql[256]="";
+ sqlite3_stmt* stmt;
+ if(!modnamefromaddr(addr, modname)) //labels without module
+ sprintf(sql, "SELECT text FROM labels WHERE mod IS NULL AND addr=%"fext"u", addr);
+ else
+ sprintf(sql, "SELECT text FROM labels WHERE mod='%s' AND addr=%"fext"u", modname, addr-modbasefromaddr(addr));
+ if(sqlite3_prepare_v2(db, sql, -1, &stmt, 0)!=SQLITE_OK)
+ {
+ sqlite3_close(db);
+ return false;
+ }
+ if(sqlite3_step(stmt)!=SQLITE_ROW) //there is a label already
+ {
+ sqlite3_close(db);
+ return false;
+ }
+ strcpy(text, (const char*)sqlite3_column_text(stmt, 0));
+ sqlite3_finalize(stmt);
+ sqlite3_close(db);
+ return true;
+}
+
+bool labeldel(uint addr)
+{
+ if(!IsFileBeingDebugged() or !memisvalidreadptr(fdProcessInfo->hProcess, addr))
+ return false;
+ sqlite3* db;
+ if(sqlite3_open(dbpath, &db))
+ {
+ dputs("failed to open database!");
+ return false;
+ }
+ char modname[35]="";
+ char sql[256]="";
+ sqlite3_stmt* stmt;
+ if(!modnamefromaddr(addr, modname)) //labels without module
+ sprintf(sql, "SELECT id FROM labels WHERE mod IS NULL AND addr=%"fext"u", addr);
+ else
+ {
+ uint modbase=modbasefromaddr(addr);
+ uint rva=addr-modbase;
+ sprintf(sql, "SELECT id FROM labels WHERE mod='%s' AND addr=%"fext"u", modname, rva);
+ }
+ if(sqlite3_prepare_v2(db, sql, -1, &stmt, 0)!=SQLITE_OK)
+ {
+ sqlite3_close(db);
+ return false;
+ }
+ if(sqlite3_step(stmt)!=SQLITE_ROW) //no label to delete
+ return false;
+ int del_id=sqlite3_column_int(stmt, 0);
+ sqlite3_finalize(stmt);
+ char* errorText=0;
+ sprintf(sql, "DELETE FROM labels WHERE id=%d", del_id);
+ if(sqlite3_exec(db, sql, 0, 0, &errorText)!=SQLITE_OK) //error
+ {
+ dprintf("SQL Error: %s\n", errorText);
+ sqlite3_free(errorText);
+ sqlite3_close(db);
+ return false;
+ }
+ sqlite3_close(db);
+ GuiUpdateAllViews();
+ return true;
+}
diff --git a/x64_dbg_dbg/addrinfo.h b/x64_dbg_dbg/addrinfo.h
index 18e20453..7e8f8d5f 100644
--- a/x64_dbg_dbg/addrinfo.h
+++ b/x64_dbg_dbg/addrinfo.h
@@ -3,6 +3,13 @@
#include "_global.h"
+void dbinit();
bool modnamefromaddr(uint addr, char* modname);
+bool commentset(uint addr, const char* text);
+bool commentget(uint addr, char* text);
+bool commentdel(uint addr);
+bool labelset(uint addr, const char* text);
+bool labelget(uint addr, char* text);
+bool labeldel(uint addr);
#endif // _ADDRINFO_H
diff --git a/x64_dbg_dbg/debugger.cpp b/x64_dbg_dbg/debugger.cpp
index 4b75d386..ae55cbe0 100644
--- a/x64_dbg_dbg/debugger.cpp
+++ b/x64_dbg_dbg/debugger.cpp
@@ -19,6 +19,9 @@ static bool isStepping=false;
static bool isPausedByUser=false;
static bool bScyllaLoaded=false;
+//Superglobal variables
+char sqlitedb[deflen]="";
+
//static functions
static void cbStep();
static void cbSystemBreakpoint(void* ExceptionData);
@@ -262,8 +265,24 @@ static void cbSystemBreakpoint(void* ExceptionData)
{
//TODO: handle stuff (TLS, main entry, etc)
SetCustomHandler(UE_CH_SYSTEMBREAKPOINT, 0);
+ //init program database
+ int len=strlen(szFileName);
+ while(szFileName[len]!='\\' && len!=0)
+ len--;
+ if(len)
+ len++;
+ strcpy(sqlitedb, szFileName+len);
+#ifdef _WIN64
+ strcat(sqlitedb, ".dd64");
+#else
+ strcat(sqlitedb, ".dd32");
+#endif // _WIN64
+ sprintf(dbpath, "%s\\%s", sqlitedb_basedir, sqlitedb);
+ dprintf("Database file: %s\n", dbpath);
+ dbinit();
+ //log message
dputs("system breakpoint reached!");
- //NOTE: call GUI
+ //update GUI
DebugUpdateGui(GetContextData(UE_CIP));
GuiSetDebugState(paused);
//unlock
diff --git a/x64_dbg_dbg/instruction.cpp b/x64_dbg_dbg/instruction.cpp
index fc043bf0..713fde3f 100644
--- a/x64_dbg_dbg/instruction.cpp
+++ b/x64_dbg_dbg/instruction.cpp
@@ -4,6 +4,7 @@
#include "console.h"
#include "value.h"
#include "command.h"
+#include "addrinfo.h"
CMDRESULT cbBadCmd(const char* cmd)
{
@@ -209,3 +210,73 @@ CMDRESULT cbInstrChd(const char* cmd)
dputs("current directory changed!");
return STATUS_CONTINUE;
}
+
+CMDRESULT cbInstrCmt(const char* cmd)
+{
+ char arg1[deflen]="";
+ if(!argget(cmd, arg1, 0, false))
+ return STATUS_ERROR;
+ uint addr=0;
+ if(!valfromstring(arg1, &addr, 0, 0, true, 0))
+ return STATUS_ERROR;
+ char arg2[deflen]="";
+ if(!argget(cmd, arg2, 1, false))
+ return STATUS_ERROR;
+ if(!commentset(addr, arg2))
+ {
+ dputs("error setting comment");
+ return STATUS_ERROR;
+ }
+ return STATUS_CONTINUE;
+}
+
+CMDRESULT cbInstrCmtdel(const char* cmd)
+{
+ char arg1[deflen]="";
+ if(!argget(cmd, arg1, 0, false))
+ return STATUS_ERROR;
+ uint addr=0;
+ if(!valfromstring(arg1, &addr, 0, 0, true, 0))
+ return STATUS_ERROR;
+ if(!commentdel(addr))
+ {
+ dputs("error deleting comment");
+ return STATUS_ERROR;
+ }
+ return STATUS_CONTINUE;
+}
+
+CMDRESULT cbInstrLbl(const char* cmd)
+{
+ char arg1[deflen]="";
+ if(!argget(cmd, arg1, 0, false))
+ return STATUS_ERROR;
+ uint addr=0;
+ if(!valfromstring(arg1, &addr, 0, 0, true, 0))
+ return STATUS_ERROR;
+ char arg2[deflen]="";
+ if(!argget(cmd, arg2, 1, false))
+ return STATUS_ERROR;
+ if(!labelset(addr, arg2))
+ {
+ dputs("error setting label");
+ return STATUS_ERROR;
+ }
+ return STATUS_CONTINUE;
+}
+
+CMDRESULT cbInstrLbldel(const char* cmd)
+{
+ char arg1[deflen]="";
+ if(!argget(cmd, arg1, 0, false))
+ return STATUS_ERROR;
+ uint addr=0;
+ if(!valfromstring(arg1, &addr, 0, 0, true, 0))
+ return STATUS_ERROR;
+ if(!labeldel(addr))
+ {
+ dputs("error deleting label");
+ return STATUS_ERROR;
+ }
+ return STATUS_CONTINUE;
+}
diff --git a/x64_dbg_dbg/instruction.h b/x64_dbg_dbg/instruction.h
index 3d903792..48d7f7ec 100644
--- a/x64_dbg_dbg/instruction.h
+++ b/x64_dbg_dbg/instruction.h
@@ -11,5 +11,9 @@ CMDRESULT cbInstrVarDel(const char* cmd);
CMDRESULT cbInstrMov(const char* cmd);
CMDRESULT cbInstrVarList(const char* cmd);
CMDRESULT cbInstrChd(const char* cmd);
+CMDRESULT cbInstrCmt(const char* cmd);
+CMDRESULT cbInstrCmtdel(const char* cmd);
+CMDRESULT cbInstrLbl(const char* cmd);
+CMDRESULT cbInstrLbldel(const char* cmd);
#endif // _INSTRUCTIONS_H
diff --git a/x64_dbg_dbg/memory.cpp b/x64_dbg_dbg/memory.cpp
index abf3cee9..0f149271 100644
--- a/x64_dbg_dbg/memory.cpp
+++ b/x64_dbg_dbg/memory.cpp
@@ -63,6 +63,12 @@ bool memread(HANDLE hProcess, const void* lpBaseAddress, void* lpBuffer, SIZE_T
return true;
}
+bool memisvalidreadptr(HANDLE hProcess, uint addr)
+{
+ unsigned char a=0;
+ return memread(hProcess, (void*)addr, &a, 1, 0);
+}
+
void* memalloc(HANDLE hProcess, uint addr, DWORD size, DWORD fdProtect)
{
return VirtualAllocEx(hProcess, (void*)addr, size, MEM_RESERVE|MEM_COMMIT, fdProtect);
diff --git a/x64_dbg_dbg/memory.h b/x64_dbg_dbg/memory.h
index 56dfcff1..aaf52e7e 100644
--- a/x64_dbg_dbg/memory.h
+++ b/x64_dbg_dbg/memory.h
@@ -7,6 +7,7 @@
uint memfindbaseaddr(HANDLE hProcess, uint addr, uint* size);
bool memread(HANDLE hProcess, const void* lpBaseAddress, void* lpBuffer, SIZE_T nSize, SIZE_T* lpNumberOfBytesRead);
+bool memisvalidreadptr(HANDLE hProcess, uint addr);
void* memalloc(HANDLE hProcess, uint addr, DWORD size, DWORD fdProtect);
#endif // _MEMORY_H
diff --git a/x64_dbg_dbg/sqlite/sqlite.def b/x64_dbg_dbg/sqlite/sqlite.def
new file mode 100644
index 00000000..f3867f32
--- /dev/null
+++ b/x64_dbg_dbg/sqlite/sqlite.def
@@ -0,0 +1,207 @@
+LIBRARY "sqlite.dll"
+EXPORTS
+sqlite3_aggregate_context
+sqlite3_aggregate_count
+sqlite3_auto_extension
+sqlite3_backup_finish
+sqlite3_backup_init
+sqlite3_backup_pagecount
+sqlite3_backup_remaining
+sqlite3_backup_step
+sqlite3_bind_blob
+sqlite3_bind_double
+sqlite3_bind_int
+sqlite3_bind_int64
+sqlite3_bind_null
+sqlite3_bind_parameter_count
+sqlite3_bind_parameter_index
+sqlite3_bind_parameter_name
+sqlite3_bind_text
+sqlite3_bind_text16
+sqlite3_bind_value
+sqlite3_bind_zeroblob
+sqlite3_blob_bytes
+sqlite3_blob_close
+sqlite3_blob_open
+sqlite3_blob_read
+sqlite3_blob_reopen
+sqlite3_blob_write
+sqlite3_busy_handler
+sqlite3_busy_timeout
+sqlite3_cancel_auto_extension
+sqlite3_changes
+sqlite3_clear_bindings
+sqlite3_close
+sqlite3_close_v2
+sqlite3_collation_needed
+sqlite3_collation_needed16
+sqlite3_column_blob
+sqlite3_column_bytes
+sqlite3_column_bytes16
+sqlite3_column_count
+sqlite3_column_decltype
+sqlite3_column_decltype16
+sqlite3_column_double
+sqlite3_column_int
+sqlite3_column_int64
+sqlite3_column_name
+sqlite3_column_name16
+sqlite3_column_text
+sqlite3_column_text16
+sqlite3_column_type
+sqlite3_column_value
+sqlite3_commit_hook
+sqlite3_compileoption_get
+sqlite3_compileoption_used
+sqlite3_complete
+sqlite3_complete16
+sqlite3_config
+sqlite3_context_db_handle
+sqlite3_create_collation
+sqlite3_create_collation16
+sqlite3_create_collation_v2
+sqlite3_create_function
+sqlite3_create_function16
+sqlite3_create_function_v2
+sqlite3_create_module
+sqlite3_create_module_v2
+sqlite3_data_count
+sqlite3_data_directory DATA
+sqlite3_db_config
+sqlite3_db_filename
+sqlite3_db_handle
+sqlite3_db_mutex
+sqlite3_db_readonly
+sqlite3_db_release_memory
+sqlite3_db_status
+sqlite3_declare_vtab
+sqlite3_enable_load_extension
+sqlite3_enable_shared_cache
+sqlite3_errcode
+sqlite3_errmsg
+sqlite3_errmsg16
+sqlite3_errstr
+sqlite3_exec
+sqlite3_expired
+sqlite3_extended_errcode
+sqlite3_extended_result_codes
+sqlite3_file_control
+sqlite3_finalize
+sqlite3_free
+sqlite3_free_table
+sqlite3_get_autocommit
+sqlite3_get_auxdata
+sqlite3_get_table
+sqlite3_global_recover
+sqlite3_initialize
+sqlite3_interrupt
+sqlite3_last_insert_rowid
+sqlite3_libversion
+sqlite3_libversion_number
+sqlite3_limit
+sqlite3_load_extension
+sqlite3_log
+sqlite3_malloc
+sqlite3_memory_alarm
+sqlite3_memory_highwater
+sqlite3_memory_used
+sqlite3_mprintf
+sqlite3_mutex_alloc
+sqlite3_mutex_enter
+sqlite3_mutex_free
+sqlite3_mutex_leave
+sqlite3_mutex_try
+sqlite3_next_stmt
+sqlite3_open
+sqlite3_open16
+sqlite3_open_v2
+sqlite3_os_end
+sqlite3_os_init
+sqlite3_overload_function
+sqlite3_prepare
+sqlite3_prepare16
+sqlite3_prepare16_v2
+sqlite3_prepare_v2
+sqlite3_profile
+sqlite3_progress_handler
+sqlite3_randomness
+sqlite3_realloc
+sqlite3_release_memory
+sqlite3_reset
+sqlite3_reset_auto_extension
+sqlite3_result_blob
+sqlite3_result_double
+sqlite3_result_error
+sqlite3_result_error16
+sqlite3_result_error_code
+sqlite3_result_error_nomem
+sqlite3_result_error_toobig
+sqlite3_result_int
+sqlite3_result_int64
+sqlite3_result_null
+sqlite3_result_text
+sqlite3_result_text16
+sqlite3_result_text16be
+sqlite3_result_text16le
+sqlite3_result_value
+sqlite3_result_zeroblob
+sqlite3_rollback_hook
+sqlite3_set_authorizer
+sqlite3_set_auxdata
+sqlite3_shutdown
+sqlite3_sleep
+sqlite3_snprintf
+sqlite3_soft_heap_limit
+sqlite3_soft_heap_limit64
+sqlite3_sourceid
+sqlite3_sql
+sqlite3_status
+sqlite3_step
+sqlite3_stmt_busy
+sqlite3_stmt_readonly
+sqlite3_stmt_status
+sqlite3_strglob
+sqlite3_stricmp
+sqlite3_strnicmp
+sqlite3_temp_directory DATA
+sqlite3_test_control
+sqlite3_thread_cleanup
+sqlite3_threadsafe
+sqlite3_total_changes
+sqlite3_trace
+sqlite3_transfer_bindings
+sqlite3_update_hook
+sqlite3_uri_boolean
+sqlite3_uri_int64
+sqlite3_uri_parameter
+sqlite3_user_data
+sqlite3_value_blob
+sqlite3_value_bytes
+sqlite3_value_bytes16
+sqlite3_value_double
+sqlite3_value_int
+sqlite3_value_int64
+sqlite3_value_numeric_type
+sqlite3_value_text
+sqlite3_value_text16
+sqlite3_value_text16be
+sqlite3_value_text16le
+sqlite3_value_type
+sqlite3_version DATA
+sqlite3_vfs_find
+sqlite3_vfs_register
+sqlite3_vfs_unregister
+sqlite3_vmprintf
+sqlite3_vsnprintf
+sqlite3_vtab_config
+sqlite3_vtab_on_conflict
+sqlite3_wal_autocheckpoint
+sqlite3_wal_checkpoint
+sqlite3_wal_checkpoint_v2
+sqlite3_wal_hook
+sqlite3_win32_mbcs_to_utf8
+sqlite3_win32_set_directory
+sqlite3_win32_sleep
+sqlite3_win32_utf8_to_mbcs
+sqlite3_win32_write_debug
+winSysInfo DATA
diff --git a/x64_dbg_dbg/sqlite/sqlite32.lib b/x64_dbg_dbg/sqlite/sqlite32.lib
new file mode 100644
index 00000000..26f10110
Binary files /dev/null and b/x64_dbg_dbg/sqlite/sqlite32.lib differ
diff --git a/x64_dbg_dbg/sqlite/sqlite64.lib b/x64_dbg_dbg/sqlite/sqlite64.lib
new file mode 100644
index 00000000..5c1c114c
Binary files /dev/null and b/x64_dbg_dbg/sqlite/sqlite64.lib differ
diff --git a/x64_dbg_dbg/x64_dbg.cpp b/x64_dbg_dbg/x64_dbg.cpp
index 326af016..20e1b0c9 100644
--- a/x64_dbg_dbg/x64_dbg.cpp
+++ b/x64_dbg_dbg/x64_dbg.cpp
@@ -71,6 +71,10 @@ static void registercommands()
cmdnew(cmd, "pause", cbDebugPause, true); //pause debugger
cmdnew(cmd, "memwrite", cbMemWrite, true); //memwrite test
cmdnew(cmd, "StartScylla\1scylla\1imprec", cbStartScylla, false); //start scylla
+ cmdnew(cmd, "cmt\1cmtset\1commentset", cbInstrCmt, true); //set/edit comment
+ cmdnew(cmd, "cmtc\1cmtdel\1commentdel", cbInstrCmtdel, true); //delete comment
+ cmdnew(cmd, "lbl\1lblset\1labelset", cbInstrLbl, true); //set/edit label
+ cmdnew(cmd, "lblc\1lbldel\1labeldel", cbInstrLbldel, true); //delete label
}
static bool cbCommandProvider(char* cmd, int maxlen)
@@ -121,6 +125,8 @@ extern "C" DLL_EXPORT const char* _dbg_dbginit()
while(dir[len]!='\\')
len--;
dir[len]=0;
+ strcpy(sqlitedb_basedir, dir); //debug directory
+ PathAppendA(sqlitedb_basedir, "db");
SetCurrentDirectoryA(dir);
gMsgStack=msgallocstack();
if(!gMsgStack)
diff --git a/x64_dbg_dbg/x64_dbg_dbg.vcxproj b/x64_dbg_dbg/x64_dbg_dbg.vcxproj
index 10039474..4d8f19f6 100644
--- a/x64_dbg_dbg/x64_dbg_dbg.vcxproj
+++ b/x64_dbg_dbg/x64_dbg_dbg.vcxproj
@@ -97,7 +97,7 @@
Windows
true
true
- $(SolutionDir)bin\x32\x32_bridge.lib;dbghelp\dbghelp_x86.lib;TitanEngine\TitanEngine_x86.lib;psapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+ $(SolutionDir)bin\x32\x32_bridge.lib;dbghelp\dbghelp_x86.lib;TitanEngine\TitanEngine_x86.lib;sqlite\sqlite32.lib;psapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;shlwapi.lib;%(AdditionalDependencies)
@@ -112,7 +112,7 @@
Windows
true
true
- $(SolutionDir)bin\x64\x64_bridge.lib;dbghelp\dbghelp_x64.lib;TitanEngine\TitanEngine_x64.lib;psapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+ $(SolutionDir)bin\x64\x64_bridge.lib;dbghelp\dbghelp_x64.lib;TitanEngine\TitanEngine_x64.lib;sqlite\sqlite64.lib;psapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;shlwapi.lib;%(AdditionalDependencies)