画像をスケッチしましょう。SCSIデバイスをエミュレートする方法
WindowsはSCSIポート(バス)ドライバを提供します。ドライバは、バスに接続された各デバイス(FILE_DEVICE_MASS_STORAGE
)に対して、バス(FILE_DEVICE_BUS_EXTENDER
)の場合はFDO
、デバイスの場合はPDO
を作成します。 PnPリクエストハンドラ内のバスデバイスに大容量ストレージデバイスを「接続」します。
Windowsは、ポートドライバの上にレイヤードされたクラスドライバ(各デバイスクラス用)も提供します。これは、各子デバイスのPDO
の上にFDO
のデバイススタックを形成します。
クラスドライバは内部ioctlsをポートドライバに送信します。メジャー機能コードはIRP_MJ_SCSI
、マイナー機能コードはIRP_MN_SCSI_CLASS
、SCSI_REQUEST_BLOCK
構造はリクエスト固有の情報で埋められています。
ポートドライバは、デバイスとの通信(SRBからデバイスへのデータの移動/デバイスからSRBへのデータの移動)を処理し、要求を完了します。
ここで、scsiデバイスをエミュレートするとします。我々は "仮想SCSIポート(バス)"ドライバを開発する必要があります。このドライバは、バス(FILE_DEVICE_BUS_EXTENDER
)用にFDO
を作成し、作成する各デバイス(FILE_DEVICE_MASS_STORAGE
)用にPDO
を作成します。私たちは内部のioctlを処理し、irpキュー管理を行い、SRBとの間でデータを移動します。
WindowsがSCSIデバイスが実際であると思うようにするためにはどのような "条件"エクスプローラーの中に表示されるなど)。デバイスを作成したり、これらの要求をエミュレートする必要があるとすぐに、クラスドライバは内部ioctlを自動的に送信しますか?
私の質問はばかげているかもしれませんが、もっと理解するためには何が起こっているのか把握する必要があります。ご協力ありがとうございました。