2017-07-10 149 views
1

讓我們來畫一下這個圖。如何模擬SCSI設備

Windows提供SCSI端口(總線)驅動程序。對於連接到總線(FILE_DEVICE_MASS_STORAGE)的每個設備,驅動程序爲總線(FILE_DEVICE_BUS_EXTENDER)和PDO創建FDO。我們將大容量存儲設備「連接」到PnP請求處理程序中的總線設備上。

Windows還提供了分層驅動程序(對於每個設備類)的類驅動程序。它爲每個子設備在PDO之上形成設備堆棧FDO

類驅動程序發送內部ioctl到端口驅動程序;主功能碼爲IRP_MJ_SCSI,次功能碼爲IRP_MN_SCSI_CLASSSCSI_REQUEST_BLOCK結構中填寫請求專用信息。

端口驅動程序處理與設備的通信(將數據從SRB移動到設備/將數據從設備移動到SRB)並完成請求。

現在想象我們想要模擬scsi設備。我們需要開發「虛擬SCSI端口(總線)」驅動程序。對於我們將創建的每個設備(FILE_DEVICE_MASS_STORAGE),此驅動程序將爲總線(FILE_DEVICE_BUS_EXTENDER)和PDO創建FDO。我們將處理內部ioctls,執行irp隊列管理,將數據移入/移出SRB等。

我想了解爲了使Windows「認爲」SCSI設備是真實的(「so」它會出現在瀏覽器內等)。當我們創建設備時,類驅動程序會自動發送內部ioctl,還是需要模擬這些請求?

我的問題可能很愚蠢,但我需要掌握進一步瞭解的內容。感謝您的幫助。

回答

0

所以它看起來很簡單。

IRP_MN_QUERY_DEVICE_RELATIONS請求(發送到總線FDO)處理程序「連接」子PDO到總線FDO

IRP_MN_QUERY_ID請求(發送給子女PDO)處理程序報告設備標識符,包括設備類型。請參閱https://docs.microsoft.com/en-us/windows-hardware/drivers/install/identifiers-for-scsi-devices

現在Windows可以選擇適當的類驅動程序以將其放在最前面。所以棧看起來是這樣的:

{User App} 

[File System Driver] 

[Class Driver] 

[Bus Driver] 

{Physical/Virtual Device} 

然後類驅動程序將內部的ioctl發送到我們的公交車司機。我們仍然可以自己發送這個ioctl,例如旁路類驅動程序。請參閱IOCTL_SCSI_PASS_THROUGHIOCTL_SCSI_PASS_THROUGH_DIRECT控制碼docs;它明確表示我們可以繞過班級司機。