CreateFile打開文件執行流程淺析

CreateFile打開文件的執行流程淺析<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

    分析CreateFile這個函數打開文件的執行流程有助於我們理解windows操作系統在接收到用戶打開文件請求後都會做哪些工作、它是如何找到驅動程序的、以及有哪些windows核心部件參與了打開文件的操作,這對我們開發windows驅動程序十分有益。下面我們以CreateFile打開文件C:/MYFILE.CPP來淺析這一過程,系統對象參考圖例見下圖。

 

1、              用戶程序通常通過給win32子系統例程CreateFile()指定文件名、訪問權限以及其它一些參數來打開文件,本例當中文件名是C:/MYFILE.CPP;隨後win32子系統將收到的文件名前面加上前綴//./,即文件名變爲//./C:/MYFILE.CPP,處理完後win32子系統會代表用戶程序調用NtCreateFile()系統調用,此時,CPU將會由用戶態轉換爲內核態。NtCreateFile()系統調用是由I/O管理器實現的,它必須在內核態執行。

2、              NtCreateFile()內部,I/O管理器將接收到的文件名前綴//./轉化爲/??/,即/??/C:/MYFILE.CPP,轉化後的名字被I/O管理器發送給對象管理器(Object Manager)來解析。

3、              對象管理器會對文件名前綴“??”進行特殊處理,在對象管理器看來,文件名前綴“??”是指當前會話的DosDevices目錄,因此對象管理器就在當前會話的DosDevices目錄下查找“C:”,如果找不到,則它根據DosDevices目錄下的符號連接“Global”到達“/Globall??”目錄。

4、              現在對象管理器會在“/Globall??”目錄下查找“C:,在這個目錄下它找到了“C:”,並且“C:”是指向“/Device/HarddiskVolume1,因此它將生成新的內核路徑/Device/HarddiskVolume1/MYFILE.CPP,並且重新解析這個新生成的路徑。

5、              取得了新路徑,對象管理器會在根目錄下查找Device目錄,找到後它會在/Device目錄中尋找HarddiskVolume1,通過這個名字它將會找到一個設備對象。這個設備對象是一個存儲設備對象(storage device object)。

6、              找到設備對象後對象管理器將把這個設備對象以及未解析完的文件名/MYFILE.CPP返回給I/O管理器處理。I/O管理器會檢驗這個設備對象是否被文件系統掛載過(通過查看與它關聯的VPB中的VPB_MOUNTED標誌),若未掛載,則I/O管理器會發送一個卷掛載請求給每一個可能掛載這個設備的文件系統進行卷掛載操作。若已掛載,則I/O管理器就能找到該設備對象對應的文件系統驅動程序,然後向該驅動程序對應的函數入口發送用戶請求。請注意,發送給驅動文件系統驅動程序的文件名是未解析的部分,本例中是/MYFILE.CPP

7、              最後,文件系統驅動程序進行相應的處理並將處理結果返回給I/O管理器,I/O管理器將結果給win32子系統,最終win32子系統把結果返回給用戶程序。

 

至此,CreateFile函數的執行流程大概分析完畢,從中我們可以瞭解windows在打開一個文件時會經歷CPU狀態的切換、文件名的轉變等操作,並且我們也會了解windows是如何找到驅動程序並把用戶請求發送誒給動程序的。

 

本文只是個人總結,其中不乏錯誤之處,歡迎大家指正。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章