2017-07-10 5 views
1

Esquissons l'image.Comment émuler le périphérique SCSI

Windows fournit un pilote de port SCSI (bus). Le pilote crée FDO pour le bus (FILE_DEVICE_BUS_EXTENDER) et PDO pour chaque périphérique connecté au bus (FILE_DEVICE_MASS_STORAGE). Nous "connectons" les périphériques de stockage de masse au périphérique de bus dans le gestionnaire de requêtes PnP.

Windows fournit également un pilote de classe (pour chaque classe d'unités) qui est placé en couches au-dessus du pilote de port. Il forme une pile de périphériques avec FDO au-dessus de PDO pour chaque périphérique enfant.

Le pilote de classe envoie des ioctls internes au pilote de port; le code de fonction principal est IRP_MJ_SCSI, le code de fonction secondaire est IRP_MN_SCSI_CLASS, SCSI_REQUEST_BLOCK structure est remplie avec des informations spécifiques à la demande.

Le pilote de port gère la communication avec le périphérique (transfert des données de SRB vers le périphérique/transfert de données de l'unité vers SRB) et termine la demande.

Imaginez maintenant que nous voulons émuler un périphérique scsi. Nous devons développer un pilote de port SCSI virtuel (bus). Ce pilote créera FDO pour le bus (FILE_DEVICE_BUS_EXTENDER) et PDO pour chaque périphérique que nous allons créer (FILE_DEVICE_MASS_STORAGE). Nous allons gérer les ioctls internes, faire la gestion des files d'attente irp, déplacer les données vers/depuis SRB, etc.

Je veux comprendre quelle "condition" doit être remplie pour que Windows "pense" que le périphérique SCSI est réel (donc qu'il apparaîtra à l'intérieur de l'explorateur, etc). Est-ce que le pilote de classe enverra automatiquement des ioctls internes dès que nous créerons un périphérique ou nous devrons émuler ces requêtes? Mes questions pourraient être stupides mais j'ai besoin de comprendre ce qui se passe pour comprendre plus. Merci de votre aide.

Répondre

0

Donc, il semble simple.

IRP_MN_QUERY_DEVICE_RELATIONS demande (envoyée au bus FDO) gestionnaire "connecte" enfant PDO au bus FDO. Request (envoyé à l'enfant PDO) Le gestionnaire signale les identificateurs de périphérique, y compris le type de périphérique. Voir https://docs.microsoft.com/en-us/windows-hardware/drivers/install/identifiers-for-scsi-devices

Maintenant Windows peut sélectionner le pilote de classe approprié pour le mettre en haut. La pile ressemblera donc à ceci:

{User App} 

[File System Driver] 

[Class Driver] 

[Bus Driver] 

{Physical/Virtual Device} 

Ensuite, le pilote de classe enverra des ioctls internes à notre pilote de bus. Nous pouvons toujours envoyer cet ioctl par nous-mêmes, par ex. pilote de classe bypass. Voir IOCTL_SCSI_PASS_THROUGH et IOCTL_SCSI_PASS_THROUGH_DIRECT codes de contrôle docs; il est clair que nous pouvons contourner le conducteur de classe.