2017-07-10 3 views
1

Lassen Sie uns das Bild skizzieren.So emulieren SCSI-Gerät

Windows stellt SCSI-Port- (Bus-) Treiber zur Verfügung. Der Treiber erstellt FDO für den Bus (FILE_DEVICE_BUS_EXTENDER) und PDO für jedes an den Bus angeschlossene Gerät (FILE_DEVICE_MASS_STORAGE). Wir verbinden Massenspeichergeräte mit dem Busgerät im PnP-Request-Handler.

Windows bietet auch einen Klassentreiber (für jede Geräteklasse), der über dem Porttreiber liegt. Es bildet Gerätestapel mit FDO auf PDO für jedes Kindgerät.

Klassentreiber sendet interne ioctls zum Hafenfahrer; Hauptfunktionscode ist IRP_MJ_SCSI, der untergeordnete Funktionscode ist IRP_MN_SCSI_CLASS, SCSI_REQUEST_BLOCK Struktur wird mit anforderungsspezifischen Informationen ausgefüllt.

Der Porttreiber übernimmt die Kommunikation mit dem Gerät (Daten von SRB zum Gerät verschieben/Daten vom Gerät zum SRB verschieben) und die Anfrage wird abgeschlossen.

Jetzt stellen Sie sich vor, wir wollen SCSI-Gerät emulieren. Wir müssen einen "virtuellen SCSI-Port (Bus)" -Treiber entwickeln. Dieser Treiber erstellt FDO für den Bus (FILE_DEVICE_BUS_EXTENDER) und PDO für jedes Gerät, das wir erstellen(). Wir werden interne ioctls behandeln, IRP-Warteschlangenverwaltung durchführen, Daten zu/von SRB verschieben, usw.

Ich möchte verstehen, welche "Bedingung" erfüllt sein muss, um Windows "denken" zu lassen, dass SCSI-Gerät echt ist (so dass es im Explorer angezeigt wird, usw.). Wird der Klassentreiber automatisch interne ioctls senden, sobald wir ein Gerät erstellt haben oder wir diese Anfragen emulieren müssen?

Meine Fragen könnten albern sein, aber ich muss begreifen, was passiert, um mehr zu verstehen. Danke für Ihre Hilfe.

Antwort

0

So scheint es einfach.

IRP_MN_QUERY_DEVICE_RELATIONS Anfrage (Bus gesendet FDO) handler "verbindet" Kind PDO zu Bus FDO.

IRP_MN_QUERY_ID Anfrage (an Kind gesendet PDO) Handler meldet Gerätekennungen, einschließlich Gerätetyp. Siehe https://docs.microsoft.com/en-us/windows-hardware/drivers/install/identifiers-for-scsi-devices

Jetzt kann Windows den entsprechenden Klassentreiber auswählen, um ihn oben zu platzieren. Der Stack sieht dann so aus:

Dann sendet der Klassentreiber interne ioctls an unseren Busfahrer. Wir können dieses ioctl immer noch selbst senden, z.B. Bypass-Klassentreiber. Siehe IOCTL_SCSI_PASS_THROUGH und IOCTL_SCSI_PASS_THROUGH_DIRECT Steuercodes docs; es macht deutlich, dass wir den Klassenfahrer umgehen können.