日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

给Source Insight做个外挂系列之五--Insight “TabSiPlus”

發布時間:2024/4/11 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 给Source Insight做个外挂系列之五--Insight “TabSiPlus” 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
“TabSiPlus 外掛插件”主要有兩部分組成,分別是“外掛插件加載器”和“插件動態庫”。“插件動態庫”完成Source Insight窗口的Hook,顯示Tab標簽欄,截獲Source Insight的窗口消息并根據消息調整Tab標簽欄等功能,這是一個動態鏈接庫,不能主動執行,所以還需要一個“外掛插件加載器”,“外掛插件加載器”是一個獨立的可執行文件,它的主要功能就是發現Source Insight的進程,并把插件動態庫“注入”到Source Insight的進程中。本文將簡單介紹這兩個組件是如何協同工作,最終實現插件的完整功能。
????
??? 首先介紹“外掛插件加載器”,它就是TabSiHost.exe組件,它的功能就是監視Source Insight進程,發現Source Insight的主窗口,將插件主體動態庫插入到Source Insight。關于如何發現Source Insight和代碼注入的方法請查看本系列的第一篇《發現Source Insight》和第二篇《將本地代碼注入到Source Insight》,此處就不再贅述。此處主要介紹TabSiHost.exe組件的工作流程以及一些實現細節問題。TabSiHost.exe組件的主函數是MainFunction(),這個函數首先獲取參數,根據參數判斷是加載還是卸載插件,然后是啟動一個定時器,這個定時器負責監視Source Insight進程,最后進入一個消息循環,等待進程結束。定時器的主要任務就是檢查是否有Source Insight進程創建,其實就是枚舉當前全部程序的主窗口,查看是否有Source Insight的主窗口,如果有則要根據設置確定是否對其實施代碼注入。這里需要注意的是不能重復注入,因為每次注入都要創建一個Tab標簽欄,重復注入會導致很難看的事情發生。如何確定Source Insight已經被Hook過了呢?其實可以有很多方法,比如創建內核對象進行標識,這只內存標志等等,TabSiPlus使用了一種很巧妙的方式,就是在Source Insight主窗口的窗口標題字符串中插入一個標識字符串“with TabSiPlus”,這樣定時器在枚舉程序的主窗口的時候就可以根據窗口標題判斷這個進程實例是否已經被Hook過了,同時,這個字符串標識還宣示了“TabSiPlus 插件”的存在,一舉兩得。簡單了解了“外掛插件加載器”的工作過程之后,下面將重點介紹“插件動態庫”的工作過程。

??? 本系列的第三篇已經介紹過TabSiPlus.dll組件中的代碼執行順序,當LoadLibrary()調用發生時,CTabSiPlusApp類的構造函數和InitInstance()首先被調用,緊接著導出函數Initialize()被調用,Initialize()函數創建了CTabWndUIThread線程,CTabWndUIThread線程在初始化函數InitInstance()中創建并顯示一個Tab標簽欄,于是插件開始工作了。說起來簡單,其實還是有很多細節,最重要的一點就是Hook(子類化) Source Insight的內部窗口。毫無疑問,要使外掛插件能夠在沒有對外接口的情況下無縫地介入到Source Insight當中,必需要Hook它的窗口消息,這樣才能覺察它的變化,所以,在看是內部探索之前,先看看TabSiPlus.dll組件的內部Hook類關系圖:


圖 5.1 TabSiPlus.dll組件內部Hook類關系圖

這個關系圖基本上和Source Insight的實際窗口關系是一致的,只是多了一個CMdiChildManagment類,這個類的主要目的是維護CSiMDIWnd類的所有子窗口。

??? CSIFrameWnd類主要是Hook Source Insight的主窗口消息,CSIFrameWnd類主要關心的消息有兩個,一個是WM_SETTEXT消息,另一個是WM_DESTROY消息。處理WM_SETTEXT的目的是為了在窗口標題發生變化的時候,添加本插件的標識字符串:with TabSiPlus。當Windows需要改變標題文字時,WM_SETTEXT消息就會觸發,其中第二個參數就是存放窗口標題的緩沖區,這是一個地址,將其替換成我們定制的字符串地址就能起到定制窗口標題的作用:

??? ??? case WM_SETTEXT:
??? ??? {
??? ??? ??? static TCHAR szBuffer[512];
??? ??? ??? if(lParam)
??? ??? ??? {
??? ??? ??? ??? lstrcpy(szBuffer,(LPCTSTR)lParam);
??? ??? ??? ??? lstrcat(szBuffer,lpszTextMark);
??? ??? ??? ??? lParam = (LPARAM)szBuffer;
??? ??? ??? }
??? ??? ??? DebugTracing(gnDbgLevelNormalDebug,_T("SIFrameWnd reach WM_SETTEXT, %s"),g_szCurDircetory);
??? ??? ??? break;
??? ??? }

處理WM_DESTROY消息的目的是要知道Source Insight什么時候被關閉了,主窗口是最后被銷毀的窗口,攔截主窗口的WM_DESTROY消息使Tab標簽欄能夠有機會在主窗口銷毀前銷毀自己,然后等待CTabWndUIThread線程結束,既能夠避免資源泄漏,也能防止Source Insight出現異常:

??? if(uMsg == WM_DESTROY)
??? {
??? ??? DebugTracing(gnDbgLevelNormalDebug,_T("SIFrameWnd reach WM_DESTROY, Destroy Tabbar"));
??? ??? bExitPadding = TRUE;
??? ??? g_pSiFrameWnd->DestroyTabbarWnd();
??? ??? if(g_pTabWndUIThread != NULL)
??? ??? {
??? ??? ??? ::WaitForSingleObject(g_pTabWndUIThread->m_hThread,INFINITE);
??? ??? ??? g_pTabWndUIThread = NULL;
??? ??? }
??? ??? DebugTracing(gnDbgLevelNormalDebug,_T("SIFrameWnd reach WM_DESTROY, Waiting Tabbar thread end"));
??? }

??? 接下來是CSiMDIWnd類。CSIFrameWnd類的實例在Hook主窗口后,就會調用CSIFrameWnd::GetMDIClientWnd()函數獲取MDIClient窗口,MDIClient窗口是所有MDI Child窗口的直接父窗口,它處理MDI Child窗口的消息,比如創建、最大化、最小化以及銷毀等等,所以非常重要。和工具欄,狀態欄一樣,MDIClient窗口是主窗口的一個子窗口,前文也講過,它有固定的窗口類名:MDIClient,所以獲取MDIClient窗口的方法就是遍歷主窗口的所有子窗口,找到窗口類名是MDIClient的子窗口,幸運的是,Source Insight的主窗口有且只有一個MDIClient窗口,看代碼:

/*這個函數總是返回一個有效的窗口句柄,即使不是MDIClient*/
HWND CSIFrameWnd::GetMDIClientWnd()
{
??? TCHAR cClassName[256];

? HWND hMDIWnd = g_pSiFrameWnd->GetTopWindow();
? ::GetClassName(hMDIWnd, cClassName, sizeof(cClassName));
? while(lstrcmp(cClassName, lpszMdiClientWndClass) != 0)
? {
??? hMDIWnd = ::GetNextWindow(hMDIWnd, GW_HWNDNEXT);
??? ASSERT(hMDIWnd);
??? GetClassName(hMDIWnd, (LPTSTR)cClassName, sizeof(cClassName));
? }

??? return hMDIWnd;
}

找到MDIClient的窗口句柄后,就用CSiMDIWnd類Hook它,Hook之后的第一件事就是遍歷MDIClient窗口的所有子窗口(就是Source Insight的視圖窗口,窗口類名是si_Sw),分別用CSiWindow類Hook全部子窗口,并將它們納入到CMdiChildManagment類的管理中。CSiMDIWnd類是整個插件中最重要的部分,它主要處理幾個重要的Windows消息,分別是WM_MDICREATE、WM_MDIDESTROY、WM_MDIACTIVATE和WM_WINDOWPOSCHANGING。在前文《分析“Source Insight”》中已經分析過,當Source Insight打開一個新文件時,主窗口會創建一個窗口類名是si_Sw的窗口,由于Source Insight使用的是Windows標準MDI界面,所以截獲MDIClient窗口的WM_MDICREATE消息就可以獲取新打開的窗口,從窗口的標題中分析出文件名,然后在Tab標簽欄創建相應的標簽。同樣當WM_MDIDESTROY發生時,表示關閉了一個文檔,此時要從Tab標簽欄中刪除相應的標簽,當WM_MDIACTIVATE發生時,要對Tab標簽欄中對應的標簽突出顯示。要在Source Insight中顯示一個標簽窗口其實很簡單,以主窗口為父窗口創建一個子窗口就可以了,但這樣硬插進去的一個窗口會破壞整個Source Insight的界面,不是覆蓋其它子窗口就是被其它子窗口覆蓋,所以要處理好窗口之間的位置關系很重要。要正確處理窗口位置關系,還要Hook MDIClient窗口的WM_WINDOWPOSCHANGING消息,當MDIClient窗口的大小或位置或窗口Z-Order將要發生變化時,Windows就會發送WM_WINDOWPOSCHANGING消息給MDIClient窗口,獲取窗口的位置,大小等等信息,這個消息的LParam參數是一個WINDOWPOS結構(指針),其中cx和cy兩個參數就是窗口的寬度和高度,修改這兩個值就可以欺騙Windows按照我們的要求調整MDIClient窗口的位置,通常我們要減少cy的值,給我們的Tab標簽欄留出空間。

??? 接下來是CSiWindow類,這個subclass主要是HookMDIClient窗口的子窗口,子窗口的窗口句柄和CSiWindow對象之間有一個映射關系,這個關系由CMdiChildManagment類維護。CSiWindow主要是Hook了WM_GETTEXT消息,目的是獲取子窗口標題的變化,然后在標簽欄中相應的有所表現,比如,對于具有只讀屬性的文件,Source Insight會在其文件名前面顯示一個“!”,當只讀屬性被取消后,“!”也會消失,CSiWindow要捕獲這個變化,然后通知標簽欄相應地修改窗口對應的標簽欄。再比如,當一個文件被修改過后,文件名后面會有一個“*”,當執行文件保存后,這個“*”號要消失,這些也要在標簽欄同步變化。

??? 最后是標簽欄窗口CTabBarsWnd,這個類代碼最多,其實功能很簡單,就是維護一個TabCtrl控件,處理界面操作,根據主窗口的位置和大小調整自己的大小和位置。本來CTabBarsWnd就是一個普通的窗口類,但是在本插件中我讓它繼承自CReBar類,為的是偷一些懶,那個功能按鈕其實就是只有一個圖標的工具條,將它和TabCtrl控件作為兩個Band添加到Rebar上,省了很多麻煩。

??? TabSiPlus的內部結構就是這樣,很簡單啊,不是嗎?


Source Insight文件標簽外掛:TabSiPlus的下載地址:
http://www.winmsg.com/download/tabsiplus.zip?

版權聲明:本文為博主原創文章,未經博主允許不得轉載。

總結

以上是生活随笔為你收集整理的给Source Insight做个外挂系列之五--Insight “TabSiPlus”的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 老熟妇精品一区二区三区 | 手机在线看片福利 | 亚洲中文字幕无码一区二区三区 | 日韩黄色影视 | 91浏览器在线观看 | 黄色在线观看av | 国产男女自拍 | 中文天堂 | 伊人66| 欧美性猛交xxxx免费看久久久 | 精品国产视频在线 | 中文av一区| 在线视频www| 日韩1页 | 精品九九 | 免费av观看网站 | 国产美女视频一区 | 欧美日韩一区二区三区国产精品成人 | www.精品视频 | 永久精品 | 玖玖玖视频 | 国产精品偷伦视频免费看 | 亚洲美女屁股眼交8 | 黄色美女一级片 | 国内自拍网站 | 日本少妇高潮抽搐 | 国产最新在线视频 | 久久人人爽人人爽人人片av免费 | 丰满少妇一区 | 97se在线视频 | 亚洲精品久久久久久久蜜桃 | 欧美黄色a | 黄色aa大片 | 国产精品国产一区二区 | 很污很黄的网站 | 亚洲一区二区在线播放 | 国产极品网站 | 老狼影院伦理片 | 麻豆av影院| 日韩中文字幕在线观看 | 亚洲成人一区二区三区 | 国产成人av一区二区 | 亚洲我射 | 久草麻豆 | 一级a毛片免费观看久久精品 | たちの熟人妻av一区二区 | 国产手机在线 | 97操操| 国产精品尤物视频 | 免费在线观看av的网站 | 高潮白浆女日韩av免费看 | 一区二区欧美精品 | av男人资源 | 99re在线精品 | 亚洲一区二区三区成人 | 毛片入口 | 日韩免费久久 | 亚洲精品国产精品乱码不99热 | 抱着老师的嫩臀猛然挺进视频 | 青青青视频在线播放 | 少妇影院在线观看 | 2019国产精品| 久久久精品人妻一区二区三区四 | 污污视频免费观看 | www成人在线 | 老女人性生活视频 | 国产小视频在线 | 亚洲小说图片区 | 婷婷色综合 | 9久久9毛片又大又硬又粗 | 毛片网站入口 | 神马午夜av| 亚洲中文字幕无码av永久 | 老子影院午夜伦不卡大全 | juliaannxxxxx高清 黄页网站在线播放 | 亚洲调教欧美在线 | 伊人网伊人影院 | 97欧美视频 | 五月天伊人网 | 久久综合五月天 | 亚洲情涩 | 成人性做爰片免费视频 | 亚洲中文字幕无码爆乳av | 日本黄视频在线观看 | 中文字幕专区 | 爆操欧美| 国产宾馆实践打屁股91 | 国产黄频在线观看 | 日韩一区二区视频在线观看 | 欧美日韩中文字幕在线观看 | 成人网色| 人人射影院 | 国产超碰在线观看 | 操mm影院| 国产精品123区 | 在线99视频 | 伊人小视频 | 美女被艹视频网站 | 久久精品无码毛片 |