• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            微塵--KeepMoving

            為了忘卻的記憶
            posts - 3, comments - 2, trackbacks - 0, articles - 13
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            (轉)Win32應用程序的加載與啟動分析

            Posted on 2008-03-07 16:38 微塵 閱讀(664) 評論(0)  編輯 收藏 引用 所屬分類: Windows編程
             轉自 chenxixia 的 Blog

            Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=455591



            設有一個Win32下的可執行文件MyApp.exe,這是一個Win32應用程序,符合標準的PE格式。MyApp.exe的主要執行代碼都集中在其源文件MyApp.cpp中,該文件第一個被執行的函數是WinMain。初學者會認為程序就是首先從這個WinMain函數開始執行,其實不然。

                在WinMain函數被執行之前,有一系列復雜的加載動作,還要執行一大段啟動代碼。運行程序MyApp.exe時,操作系統的加載程序首先為進程分配一個4GB的虛擬地址空間,然后把程序MyApp.exe所占用的磁盤空間作為虛擬內存映射到這個4GB的虛擬地址空間中。一般情況下,會映射到虛擬地址空間中0X00400000的位置。加載一個應用程序的時間比一般人所設想的要少,因為加載一個PE文件并不是把這個文件整個一次性的從磁盤讀到內存中,而是簡單的做一個內存映射,映射一個大文件和映射一個小文件所花費的時間相差無幾。當然,真正執行文件中的代碼時,操作系統還是要把存在于磁盤上的虛擬內存中的代碼交換到物理內存(RAM)中。但是,這種交換也不是把整個文件所占用的虛擬地址空間一次性的全部從磁盤交換到物理內存中,操作系統會根據需要和內存占用情況交換一頁或多頁。當然,這種交換是雙向的,即存在于物理內存中的一部分當前沒有被使用的頁也可能被交換到磁盤中。

                接著,系統在內核中創建進程對象和主線程對象以及其它內容。

                然后操作系統的加載程序搜索PE文件中的引入表,加載所有應用程序所使用的動態鏈接庫。對動態鏈接庫的加載與對應用程序的加載完全類似。

                再接著,操作系統執行PE文件首部所指定地址處的代碼,開始應用程序主線程的執行。首先被執行的代碼并不是MyApp中的WinMain函數,而是被稱為C Runtime startup code的WinMainCRTStartup函數,該函數是連接時由連接程序附加到文件MyApp.exe中的。該函數得到新進程的全部命令行指針和環境變量的指針,完成一些C運行時全局變量以及C運行時內存分配函數的初始化工作。如果使用C++編程,還要執行全局類對象的構造函數。最后,WinMainCRTStartup函數調用WinMain函數。

               WinMainCRTStartup函數傳給WinMain函數的4個參數分別為:hInstance、hPrevInstance、lpCmdline、nCmdShow。

                hInstance:該進程所對應的應用程序當前實例的句柄。WinMainCRTStartup函數通過調用GetStartupInfo函數獲得該參數的值。該參數實際上是應用程序被加載到進程虛擬地址空間的地址,通常情況下,對于大多數進程,該參數總是0X00400000。

                hPrevInstance:應用程序前一實例的句柄。由于Win32應用程序的每一個實例總是運行在自己的獨立的進程地址空間中,因此,對于Win32應用程序,WinMainCRTStartup函數傳給該參數的值總是NULL。如果應用程序希望知道是否有另一個實例在運行,可以通過線程同步技術,創建一個具有唯一名稱的互斥量,通過檢測這個互斥量是否存在可以知道是否有另一個實例在運行。

                lpCmdline:命令行參數的指針。該指針指向一個以0結尾的字符串,該字符串不包括應用程序名。

                nCmdShow:指定如何顯示應用程序窗口。如果該程序通過在資源管理器中雙擊圖標運行,WinMainCRTStartup函數傳給該參數的值為SW_SHOWNORMAL。如果通過在另一個應用程序中調用CreatProcess函數運行,該參數由CreatProcess函數的參數lpStartupInfo(STARTUPINFO.wShowWindow)指定。



             

            91性高湖久久久久| 国产午夜精品久久久久免费视| 精品国产99久久久久久麻豆| 久久成人小视频| 久久se精品一区二区| 国产农村妇女毛片精品久久| 亚洲人成网站999久久久综合 | 久久久久久国产精品免费免费 | 久久精品国产亚洲Aⅴ蜜臀色欲| 伊人久久大香线蕉综合5g| 亚洲AV无码1区2区久久| 精品久久久久久久久久久久久久久 | 久久香蕉国产线看观看精品yw| 久久精品一区二区国产| 亚洲国产成人精品女人久久久| 久久久久亚洲精品天堂| 日本欧美国产精品第一页久久| 国产V综合V亚洲欧美久久| 无码国内精品久久人妻麻豆按摩| 久久久噜噜噜久久中文福利| 久久亚洲精品国产精品婷婷| 精品久久久久久久久中文字幕| 亚洲午夜无码AV毛片久久| 99久久亚洲综合精品网站| 亚洲av伊人久久综合密臀性色 | 亚洲国产成人精品无码久久久久久综合 | 久久狠狠爱亚洲综合影院| 久久精品九九亚洲精品天堂| 久久人人爽人人爽人人片AV东京热 | 精品午夜久久福利大片| 婷婷久久久亚洲欧洲日产国码AV| 一级女性全黄久久生活片免费| 久久精品国产99久久丝袜| 国产精品美女久久久免费| 久久精品国产精品青草| 国产成人精品久久二区二区| 久久精品亚洲一区二区三区浴池 | 久久综合香蕉国产蜜臀AV| 午夜天堂精品久久久久| 亚洲中文精品久久久久久不卡| 久久夜色精品国产亚洲|