Modelo de objetos de VDS
[A partir de Windows 8 y Windows Server 2012, la interfaz COM del servicio de disco virtual se sustituye por la API de administración de almacenamiento de Windows.]
VDS proporciona acceso indirecto a dispositivos de almacenamiento basados en host, como discos y dispositivos CD-ROM, y a matrices de discos administradas por controladores RAID de hardware. Aunque algunas entidades de almacenamiento modelar dispositivos físicos, otras construcciones virtuales del modelo: volúmenes, particiones, etc. Los objetos que se describen en este tema representan las entidades físicas y virtuales de VDS.
Las aplicaciones llaman a los métodos expuestos por estos objetos y VDS llama al proveedor adecuado para realizar las operaciones de almacenamiento solicitadas. Una aplicación nunca llama directamente a un programa de proveedor.
Clasificación de objetos
Como se muestra en la ilustración siguiente, los programas de proveedor de software implementan objetos que modelen entidades basadas en host; los programas de proveedor de hardware implementan objetos que modelan dispositivos RAID de hardware interno y externo; los objetos comunes restantes son independientes del proveedor o se implementan mediante VDS. Un eje, que no es un objeto VDS, es un término para los medios de almacenamiento genéricos que constan de extensiones de disco o unidad.
Para obtener más información sobre el comportamiento de cada objeto, seleccione entre los temas siguientes:
- El cargador de servicios y los objetos de servicio, consulte Objetos de inicio y servicio.
- Enumeración y objetos asincrónicos, vea Objetos auxiliares.
- Objeto Provider, consulte Provider Object.
- Paquetes, discos, volúmenes y objetos plex de volumen, consulte Objetos de proveedor de software.
- Subsistema, controlador, unidad, LUN y objetos plex de LUN, consulte Objetos de proveedor de hardware.
Creación de objetos
Las operaciones de configuración y consulta asociadas a la creación de objetos pueden tardar mucho tiempo en completarse; como tal, VDS invoca todos los métodos de forma asincrónica. El proveedor de detección devuelve todos los eventos de finalización, error o cambio de estado. Los proveedores de software también registran todos los errores y cambios de estado significativos.
Eliminación del objeto
Varios métodos de VDS eliminan o transforman objetos VDS. Un llamador puede contener una referencia, mediante un puntero de interfaz, a un objeto eliminado después de que el método devuelva. Cuando el autor de la llamada libera la interfaz, VDS elimina el objeto .
Con respecto a la eliminación de objetos, los autores de llamadas deben abstenerse de invocar cualquier cosa excepto el método IUnknown::Release en estas interfaces. El proveedor debe ser lo suficientemente sólido para tratar con autores de llamadas errantes; si un llamador invoca un método en un objeto eliminado, el proveedor debe devolver VDS_E_OBJECT_DELETED.
Inicialización del servicio
VDS proporciona un identificador de clase (Clsid) para el cargador de servicios y los objetos de servicio, pero solo el clsid del cargador de servicios es público. La inicialización del servicio se produce cuando los proveedores, una aplicación que llama y el servicio realizan las siguientes tareas:
Cada nuevo proveedor invoca el método IVdsAdmin::RegisterProvider durante la instalación para registrarse con VDS. La llamada crea una clave del Registro en el subárbol SYSTEM, identificada por el GUID de objeto del proveedor. Contenido en esta clave es clsid del objeto de proveedor, el nombre, la versión y el GUID de versión del proveedor.
Nota:
Los GUID de objeto de proveedor son persistentes; los GUID de objetos de software y hardware no.
Una aplicación llama a la función CoCreateInstance , pasando el clsid del cargador de servicios como argumento. Con un puntero al objeto de cargador de servicios, la aplicación puede iniciar VDS local o remotamente pasando el nombre de equipo deseado como parámetro al método IVdsServiceLoader::LoadService .
Cuando la aplicación inicial se adjunta al servicio, VDS llama primero a CoCreateInstance en cada Clsid encontrado bajo la clave del Registro y, a continuación, llama al método IVdsProviderPrivate::OnLoad en cada proveedor para inicializar los programas.
Temas relacionados