Udostępnij za pośrednictwem


Cykl życia wystąpienia wirtualizacji

Aplikacja dostawcy obsługuje co najmniej jedno wystąpienie wirtualizacji. Każde wystąpienie wirtualizacji przechodzi cztery etapy w cyklu życia:

  1. Kreacja
  2. Startup
  3. Środowiska wykonawczego
  4. Zamknięcia

Należy pamiętać, że po zamknięciu wystąpienia wirtualizacji dostawca nie musi go ponownie utworzyć, aby użyć go ponownie. Może po prostu uruchomić go ponownie.

Uwaga: w tej sekcji przedstawiono przykłady interfejsów API projFS. Każdy przykład jest przeznaczony do zilustrowania podstawowego użycia interfejsu API. Aby uzyskać dokumentację opcji nieużywanych w tych przykładach, zapoznaj się z dokumentacją interfejsu API ProjFS.

Tworzenie katalogu głównego wirtualizacji

Zanim dostawca będzie mógł uruchomić wystąpienie wirtualizacji, które będzie projektować elementy w lokalnym systemie plików, musi utworzyć katalog główny wirtualizacji. Katalog główny wirtualizacji to katalog, w którym dostawca projektuje drzewo katalogów i plików.

Aby utworzyć katalog główny wirtualizacji, dostawca musi:

  1. Utwórz katalog, który będzie służyć jako katalog główny wirtualizacji.

    Dostawca tworzy katalog służącą jako katalog główny wirtualizacji, na przykład 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. Utwórz identyfikator wystąpienia wirtualizacji.

    Każde wystąpienie wirtualizacji ma unikatowy identyfikator o nazwie identyfikator wystąpienia wirtualizacji. System używa tej wartości do identyfikowania, z którym wystąpieniem wirtualizacji jest skojarzona jego zawartość.

    GUID instanceId;
    hr = CoCreateGuid(&instanceId);
    if (FAILED(hr))
    {
        wprintf(L"Failed to create instance ID (0x%08x)\n", hr);
        return;
    }
    
  3. Oznacz nowy katalog jako katalog główny wirtualizacji.

    Dostawca wywołuje PrjMarkDirectoryAsPlaceholder, aby oznaczyć nowy katalog jako katalog główny wirtualizacji i przypisać go do wystąpienia wirtualizacji.

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

Dostawca musi utworzyć katalog główny wirtualizacji tylko raz dla każdego wystąpienia wirtualizacji. Po utworzeniu katalogu głównego jego skojarzone wystąpienie można wielokrotnie uruchamiać i zatrzymywać bez ponownego tworzenia katalogu głównego.

Uruchamianie wystąpienia wirtualizacji

Po utworzeniu katalogu głównego wirtualizacji dostawca musi uruchomić wystąpienie wirtualizacji. Sygnalizuje to system plików ProjFS, że dostawca jest gotowy do odbierania wywołań zwrotnych i dostarczania danych.

Aby uruchomić wystąpienie wirtualizacji, dostawca musi:

  1. Skonfiguruj tabelę wywołania zwrotnego.

    ProjFS komunikuje się z dostawcą, wywołując procedury wywołania zwrotnego zaimplementowane przez dostawcę. Dostawca wypełnia strukturę PRJ_CALLBACKS wskaźnikami do procedur wywołania zwrotnego.

    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. Uruchom wystąpienie.

    Dostawca wywołuje PrjStartVirtualizing, aby uruchomić wystąpienie wirtualizacji.

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

    PrjStartVirtualizingwystąpienia Handle zwraca uchwyt do wystąpienia wirtualizacji. Dostawca używa tego dojścia podczas wywoływania innych interfejsów API projFS.

Środowisko uruchomieniowe wystąpienia wirtualizacji

Gdy wywołanie metody PrjStartVirtualizing zostanie zwrócone, program ProjFS wywoła procedury wywołania zwrotnego dostawcy w odpowiedzi na operacje systemu plików w wystąpieniu wirtualizacji. Aby uzyskać informacje na temat sposobu obsługi różnych operacji systemu plików przez dostawcę, zapoznaj się z następującymi sekcjami:

Zamykanie wystąpienia wirtualizacji

Aby zasygnalizować system plików ProjFS, że dostawca chce przestać odbierać wywołania zwrotne i dostarczać dane, dostawca musi zatrzymać wystąpienie wirtualizacji. Aby to zrobić, dostawca wywołuje PrjStopVirtualizing, przekazując dojście do wystąpienia wirtualizacji odebranego z wywołania do PrjStartVirtualizing.

PrjStopVirtualizing(instanceHandle);

Należy pamiętać, że dopóki to wywołanie nie zostanie zwrócone, system plików ProjFS może nadal wywoływać procedury wywołania zwrotnego dostawcy.