Ciclo di vita dell'istanza di virtualizzazione

L'applicazione provider gestisce una o più istanze di virtualizzazione. Ogni istanza di virtualizzazione passa attraverso quattro fasi del ciclo di vita:

  1. Creazione
  2. Avvio
  3. Runtime
  4. Shutdown

Si noti che dopo l'arresto di un'istanza di virtualizzazione il provider non deve ricrearlo per riutilizzarlo. Può semplicemente ricominciare.

Nota: questa sezione mostra esempi di API ProjFS. Ogni esempio è progettato per illustrare l'utilizzo dell'API di base. Per la documentazione delle opzioni inutilizzate in questi esempi, vedere le informazioni di riferimento sull'API ProjFS.

Creazione di una radice di virtualizzazione

Prima che un provider possa avviare l'istanza di virtualizzazione che proietta gli elementi nel file system locale, deve creare la radice di virtualizzazione. La radice di virtualizzazione è la directory in cui il provider proietta un albero di directory e file.

Per creare una radice di virtualizzazione, il provider deve:

  1. Creare una directory da usare come radice di virtualizzazione.

    Il provider crea una directory da usare come radice di virtualizzazione usando, ad esempio 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. Creare un ID istanza di virtualizzazione.

    Ogni istanza di virtualizzazione ha un ID univoco denominato ID istanza di virtualizzazione. Il sistema usa questo valore per identificare l'istanza di virtualizzazione a cui è associato il relativo contenuto.

    GUID instanceId;
    hr = CoCreateGuid(&instanceId);
    if (FAILED(hr))
    {
        wprintf(L"Failed to create instance ID (0x%08x)\n", hr);
        return;
    }
    
  3. Contrassegnare la nuova directory come radice di virtualizzazione.

    Il provider chiama PrjMarkDirectoryAsPlaceholder per contrassegnare la nuova directory come radice di virtualizzazione e assegnarla all'istanza di virtualizzazione.

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

Il provider deve creare la radice di virtualizzazione una sola volta per ogni istanza di virtualizzazione. Dopo aver creato una radice, l'istanza associata può essere avviata ripetutamente e arrestata senza ricreare la radice.

Avvio di un'istanza di virtualizzazione

Dopo aver creato la radice di virtualizzazione, il provider deve avviare l'istanza di virtualizzazione. Questo segnala a ProjFS che il provider è pronto per ricevere i callback e fornire i dati.

Per avviare l'istanza di virtualizzazione, il provider deve:

  1. Configurare la tabella di callback.

    ProjFS comunica con il provider richiamando le routine di callback implementate dal provider. Il provider popola uno struct PRJ_CALLBACKS con puntatori alle routine di callback.

    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. Avviare l'istanza di .

    Il provider chiama PrjStartVirtualizing per avviare l'istanza di virtualizzazione.

    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;
    }
    

    Il parametro instanceHandle di PrjStartVirtualizing restituisce un handle all'istanza di virtualizzazione. Il provider usa questo handle quando si chiamano altre API ProjFS.

Runtime dell'istanza di virtualizzazione

Una volta restituita la chiamata a PrjStartVirtualizing , ProjFS richiamerà le routine di callback del provider in risposta alle operazioni del file system nell'istanza di virtualizzazione. Per informazioni su come il provider può gestire varie operazioni del file system, vedere le sezioni seguenti:

Arresto di un'istanza di virtualizzazione

Per segnalare a ProjFS che il provider vuole interrompere la ricezione di callback e fornire dati, il provider deve arrestare l'istanza di virtualizzazione. A tale scopo, il provider chiama PrjStopVirtualizing, passandolo all'istanza di virtualizzazione ricevuta dalla chiamata a PrjStartVirtualizing.

PrjStopVirtualizing(instanceHandle);

Si noti che fino a quando non viene restituita questa chiamata, ProjFS potrebbe continuare a richiamare le routine di callback del provider.