Lebenszyklus von Virtualisierungsinstanzen
Die Anbieteranwendung verwaltet mindestens eine Virtualisierungsinstanz. Jeder Virtualisierungs-instance durchläuft vier Phasen in seinem Lebenszyklus:
- Erstellung
- Start
- Typ
- Shutdown
Beachten Sie, dass nach dem Herunterfahren einer Virtualisierungs-instance der Anbieter sie nicht erneut erstellen muss, um sie wiederzuverwenden. Sie kann es einfach wieder starten.
Hinweis: Dieser Abschnitt enthält Beispiele für ProjFS-APIs. Jedes Beispiel soll die grundlegende API-Nutzung veranschaulichen. Eine Dokumentation der in diesen Beispielen nicht verwendeten Optionen finden Sie in der ProjFS-API-Referenz.
Erstellen eines Virtualisierungsstamms
Bevor ein Anbieter die Virtualisierungs-instance starten kann, die Elemente in das lokale Dateisystem projizieren, muss er den Virtualisierungsstamm erstellen. Der Virtualisierungsstamm ist das Verzeichnis, unter dem der Anbieter eine Struktur von Verzeichnissen und Dateien projiziert.
Um einen Virtualisierungsstamm zu erstellen, muss der Anbieter:
Erstellen Sie ein Verzeichnis, das als Virtualisierungsstamm dient.
Der Anbieter erstellt ein Verzeichnis, das als Virtualisierungsstamm verwendet wird, z. B. 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; }
Erstellen Sie eine Virtualisierungs-instance-ID.
Jedes Virtualisierungs-instance verfügt über eine eindeutige ID, die als Virtualisierungs-instance-ID bezeichnet wird. Das System verwendet diesen Wert, um zu identifizieren, welcher Virtualisierung instance dessen Inhalt zugeordnet sind.
GUID instanceId; hr = CoCreateGuid(&instanceId); if (FAILED(hr)) { wprintf(L"Failed to create instance ID (0x%08x)\n", hr); return; }
Markieren Sie das neue Verzeichnis als Virtualisierungsstamm.
Der Anbieter ruft PrjMarkDirectoryAsPlaceholder auf, um das neue Verzeichnis als Virtualisierungsstamm zu markieren und es dem virtualisierungs-instance zuzuweisen.
hr = PrjMarkDirectoryAsPlaceholder(rootName, nullptr, nullptr, &instanceId); if (FAILED(hr)) { wprintf(L"Failed to mark virtualization root (0x%08x)\n", hr); return; }
Der Anbieter muss den Virtualisierungsstamm nur einmal für jede Virtualisierungs-instance erstellen. Nachdem ein Stamm erstellt wurde, kann die zugeordnete instance wiederholt gestartet und beendet werden, ohne den Stamm neu zu erstellen.
Starten einer Virtualisierungs-instance
Nachdem der Virtualisierungsstamm erstellt wurde, muss der Anbieter die Virtualisierungs-instance starten. Dadurch wird ProjFS signalisiert, dass der Anbieter bereit ist, Rückrufe zu empfangen und Daten bereitzustellen.
Um die Virtualisierung zu starten instance muss der Anbieter:
Richten Sie die Rückruftabelle ein.
ProjFS kommuniziert mit dem Anbieter, indem vom Anbieter implementierte Rückrufroutinen aufgerufen werden. Der Anbieter füllt eine PRJ_CALLBACKS-Struktur mit Zeigern auf die Rückrufroutinen auf.
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;
Starte die Instanz.
Der Anbieter ruft PrjStartVirtualizing auf, um die Virtualisierung instance zu starten.
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; }
Der Parameter instanceHandle von PrjStartVirtualizing gibt ein Handle an die Virtualisierungs-instance zurück. Der Anbieter verwendet dieses Handle beim Aufrufen anderer ProjFS-APIs.
Virtualisierungs-instance Runtime
Sobald der Aufruf von PrjStartVirtualizing zurückgegeben wird, ruft ProjFS die Rückrufroutinen des Anbieters als Reaktion auf Dateisystemvorgänge im Virtualisierungs-instance auf. Informationen dazu, wie der Anbieter verschiedene Dateisystemvorgänge verarbeiten kann, finden Sie in den folgenden Abschnitten:
- Auflisten von Dateien und Verzeichnissen
- Bereitstellen von Dateidaten
- Benachrichtigungen zu Dateisystemvorgängen
- Behandeln von Ansichtsänderungen
Herunterfahren einer Virtualisierungs-instance
Um ProjFS zu signalisieren, dass der Anbieter keine Rückrufe mehr empfangen und Daten bereitstellen möchte, muss der Anbieter die Virtualisierung instance beenden. Dazu ruft der Anbieter PrjStopVirtualizing auf und übergibt das Handle an die Virtualisierung instance, die er vom Aufruf von PrjStartVirtualizing erhalten hat.
PrjStopVirtualizing(instanceHandle);
Beachten Sie, dass ProjFS bis zur Rückgabe dieses Aufrufs weiterhin die Rückrufroutinen des Anbieters aufruft.