2011年9月5日星期一

ODbgScript源碼學習(十七)


//Change type to 2 to hilite executed commands
int setProgLineEIP(int line, int eip)  //設置行EIP
{

if (line>ollylang->script.size()) return false; //如果參數line大於腳本大小返回假

t_wndprog_data *ppl;

ppl = (t_wndprog_data *) Getsortedbyselection(&(ollylang->wndProg.data),line); //獲取分類數據

if (!(ppl->type & PROG_TYPE_ASM)) //如果類型為彙編
ppl->type |= PROG_ATTR_EXECUTED; //執行

//if (!(ppl->type & PROG_TYPE_COMMAND) //命令
// return true; //返回真

    ppl->eip = eip; //eip指向參數eip
if (ollylang->wndProg.hw!=NULL)
{
if (!ollylang->require_ollyloop) { //如果不是循環
Selectandscroll(&ollylang->wndProg,ollylang->pgr_scriptpos,2); //選擇scroll
InvalidateProgWindow();
}
}

return true;
}

int setProgLineValue(int line, DWORD value)   //設置行值
{
char buf[17];
sprintf(buf, "%X", value); //打印值
string str(buf);
return setProgLineValue(line, str); //重載setProgLineValue
}

int setProgLineValue(int line, string  &value) 
{

if (line>ollylang->script.size()) return 0;  //參數line大於腳本大小返回0

t_wndprog_data *ppl;
ppl = (t_wndprog_data *) Getsortedbyselection(&(ollylang->wndProg.data),line);

if (!(ppl->type & PROG_TYPE_COMMAND))
return 1;

string values;

values = CleanString(value); //清除字符串

//變量歷史Variable History

if (ollylang->showVarHistory && strcmp(ppl->values,"")) { //顯示歷史
if ( values.length() < PROG_VAL_LEN-2) {
if (ppl->values[0] != ',' && ppl->values[0] != '?' && value.compare("?") != 0)
values += " ";
values.append(ppl->values);
}
}

strncpy(ppl->values,values.c_str(),PROG_VAL_LEN-1); //拷貝串

ppl->values[PROG_VAL_LEN-1] = 0;

InvalidateProgWindow();

return 1;
}

int setProgLineValueFloat(int line, long double value)  //設置行值
{
char buf[128];
sprintf(buf, "%lf", value); //打印
string str(buf); //定義字符串
while (true) //如果為真
{
if (str.length() <= 3) break;  //如果長度小於3,中斷
if (str[str.length()-1] == '0') //字符串最後一位為0
str.erase(str.length()-1,1); //刪除最後一個字符
else 
break;
}
return setProgLineValue(line, str); //設置行值
}

int setProgLineResult(int line, var& result) //設置行返回值
{
if (result.vt == DW) //如果參數var類型的vt為雙字節
setProgLineResult(line,result.dw); //調用DWORD類型的setProgLineResult
else if (result.vt == FLT)
setProgLineResultFloat(line,result.flt);
else {
if(result.str.length() && !result.isbuf)
setProgLineResult(line,"\""+result.str+"\"");
else {
setProgLineResult(line,result.str);
}
}
InvalidateProgWindow();
return true;
}


没有评论:

发表评论