利用windows內核驅動創建虛擬磁盤設備

最近看了一下一個叫做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包都插入一個隊列中 在創建的系統線程中來處理

這應該是 一種標準的做法 用來避免在分發例程中由於等待而死鎖的問題

嗯 然後下來就是準備嘗試把這個和過濾驅動結合起來了...

嗯 又可以由此衍生出很多應用

 

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