天天看點

實戰DeviceIoControl 之二:擷取軟碟/硬碟/CD光牒的參數

q 在msdn的那個demo中,将裝置名換成“a:”取a盤參數,先用資料總管讀一下盤,再運作這個程式可以成功,但換一張盤後就失敗;換成“cdrom0”取cdrom參數,無論如何都不行。這個問題如何解決呢?

a 取軟碟參數是從軟碟上讀取格式化後的資訊,也就是必須執行讀操作,這一點與硬碟不同。将createfile中的通路方式改為generic_read就行了。

ioctl_disk_get_drive_geometry這個i/o控制碼,對軟碟和硬碟有效,但對一些可移動媒介如cd/dvd-rom、tape等就不管用了。要取cdrom參數,還得另辟蹊徑。ioctl_storage_get_media_types_ex能夠幫我們解決問題。

q 使用這些i/o控制碼,需要什麼樣的輸入輸出資料格式呢?

a deviceiocontrol使用這兩個控制碼時,都不需要輸入資料。

ioctl_disk_get_drive_geometry直接輸出一個disk_geometry結構:

ioctl_storage_get_media_types_ex輸出一個get_media_types結構:

讓我們來看一下device_media_info結構的定義:

其中cd-rom屬于“可移動盤”的範圍。請注意,get_media_types結構本身隻定義了一條device_media_info,額外的device_media_info需要緊接此結構的另外的空間。

q 調用方法我了解了,請用vc舉個例子來實作我所期待已久的功能吧?

a 好,現在就示範一下如何取軟碟/硬碟/CD光牒的參數。測試時,記得要有軟碟/CD光牒插在驅動器裡喔!

首先,用mfc appwizard生成一個單文檔的應用程式,取名為diskgeometry,讓它的view基于ceditview。

然後,添加以下的.h和.cpp檔案。

然後,在toolbar的idr_mainframe上添加一個按鈕,id為id_get_disk_geometry。打開classwizard,在diskgeometryview中

添加id_get_disk_geometry的映射函數ongetdiskgeometry。打開diskgeometryview.cpp,包含頭檔案getdiskgeometry.h。

在ongetdiskgeometry中,添加以下代碼

最後,最後幹什麼呢?編譯,運作......