Compartir a través de


Ciclo de vida de la instancia de virtualización

La aplicación de proveedor mantiene una o varias instancias de virtualización. Cada instancia de virtualización pasa por cuatro fases en su ciclo de vida:

  1. Creación
  2. Inicio
  3. Tiempo de ejecución
  4. Shutdown

Tenga en cuenta que después de apagar una instancia de virtualización, el proveedor no necesita volver a crearla para reutilizarla. Simplemente puede volver a iniciarlo.

Nota: En esta sección se muestran ejemplos de API de ProjFS. Cada ejemplo está pensado para ilustrar el uso básico de la API. Para obtener documentación sobre las opciones que no se usan en estos ejemplos, consulte la referencia de api de ProjFS.

Creación de una raíz de virtualización

Para que un proveedor pueda iniciar la instancia de virtualización que proyectará elementos en el sistema de archivos local, debe crear la raíz de virtualización. La raíz de virtualización es el directorio en el que el proveedor proyecta un árbol de directorios y archivos.

Para crear una raíz de virtualización, el proveedor debe:

  1. Cree un directorio para que actúe como raíz de virtualización.

    El proveedor crea un directorio para que actúe como raíz de virtualización mediante, por ejemplo , CreateDirectory:

    HRESULT hr;
    const wchar_t* rootName = LR"(C:\virtRoot)";
    if (!CreateDirectoryW(rootName, nullptr))
    {
        hr = HRESULT_FROM_WIN32(GetLastError());
        wprintf(L"Failed to create virtualization root (0x%08x)\n", hr);
        return;
    }
    
  2. Cree un identificador de instancia de virtualización.

    Cada instancia de virtualización tiene un identificador único denominado id. de instancia de virtualización. El sistema usa este valor para identificar a qué instancia de virtualización está asociada su contenido.

    GUID instanceId;
    hr = CoCreateGuid(&instanceId);
    if (FAILED(hr))
    {
        wprintf(L"Failed to create instance ID (0x%08x)\n", hr);
        return;
    }
    
  3. Marque el nuevo directorio como raíz de virtualización.

    El proveedor llama a PrjMarkDirectoryAsPlaceholder para marcar el nuevo directorio como raíz de virtualización y asignarlo a la instancia de virtualización.

    hr = PrjMarkDirectoryAsPlaceholder(rootName,
                                       nullptr,
                                       nullptr,
                                       &instanceId);
    if (FAILED(hr))
    {
        wprintf(L"Failed to mark virtualization root (0x%08x)\n", hr);
        return;
    }
    

El proveedor solo necesita crear la raíz de virtualización una vez para cada instancia de virtualización. Una vez creada una raíz, su instancia asociada se puede iniciar y detener repetidamente sin volver a crear la raíz.

Inicio de una instancia de virtualización

Una vez creada la raíz de virtualización, el proveedor debe iniciar la instancia de virtualización. Esto indica a ProjFS que el proveedor está listo para recibir devoluciones de llamada y proporcionar datos.

Para iniciar la instancia de virtualización, el proveedor debe:

  1. Configure la tabla de devolución de llamada.

    ProjFS se comunica con el proveedor invocando rutinas de devolución de llamada implementadas por el proveedor. El proveedor rellena una estructura de PRJ_CALLBACKS con punteros a sus rutinas de devolución de llamada.

    PRJ_CALLBACKS callbackTable;
    
    // Supply required callbacks.
    callbackTable.StartDirectoryEnumerationCallback = MyStartEnumCallback;
    callbackTable.EndDirectoryEnumerationCallback = MyEndEnumCallback;
    callbackTable.GetDirectoryEnumerationCallback = MyGetEnumCallback;
    callbackTable.GetPlaceholderInfoCallback = MyGetPlaceholderInfoCallback;
    callbackTable.GetFileDataCallback = MyGetFileDataCallback;
    
    // The rest of the callbacks are optional.
    callbackTable.QueryFileNameCallback = nullptr;
    callbackTable.NotificationCallback = nullptr;
    callbackTable.CancelCommandCallback = nullptr;
    
  2. Iniciar la instancia.

    El proveedor llama a PrjStartVirtualizing para iniciar la instancia de virtualización.

    PRJ_NAMESPACE_VIRTUALIZATION_CONTEXT instanceHandle;
    hr = PrjStartVirtualizing(rootName,
                              &callbackTable,
                              nullptr,
                              nullptr,
                              &instanceHandle);
    if (FAILED(hr))
    {
        wprintf(L"Failed to start the virtualization instance (0x%08x)\n", hr);
        return;
    }
    

    El parámetro instanceHandle de PrjStartVirtualizing devuelve un identificador a la instancia de virtualización. El proveedor usa este identificador al llamar a otras API de ProjFS.

Tiempo de ejecución de la instancia de virtualización

Una vez que se devuelve la llamada a PrjStartVirtualizing , ProjFS invocará las rutinas de devolución de llamada del proveedor en respuesta a las operaciones del sistema de archivos en la instancia de virtualización. Para obtener información sobre cómo el proveedor puede controlar varias operaciones del sistema de archivos, consulte las secciones siguientes:

Apagar una instancia de virtualización

Para indicar a ProjFS que el proveedor quiere dejar de recibir devoluciones de llamada y proporcionar datos, el proveedor debe detener la instancia de virtualización. Para ello, el proveedor llama a PrjStopVirtualizing, pasando el identificador a la instancia de virtualización que recibió de la llamada a PrjStartVirtualizing.

PrjStopVirtualizing(instanceHandle);

Tenga en cuenta que hasta que se devuelva esta llamada, ProjFS puede seguir invocando las rutinas de devolución de llamada del proveedor.