八宝书库 > 文学其他电子书 > 深入浅出MFC第2版(PDF格式) >

第185部分

深入浅出MFC第2版(PDF格式)-第185部分

小说: 深入浅出MFC第2版(PDF格式) 字数: 每页4000字

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!






   而且你得有某種程度的技術背景才能把它用得好。不過,說真的,我還是很感謝  Paul 



   DiLascia  的創意,讓我們的視野有了新的角度。 



   我想你也是。 



                                                                  935 


…………………………………………………………Page 998……………………………………………………………

                第五篇    附錄  



           重建 DBWIN 之 Debug Event 篇 



                                DBWIN                             DBWIN  

                 自從我開始注意到             之後,我就更加注意期刊有關於                  技巧的文章。這 



                才發現,好像大家滿喜歡在這個睿空宫F自己傲的功力。像  Paul Dilascia  這樣,以 



                        MFC     DBWIN                         …      MFC programming 

                高階的        來寫         ,當然也就不可能太過「威力」 雖然從 



                                              Paul                                 。h 

                的技巧來看,我們是學了不少。你知道,                的方法要求你改變你的原始碼,含入個 



                檔,並在你的  。cpp  檔加兩行。這在使用的方便性不怎麼高明。 



                要高明點,不落痕跡抓到  TRACE  輸出,就必須懂得  Windows  作業系統內部,以 



                     Windows   system   programming              Matt   Pietrek  

                及                          。是的,這方面的大師                     也寫了個 



                DBWIN                                debug event 

                       ,不必影響你的原始碼。不過,他用到                     ,以及許多系統知識,不應該 



                是本  MFC  書籍適合涵蓋的主睿K裕抑荒茉谶@裡告訴你,可以到  Microsoft 



                Systems  Journal  1995。07  的  Windows  Q/A  專欄學習。程式名稱為  LODPRF32  。此程 



                式的主要功能其實是讓你觀察目前所有映射到記憶體的  DLLs  。你可以從知道你的 



                EXE                     DLLs                    implicitly loading EXE 

                     直接或間接使用的所有            。它還會記錄「最後次                     」至「 



                entry  point  執行」之間的經過時間。此期間正是  Win32  載入器呼叫  implicitly  loaded 



                DLLs  的初始化程式碼(程式進入點)的時間。最後,它允許使用者濾掉所有的  debug 



                event                OutputDebugString        …            DBWIN !? 

                     ,只記錄被除錯端的                     輸出的字串  這功能可不正是 



                使用真簡單,不是嗎!這程式若說還有什麼缺點,那就是「只有被此  DBWIN  載入之程 



                式,其  TRACE  輸出字串才能夠被觀察」。有洠в锌赡芟瘛 in16  的  DBWIN  那樣,做 



                個系統層面的  〃global〃  DBWIN  ,像常駐程式那樣隨時偵測等候任何程式發出的任何 



                TRACE  字串呢?可能,但我們還要再層獄,進入  ring0  層次。 



936 


…………………………………………………………Page 999……………………………………………………………

                                                                  附錄D    以MFC 重建DBWIN  



                                             CreateProcess(。。。DEBUG_ONLY_THIS_PROCESS。。。); 



                                                                                    process A 



                                                                                 。。。 

                                                                                 TRACE(〃trace1 n〃); 

                                                                                 TRACE(〃trace2 n〃); 

                                                                                 TRACE(〃trace3 n〃); 

                                                                                 。。。 



                                                            OUTPUT_DEBUG_STRING_EVENT 



          LODPRF32 功能不少。若你把 〃OutputDebugString Only〃 

          那個圓鈕按,它就是個 DBWIN 。 



       圖九      LODPRF32   功能不少。若你把   〃OutputDebugString Only〃   那個圓 

              鈕按下,它就是個   DBWIN  。 



