Rutina GetDescriptor del controlador de clase storage
Para las operaciones de transferencia de datos, los controladores de clase de almacenamiento necesitan información de configuración sobre cada HBA que conduce un autobús al que están conectados sus dispositivos. Para obtener esta información, un controlador de clase llama a una rutina de GetDescriptor interna o implementa la misma funcionalidad en su rutina StartDevice . (Para obtener información sobre StartDevice, consulte Control del inicio de PnP en un controlador de clase de almacenamiento).
Una rutina GetDescriptor compila y configura solicitudes de propiedad de consulta (IRP_MJ_DEVICE_CONTROL con IOCTL_STORAGE_QUERY_PROPERTY) para que el controlador de puerto recupere los descriptores de dispositivo y adaptador que almacena el controlador de clase en su extensión de dispositivo. El controlador de clase también puede establecer marcas determinada por driver-writer en la extensión del dispositivo según los datos de descriptor devueltos.
El controlador de clase inspecciona los datos devueltos STORAGE_DEVICE_DESCRIPTOR para determinar las funcionalidades del dispositivo (datos de consulta SCSI o el equivalente no SCSI), como el tipo de dispositivo SCSI, si el medio del dispositivo (si existe) es extraíble (Corrección extraíble), si el dispositivo admite varios comandos pendientes (CommandQueueing) y varias cadenas de identificador. El controlador de clase inspecciona los datos devueltos STORAGE_ADAPTER_DESCRIPTOR para determinar las funcionalidades del adaptador, entre las que se incluyen:
El número máximo de bytes que un HBA determinado puede transferir en una sola operación (MaximumTransferLength).
Si el HBA puede transferir datos almacenados en búfer respaldados por páginas físicas no contiguas (es decir, si admite dispersión o recopilación), cuántas páginas físicas no contiguas por búfer puede administrar, por operación de transferencia (MaximumPhysicalPages).
Los requisitos de alineación de HBA para las transferencias para que el controlador de clase pueda establecer correctamente el campo AlignmentRequirement en sus objetos de dispositivo (AlignmentMask).
Las aplicaciones que envían IOCTL_SCSI_PASS_THROUGH solicitudes también pueden usar este campo.
Para obtener más información sobre cómo configurar AlignmentRequirement en objetos de dispositivo, vea Inicializar un objeto de dispositivo.
Si el HBA admite colas internas etiquetadas SCSI o por unidad lógica (CommandQueueing).
Si el HBA admite transferencias sincrónicas (AcceleratedTransfer).
Si el HBA almacena en caché los datos internamente (CachesData).
El controlador de clase debe almacenar esta información en la extensión del dispositivo de FDO para que sus rutinas de envío puedan asegurarse de que todas las solicitudes enviadas al controlador de puerto de almacenamiento cumplen el tamaño, el número de saltos físicos y los requisitos de alineación del HBA subyacente. Para obtener más información sobre las rutinas de distribución de controladores de clase, vea Rutinas de distribución del controlador de clase de almacenamiento. Para obtener más información sobre cómo configurar extensiones de dispositivo, consulte Configuración de una extensión de dispositivo del controlador de clase de almacenamiento.