Expression
int
Expression(t_result *result,wchar_t *expression,uchar *data,ulong
base,ulong size,ulong threadid,ulong a,ulong b,ulong mode);
Evaluates expression to numerical and/or text value in one step. In fact, this is a shortcut that calls first Cexpression() (expression parser) then Eexpression()
(expression estimator). Does not support multi-expression strings. If
value of expression must be calculated several
times, split this call in two or consider use of Fastexpression().
Parameters:
result
(out) Structure of type t_result that receives results of the evaluation
expression
(in) Pointer to the expression, zero-terminated UNICODE string. The syntax of expressions is described here. Note that Expression() is unable to process multi-expression strings in form "<expression1>,<expression2>, ..."
data
(in) Pointer to the optional copy of memory contents. If data is NULL, flag EMOD_NOMEMORY is not set and expression includes contents of memory, Expression() reads memory of debugged process. If data is not NULL and expression accesses memory in the range [base..base+size-1], contents of memory is taken from the data. In all other cases attempt to access memory will result in the failure
base
(in) Base address of the supplied data block, ignored if data is NULL
size
(in) Size of the supplied data block, ignored if data is NULL
threadid
(in) Identifier of the thread containing CPU registers used in the evaluation of the expression. If expression specifies register and threadid is 0, Expression() will fail
a
(in) First parameter, determines value of the pseudovariable %A in expression
b
(in) Second parameter, determines value of the pseudovariable %B in expression
mode
(in) Evaluation mode, combination of zero or more of the following flags:
EMOD_CHKEXTRA - reports error "Extra characters on line" if the first non-blank symbol after syntactically complete expression of maximal length is neither '\0' nor semicolon (starts comment)
EMOD_NOVALUE - requests not to convert the binary value of the expression (result->data) to text (result->value)
EMOD_NOMEMORY - forbids reading of the Debuggee's memory. If expression includes contents of memory and data is not supplied, evaluation will fail
EMOD_MULTI - not allowed in calls to Expression()
Return
values:
Number of processed UNICODE characters in expression.
If expression is syntactically invalid, this is roughly the location of
the syntax error. The inability to estimate the value of the
syntaxically correct expression is indicated by the type EXPR_INVALID in result->datatype
Example:
This is the drawing function of the Watches window:
typedef struct t_watch { // Watch descriptor
ulong
addr;
// 0-based watch index
ulong
size;
// Reserved, always 1
ulong
type;
// Service information, TY_xxx
wchar_t
expr[TEXTLEN]; // Watch
expression
} t_watch;
// Drawing function of watch window.
int Watchdraw(wchar_t *s,uchar *mask,int *select,
t_table *pt,t_drawheader *ph,int column,void *cache) {
int n=0;
t_watch *pwatch=(t_watch *)ph;
t_result result;
switch (column) {
case
DF_CACHESIZE:
// Request for draw cache size
return 0;
case
DF_FILLCACHE:
// Request to fill draw cache
return 0;
case
DF_FREECACHE:
// Request to free cached resources
return 0;
case
DF_NEWROW:
// Request to start new row in window
return 0;
case
0:
// Expression
n=StrcopyW(s,TEXTLEN,pwatch->expr);
break;
case
1:
// Value of expression
if (pwatch->addr==(ulong)watch.sorted.n-1)
break;
// Last expression is always empty
Expression(&result,pwatch->expr,NULL,0,0,
Getcputhreadid(),0,0,EMOD_CHKEXTRA);
if (result.datatype==EXPR_INVALID)
*select=DRAW_HILITE|DRAW_TEXT;
n=StrcopyW(s,TEXTLEN,result.value);
break;
default: break; };
return n;
};
See
also: