2017-07-10 7 views
1

画像をスケッチしましょう。SCSIデバイスをエミュレートする方法

WindowsはSCSIポート(バス)ドライバを提供します。ドライバは、バスに接続された各デバイス(FILE_DEVICE_MASS_STORAGE)に対して、バス(FILE_DEVICE_BUS_EXTENDER)の場合はFDO、デバイスの場合はPDOを作成します。 PnPリクエストハンドラ内のバスデバイスに大容量ストレージデバイスを「接続」します。

Windowsは、ポートドライバの上にレイヤードされたクラスドライバ(各デバイスクラス用)も提供します。これは、各子デバイスのPDOの上にFDOのデバイススタックを形成します。

クラスドライバは内部ioctlsをポートドライバに送信します。メジャー機能コードはIRP_MJ_SCSI、マイナー機能コードはIRP_MN_SCSI_CLASSSCSI_REQUEST_BLOCK構造はリクエスト固有の情報で埋められています。

ポートドライバは、デバイスとの通信(SRBからデバイスへのデータの移動/デバイスからSRBへのデータの移動)を処理し、要求を完了します。

ここで、scsiデバイスをエミュレートするとします。我々は "仮想SCSIポート(バス)"ドライバを開発する必要があります。このドライバは、バス(FILE_DEVICE_BUS_EXTENDER)用にFDOを作成し、作成する各デバイス(FILE_DEVICE_MASS_STORAGE)用にPDOを作成します。私たちは内部のioctlを処理し、irpキュー管理を行い、SRBとの間でデータを移動します。

WindowsがSCSIデバイスが実際であると思うようにするためにはどのような "条件"エクスプローラーの中に表示されるなど)。デバイスを作成したり、これらの要求をエミュレートする必要があるとすぐに、クラスドライバは内部ioctlを自動的に送信しますか?

私の質問はばかげているかもしれませんが、もっと理解するためには何が起こっているのか把握する必要があります。ご協力ありがとうございました。

答えて

0

だからシンプルなようです。

IRP_MN_QUERY_DEVICE_RELATIONSハンドラ(バスFDOに送信)は、PDOの子をFDOに「接続」します。

要求(子に送信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_THROUGHおよびIOCTL_SCSI_PASS_THROUGH_DIRECT制御コードdocsを参照してください。クラスドライバをバイパスできることは明らかです。

関連する問題