windows - hvordan man emulerer SCSI enhed

Indlæg af Hanne Mølgaard Plasc

Problem



Lad os skitse billedet.


Windows giver SCSI-port (bus) driver. Driver opretter FDO for bus (FILE\_DEVICE\_BUS\_EXTENDER) og PDO for hver enhed, der er forbundet med bus (FILE\_DEVICE\_MASS\_STORAGE). Vi 'forbinder' masselagringsenheder til busenheden inde i PnP-anmodningshandleren.


Windows giver også klassedriver (for hver enhedsklasse), der er lagdelt oven på portdriveren. Det danner enhedsstabel med FDO oven på PDO for hver børneenhed.


Klassechauffør sender interne ioctl'er til portdriveren; Hovedfunktionskoden er IRP\_MJ\_SCSI, mindre funktionskode er IRP\_MN\_SCSI\_CLASS, SCSI\_REQUEST\_BLOCK struktur er udfyldt med anmodningsspecifikke oplysninger.


Portdriver håndterer kommunikationen med enheden (flyt data fra SRB til enhed/flyt data fra enhed til SRB) og gennemfører anmodningen.


Forestil dig nu, at vi vil efterligne SCSI-enheden. Vi skal udvikle 'virtuel SCSI-port (bus)' driver. Denne driver vil oprette FDO for bus (FILE\_DEVICE\_BUS\_EXTENDER) og PDO for hver enhed, som vi vil oprette (FILE\_DEVICE\_MASS\_STORAGE). Vi håndterer interne iocts, gør irp køforvaltning, flyt data til/fra SRB mv.


Jeg vil forstå, hvad 'betingelse' skal opfyldes for at få Windows til at 'tænke', at SCSI-enheden er reel (så den vises indenfor explorer osv.). Vil klasseleder automatisk sende interne ioctl'er, så snart vi opretter enhed, eller vi skal også efterligne disse anmodninger?


Mit spørgsmål kan være fjollet, men jeg skal forstå hvad der foregår for at forstå mere. Tak for din hjælp.

Bedste reference


Så det virker simpelt.


IRP\_MN\_QUERY\_DEVICE\_RELATIONS anmodning (sendt til bus FDO) handler 'forbinder' barn PDO til bus FDO.


IRP\_MN\_QUERY\_ID anmodning (sendt til barn PDO) handler rapporterer enhedsidentifikatorer, herunder enhedstype. Se https://docs.microsoft.com/en-us/windows-hardware/drivers/install/identifiers-for-scsi-devices[23]


Nu kan Windows vælge en passende klassedriver for at sætte den øverst. Så stakken vil se sådan ud:


{User App}

[File System Driver]

[Class Driver]

[Bus Driver]

{Physical/Virtual Device}


Derefter sender lokomotivføreren interne ioctl'er til vores buschauffør. Vi kan stadig sende denne ioctl af os selv, f.eks. bypass klasse driver. Se IOCTL\_SCSI\_PASS\_THROUGH og IOCTL\_SCSI\_PASS\_THROUGH\_DIRECT kontrolkoder docs; det gør det klart, at vi kan omgå klassedriveren.