最近看了一下一個叫做filedisk的開來源程式的代碼 瞭解了關於磁碟裝置驅動的一些東西
總結一下
filedisk的功能就是可以把磁碟上的某個檔案對應成一個磁碟機
像一般的磁碟卷一樣來使用
關於filedisk的原理簡單來說就是利用驅動程式建立一個磁碟裝置(IoCreateDevice)
然後在使用者態程式中用DefineDosDevice將這個裝置掛載到某個盤符下面
也就是把所有到這個盤符的操作都導向使用核心驅動建立的這個虛擬磁碟裝置
在核心驅動裡面就處理所有的IRP_MJ_WRITE和IRP_MJ_READ請求就可以了
至於怎麼樣來處理這兩個讀寫請求就可以衍生出很多東西
比如在進行讀寫處理時對資料進行加密的話 就變成了一個透明加密的東西
比如TrueCrypt好像就是這麼做的
如果把寫操作複製幾份分別發到其他裝置 那麼就變成了 鏡像
filedisk裡面是把讀寫操作完全的導向某個磁碟檔案 這樣一來就是把檔案虛擬成磁碟了
其實這個辦法以前也做過 但是總是不行 看了filedisk的源碼以後才知道 除了處理讀寫操作之外
還需要處理很多DeviceIoControl的請求
作為一個磁碟驅動在filedisk裡面處理了以下的一些請求
直接返回STATUS_INVALID_DEVICE_REQUEST的IO請求有
IOCTL_DISK_CHECK_VERIFY
IOCTL_CDROM_CHECK_VERIFY
IOCTL_STORAGE_CHECK_VERIFY
IOCTL_STORAGE_CHECK_VERIFY2
IOCTL_DISK_MEDIA_REMOVAL
IOCTL_STORAGE_MEDIA_REMOVAL
IOCTL_CDROM_READ_TOC
IOCTL_DISK_SET_PARTITION_INFO
需要專門進行處理的IO請求
IOCTL_DISK_GET_DRIVE_GEOMETRY
IOCTL_DISK_GET_LENGTH_INFO
IOCTL_DISK_GET_PARTITION_INFO
IOCTL_DISK_VERIFY
IOCTL_DISK_GET_PARTITION_INFO_EX
IOCTL_DISK_IS_WRITABLE
對需需要進行處理的IO請求 按照ddk的文檔說明來處理就是
比如IOCTL_DISK_GET_DRIVE_GEOMETRY就是獲得該物理裝置的一些資訊
IOCTL_DISK_GET_PARTITION_INFO是獲得該磁碟上的分區表資訊等
以前做的時候就是沒有處理這些 導致失敗...囧
雖然現在看了filedisk 才知道需要處理這些請求
但是還是不知道 哪裡有資料講磁碟驅動 卷驅動需要處理哪些特定的IO控制請求
以上 就是filedisk的內容 做了這些 基本就能寫出一個 完整的虛擬磁碟裝置了
還有需要注意的地方就是在處理讀寫請求時 需要建立一個系統線程
分發常式中接收到的讀寫Irp包都插入一個隊列中 在建立的系統線程中來處理
這應該是 一種標準的做法 用來避免在分發常式中由於等待而死結的問題
嗯 然後下來就是準備嘗試把這個和過濾驅動結合起來了...
嗯 又可以由此衍生出很多應用