2011年8月27日星期六

ODbgScript源碼學習(六)

接下來繼續
mru.h:
void mruAddFile(char* szFilePath); //添加文件
int mruGetMenu(char* buf); //獲取菜單
int mruGetCurrentMenu(char* buf); //獲取當前菜單
int mruGetCurrentMenu(HMENU mmru, int cmdIndex); // 獲取腳本上下文菜單 For Dynamic MRU List (Script Window Context Menu)
int mruCmdMenu(HMENU mmru,int cmdindex); //cmd菜單

mru.cpp:
//mru使用的原因是Ollydbg主菜單是靜態的,所以為下一個olldbg開始存儲mru

void mruAddFile(char* szFilePath) { //參數是文件路徑
char buf[4096] = {0}; //定義一個字節為0大小為4096的緩衝區

int n;
char key[5]; //定義字串
strcpy(key,"MRU "); //把"MRU"特徵字串複製到key

HINSTANCE h=hinstModule(); //獲取自身ODbgScript.dll的模塊句柄

for(n=1; n<=5; n++) { //n為1至5時循環
key[3]=n + 0x30; //ASCII n 根據n不同 key為"MRU1""MRU2""MRU3""MRU4""MRU5"
ZeroMemory(&buf, sizeof(buf)); //buf歸0
Pluginreadstringfromini(h,key,buf,0); //讀ollydbg.ini文件中的MRU存取的路徑到buf
if (strcmp(buf,szFilePath)==0) { //如果文件路徑與參數輸入的路徑相同
//Move File to first MRU移動文件到最先的MRU
key[3]='1'; //即"MRU1"
Pluginreadstringfromini(h,key,buf,0); //再次讀ollydbg.ini第一項"MRU1"
Pluginwritestringtoini(h,key,szFilePath); //寫入新路徑
key[3]=n + 0x30; //重新寫入當前MRU讀到的位置
Pluginwritestringtoini(h,key,buf); //寫入當前位置的MRU
return;
}
}
for(n=4; n>0; n--) { //如果n從4遞減到1
//Add File then Move others 添加文件然後移除其他
key[3]=n+0x30; //根據n不同 key為"MRU4""MRU3""MRU2""MRU1"
ZeroMemory(&buf, sizeof(buf)); //緩衝區歸0
Pluginreadstringfromini(h,key,buf,0); //讀出路徑到buf
if (strlen(buf)) { //如果路徑不為空
key[3]=n+1+0x30; //移到下一位MRU
Pluginwritestringtoini(h,key,buf); //即把路徑往下移
}
}
key[3]='1'; //MRU1
Pluginwritestringtoini(h, key, szFilePath); //寫入路徑

}

//在主菜單被調用一次ON MAIN MENU, ITS CALLED ONCE

int mruGetMenu(char* buf) {

char buf2[4096] = {0}; //定義為0長度為4096的緩衝區
char key[5];
char key2[5];
int p=0;
int c,v;
string path; //路徑

HINSTANCE h=hinstModule(); //獲取自身ODbgScript.dll的模塊句柄
strcpy(key,"MRU "); //賦值"MRU"到key
strcpy(key2,"MRU "); //賦值"MRU"到key2

for(int n=1; n<=5; n++) { //n為1至5時循環
key[3]=n+0x30; //ASCII n 根據n不同 key3"1""2""3""4""5"
key2[3]=key[3]; //複製一個副本到key2

ZeroMemory(&buf2, sizeof(buf2)); //緩衝區歸0
Pluginreadstringfromini(h,key,buf2,0); //獲取ini文件中的MRU到buf2
Pluginwritestringtoini(h,key2, buf2); //寫入buf2到mru
if (strlen(buf2)) { //如果路徑不為空
if (PathFileExists(buf2)) { //如果路徑有效
buf[p]=0x32; p++; //緩衝區的第p為"2"
buf[p]=key[3]; p++; //緩衝區的第p+1為"3"
buf[p]=0x20; p++; //緩衝區的第p+2為" "
path=buf2; //路徑為讀出的路徑
c=path.rfind('\\') + 1; //使用std字串函數最後一次"\\"的位置,并到下一位

while ( (v = strchr(&buf2[c],',')-&buf2[c]) > 0) { //"\\"之後一位開始查找第一個','位置,v是最後一個"\\"和之後第一個','的距離,假如','存在而且兩點距離不重合時候
buf2[c+v]='.'; //替換','到'.'
}
while ( (v = strchr(&buf2[c],'{')-&buf2[c]) > 0) { //"\\"之後一位開始查找第一個'{'位置,v是最後一個"\\"和之後第一個'{'的距離,假如','存在而且兩點距離不重合時候
buf2[c+v]='['; //替換','到'['
}
while ( (v = strchr(&buf2[c],'}')-&buf2[c]) > 0) { //"\\"之後一位開始查找第一個'}'位置,v是最後一個"\\"和之後第一個'}'的距離,假如','存在而且兩點距離不重合時候
buf2[c+v]=']'; //替換','到']'
}

strcpy(&buf[p],&buf2[c]); p+=strlen(&buf2[c]);//串拷貝
buf[p]=',';p++;
}
}
}
if (p>0) buf[--p]=0; //如果p大於0,緩衝區buf的前p為歸0

return p; //返回指針
}



没有评论:

发表评论