wdk tips (4): 當你CreateFile時,你都幹了些什麼

來源:互聯網
上載者:User

今天我們聊一聊CreateFile,這個名字取的不合適但IO的世界裡完全繞不過去的東西,以及與之相關的“namespace”這一概念。

我們知道Create的意思是創造,建立,上帝創造了這個世界,指的可不是上帝開啟了某樣存在的東西(唯物主義者,我知道你們有意見,給我閉嘴…),但這個倒黴的函數要做的卻是開啟。我們也知道File是檔案,windows裡面也沒有“一切都是檔案”的概念,但這個倒黴的函數要做的卻是開啟所有能返回handle的核心對象。Anyway,CreateFile函數是唯一一個能開啟核心對象的handle,並讓user mode app來訪問的方法。將範圍縮小到驅動,這個函數也是唯一一個能開啟驅動的handle以便user mode app訪問驅動的方法。CreateFile帶的參數中有一個lpFileName指定了核心對象的名字,如果該名字指代的是一個驅動,那麼擁有該名字的PDEVICE_OBJECT的IRP_MJ_CREATE常式就會被調用到,返回的handle則是該object的代理(詳情請參看本博中跟handle有關的那幾篇),在這個handle上調用read,write,DeviceIoControl等操作最後都會落到PDEVICE_OBJECT相應的IRP_MJ_XX上。IoManager在開啟handle的過程中扮演了至關重要的角色,沒有它的幫忙,user mode和kernel mode的通訊將會非常困難,除非你覺得每寫一個驅動就增加一個系統調用很簡單很有趣。那麼IoManager都做了些什麼了,一般是以下幾步:

  1. 解析lpFileName參數。檔案名稱裡的內容對user mode有意義,但對核心不一定有意義。一般情況下這個名字都是一個symbol link,簡單點可以把它想成是一個別名,link的target是真正的名字,就好比地海中的魔法師都有真名,只有知道了真名,你才能打敗他。舉個例子,"C:”這個盤符就是一個symbol link,它的真名是"\Device\HarddiskVolume1”
  2. 如果名字存在,那麼找到相應的核心對象。討論範圍縮小到驅動就是一個PDEVICE_OBJECT。
  3. 如果解析完名字後還有字串剩下,則把這剩下的字串貼在FileName域裡
  4. 產生一個IRP,交給驅動處理。

注意,這裡有個安全性漏洞:如果FileName域為NULL,那麼開啟handle的時候會做許可權檢查。如果不為NULL,則預設不檢查,即使你的驅動裡放了空空的動作片,你父母想訪問就能訪問。你肯定不想讓這種事發生。所以在建立PDEVICE_OBJECT時記得把FILE_DEVICE_SECURE_OPEN標誌位加到Characteristics域中去,這會強制IoManager檢查許可權,即使FileName不為NULL。

讓我們舉幾個例子,假設你要對"C:\av\rio.avi”做CreateFile,IoManager首先會解析這個字串,它發現"C:”指的是"\Device\HarddiskVolume1”,並且"\Device\HarddiskVolume1”在namespace中存在,那麼它將尋找"\Device\HarddiskVolume1”對應的object,找到後建立IRP,將"\av\rio.avi”貼在FileName域裡,並將irp轉給相應的object處理。因為FileName裡的內容不為空白,所以IoManager不會檢查許可權,你就祈求上帝FILE_DEVICE_SECURE_OPEN標誌位已經被設定了吧。但是如果你對"c:”做訪問,那麼FileName域為NULL,不管標誌位有沒有設定,許可權檢查的動作都會做。

關於symbol link和真實姓名的資訊全部在一個叫name space的東西裡,這東西和檔案系統一樣,也用樹形結構管理,根部是名字"\”。用牛逼工具WinObj可以清楚的看到整個name space的資訊,如所示

個人認為這才是真正的檔案系統,與*NIX中的檔案系統相對應,而C盤D盤等所謂的盤符其實是檔案系統中的某個目錄,被Explorer這個Window Manager放在首頁了而已。盤符是*NIX程式員最喜歡的吐槽點,沒有之一,但其實nt核心裡的目錄(某種程度上說)也是單根的,所謂盤符就是個別名,mount等操作其實也很容易實現。linux中核心可以註冊虛擬目錄,比如/proc,/dev這種,nt裡也可以在name space裡添加自己想要的東西,將這個名字與自己的驅動綁定,能做的事情跟虛擬目錄實在很像。說到這裡我又想感慨一下,作業系統這麼手藝,發展到今天大家在某些關鍵點上的選擇那是出奇的一致。反而是那些user mode的東西則是各有個的特色,大家會爭的面紅耳赤。那些個滿嘴"UNIX”哲學的哲學家,我可以肯定他沒接觸過核心。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.