重建 DBWIN 之VxD 篇 



                      global DBWIN                                                  Ton Plooy 

       若想要寫個                       ,困難度陡增。不過,已經有做出來了。請參考 



       發表於   Windows Developer's Journal 1996。12  的  〃A DBWIN Utility for Win95〃  文。 



       前個  DBWIN  之所以不能夠做到  〃global〃  ,是因為行程有獨立的位址空間。如欲接收 



       除錯訊息,又必須建立「除錯器」與「被除錯端」的關係。那麼,有洠в惺颤N辦法 



       可以建立個「系統除錯器」,把所有執行起來的程式統統視為我的除錯對象?如果這 



       個問睿锌隙ù鸢福琯lobal DBWIN  就有希望了。 



       有,VMM  提供了個  INT 41h  介面。此介面作用起來的條件是,必須有個「系統除 



       錯器」存在。而「系統除錯器」存在的條件是:當  VMM  以int41h/AX=DS_DebLoaded  發 



       出訊息時,必須有程式以  AX=DS_DebPresent  回覆之。 



       可是  OutputDebugString  和「系統除錯器」有洠в惺颤N牽連?如果洠в袆t切白搭。幸 



       叩氖恰 utputDebugString  最終會牽動  VMM  的  Exec_PM_Int41h  service 。如果我們能 



                                                                                                    937 


…………………………………………………………Page 1000……………………………………………………………

                         第五篇    附錄  



                                                 Exec_PM_Int41h                                 Exec  PM  Int41h 

                                                                             hooking                 _    _          

                         夠寫個程式,與                                    掛勾(               ),使                          能夠先來呼 



                          叫我自己的函式,我就可以悠游自在在其處理TRACE  的除錯字串了。 



                         這個技術最大的難點在於,要與  VMM  打交道,我們得寫  ring0  程式。在  Windows 95   



                                            VxD    NT             VxD      VxD                            DOS/Windows  虛虛 

                         這意味著要寫                  ( 不支援                 )。        的架構其實不太難,                                     虛虛 



                         擬機器作業環境擬機器作業環境                   /         1993                                             VMM  

                         擬機器作業環境擬機器作業環境 (侯俊傑 旗標,                          )曾經有過詳細的探討。問睿陟丁                                  〉脑S 



                          多  services  常常要合著用,尤其是面對斷模擬、事件處理、與  ring3  通訊過程、乃至 



                         於  hooking  的處理等等,而這方面的資料與範例相當稀少。此外,ring0  和  ring3  間的 



                          同步(synchronous )處理,也很令頭痛。 



                                                                                                                            process A 

                                                           global  DBWIN 

                                                                                                                     。。。 

                                                                                                                     TRACE(〃JJHOU n〃); 

                                                                                                                     TRACE(〃MikeSon n〃); 

                                                                                                                     TRACE(〃Matt n〃); 

                                                                                                                     。。。 



                                                                                                                              process B 



                                                                                                                     。。。 

                                                                                                                     TRACE(〃trace1 n〃); 

                                                                                                                     TRACE(〃trace2 n〃); 

                                                                                                                     TRACE(〃trace3 n〃); 

                                                                                                                     。。。 



                                                                                                                            process C 



                                                                                                                     。。。 

                                                                                                                     TRACE(〃Sue n〃); 

                                                                                                                     TRACE(〃Stella n〃); 

                                這個 DBWIN 可接收任何 ring3 程式的 Trace 字串。發出 Trace 字串 

                                                                                                                     TRACE(〃Dennis n〃); 

                                的程式不必和這個 DBWIN 有任何關連。 

                                                                                                                     。。。 



                          圖十      global DBWIN   的執行畫面。它是一個   Console   程式,在接受任何按 

                                    鍵之前,將一直存在。 



                 不甘示弱 



                         Paul DiLascia  看到百家爭鳴,大概是不甘示弱,在  Microsoft Systems Journal  1997。04  的 



938 


…………………………………………………………Page 1001……………………………………………………………

                                                              附錄D    以MFC 重建DBWIN  



        C/C++ Q/A  專欄又發表了篇文章。他說「理想TraceWin 應該無臭無味,如影隨形。 



              #include      init   。。。 

        洠в小          。瑳'有  函式 」 



        於是他又想到種方法,此法只能

返回目录 上一页 下一页 回到顶部 0 0

你可能喜欢的