Verwenden von VSS Automated System Recovery zur Notfallwiederherstellung
Eine VSS-Sicherungs- und Wiederherstellungsanwendung, die notfallwiederherstellung durchführt (auch als Bare-Metal-Wiederherstellung bezeichnet), kann den AsR-Writer (Automated System Recovery) zusammen mit Windows Preinstallation Environment (Windows PE) verwenden, um kritische Volumes und andere Komponenten des startbaren Systemzustands zu sichern und wiederherzustellen. Die Sicherungsanwendung wird als VSS-Anforderer implementiert.
Hinweis Anwendungen, die ASR verwenden, müssen Windows PE lizenziern.
Windows Server 2003 und Windows XP: ASR ist nicht als VSS-Writer implementiert.
Informationen zu Ablaufverfolgungstools, die Sie mit ASR verwenden können, finden Sie unter Verwenden von Ablaufverfolgungstools mit VSS ASR-Anwendungen.
In diesem Artikel:
- Übersicht über Sicherungsphasenaufgaben
- Auswählen der zu sichernden kritischen Komponenten
- Übersicht über Aufgaben in der Wiederherstellungsphase
- Ausschließen aller Datenträger für ein Volume
Übersicht über Sicherungsphasenaufgaben
Zur Sicherungszeit führt der Anforderer die folgenden Schritte aus.
Hinweis
Alle Schritte sind erforderlich, sofern nicht anders angegeben.
Rufen Sie die CreateVssBackupComponents-Funktion auf, um eine instance der IVssBackupComponents-Schnittstelle zu erstellen, und rufen Sie die IVssBackupComponents::InitializeForBackup-Methode auf, um die instance zum Verwalten einer Sicherung zu initialisieren.
Rufen Sie IVssBackupComponents::SetContext auf, um den Kontext für den Schattenkopiervorgang festzulegen.
Rufen Sie IVssBackupComponents::SetBackupState auf, um die Sicherung zu konfigurieren. Legen Sie den bBackupBootableSystemState-Parameter auf true fest, um anzugeben, dass die Sicherung einen startbaren Systemstatus enthält.
Wählen Sie aus, welche kritischen Komponenten im Writer-Metadatendokument des ASR-Writers gesichert werden sollen, und rufen Sie IVssBackupComponents::AddComponent für jede dieser Komponenten auf.
Rufen Sie IVssBackupComponents::StartSnapshotSet auf, um einen neuen, leeren Schattenkopiesatz zu erstellen.
Rufen Sie IVssBackupComponents::GatherWriterMetadata auf, um asynchronen Kontakt mit Autoren zu initiieren.
Rufen Sie IVssBackupComponents::GetWriterMetadata auf, um das Writer-Metadatendokument des ASR-Writers abzurufen. Die Writer-ID für den ASR-Writer lautet BE000CBE-11FE-4426-9C58-531AA6355FC4, und die Writernamezeichenfolge lautet "ASR Writer".
Rufen Sie IVssExamineWriterMetadata::SaveAsXML auf, um eine Kopie des Writer-Metadatendokuments des ASR-Writers zu speichern.
Rufen Sie IVssBackupComponents::AddToSnapshotSet für jedes Volume auf, das an Schattenkopien teilnehmen kann, um das Volume dem Schattenkopiersatz hinzuzufügen.
Rufen Sie IVssBackupComponents::P repareForBackup auf, um Autoren zu benachrichtigen, sich auf einen Sicherungsvorgang vorzubereiten.
Rufen Sie IVssBackupComponents::GatherWriterStatus und IVssBackupComponents::GetWriterStatus (oder IVssBackupComponentsEx3::GetWriterStatus) auf, um die status des ASR-Writers zu überprüfen.
An diesem Punkt können Sie Fehlermeldungen abfragen, die vom Writer in seiner CVssWriter::OnPrepareBackup-Methode festgelegt wurden. Beispielcode zum Anzeigen dieser Nachrichten finden Sie unter IVssComponentEx::GetPrepareForBackupFailureMsg.
Rufen Sie IVssBackupComponents::D oSnapshotSet auf, um eine Volumeschattenkopie zu erstellen.
Rufen Sie IVssBackupComponents::GatherWriterStatus und IVssBackupComponents::GetWriterStatus auf, um die status des ASR-Writers zu überprüfen.
Sichern Sie die Daten.
Geben Sie an, ob der Sicherungsvorgang erfolgreich war, indem Sie IVssBackupComponents::SetBackupSucceeded aufrufen.
Rufen Sie IVssBackupComponents::BackupComplete auf, um anzugeben, dass der Sicherungsvorgang abgeschlossen wurde.
Rufen Sie IVssBackupComponents::GatherWriterStatus und IVssBackupComponents::GetWriterStatus auf. Der Arbeitsspeicher des Writersitzungszustands ist eine begrenzte Ressource, und Autoren müssen die Sitzungszustände schließlich wiederverwenden. Dieser Schritt markiert den Zustand der Sicherungssitzung des Writers als abgeschlossen und benachrichtigt VSS, dass dieser Sicherungssitzungsslot durch einen nachfolgenden Sicherungsvorgang wiederverwendet werden kann.
Hinweis
Dies ist nur unter Windows Server 2008 mit Service Pack 2 (SP2) und früher erforderlich.
Rufen Sie IVssBackupComponents::SaveAsXML auf, um eine Kopie des Dokuments der Sicherungskomponenten des Anforderers zu speichern. Die Informationen im Dokument "Sicherungskomponenten" werden zur Wiederherstellungszeit verwendet, wenn der Anforderer die IVssBackupComponents::InitializeForRestore-Methode aufruft .
Auswählen der zu sichernden kritischen Komponenten
In der Phase der Sicherungsinitialisierung meldet der ASR-Writer die folgenden Komponententypen in seinem Writer-Metadatendokument:
Wichtige Volumes, z. B. Start-, System- und Windows-Wiederherstellungsumgebungsvolume (Windows RE) und die Windows RE Partition, die dem derzeit ausgeführten instance von Windows Vista oder Windows Server 2008 zugeordnet ist. Ein Volume ist ein kritisches Volume , wenn es Systemstatusinformationen enthält. Die Start- und Systemvolumes werden automatisch eingeschlossen. Der Anforderer muss alle Volumes enthalten, die systemkritische Komponenten enthalten, die von Writern gemeldet werden, z. B. die Volumes, die das Active Directory enthalten. Systemkritische Komponenten sind als "für die Sicherung nicht auswählbar" gekennzeichnet. In VSS bedeutet "nicht auswählbar" "nicht optional". Daher muss der Anforderer sie als Teil des Systemzustands sichern. Weitere Informationen finden Sie unter Sichern und Wiederherstellen des Systemstatus. Komponenten, für die das VSS_CF_NOT_SYSTEM_STATE-Flag festgelegt ist, sind nicht systemkritisch.
Hinweis
Die ASR-Komponente ist eine systemkritische Komponente, die vom ASR-Writer gemeldet wird.
Datenträger. Jeder Festdatenträger auf dem Computer wird als Komponente in ASR verfügbar gemacht. Wenn ein Datenträger während der Sicherung nicht ausgeschlossen wurde, wird er während der Wiederherstellung zugewiesen und kann neu erstellt und neu formatiert werden. Beachten Sie, dass der Anforderer während der Wiederherstellung weiterhin einen Datenträger neu erstellen kann, der während der Sicherung ausgeschlossen wurde, indem er die IVssBackupComponents::SetRestoreOptions-Methode aufruft . Wenn ein Datenträger in einem dynamischen Datenträgerpaket ausgewählt ist, müssen auch alle anderen Datenträger in diesem Paket ausgewählt werden. Wenn ein Volume ausgewählt ist, weil es sich um ein kritisches Volume handelt (d. h. ein Volume, das Systemstatusinformationen enthält), muss auch jeder Datenträger ausgewählt werden, der eine Ausdehnung für dieses Volume enthält. Um die Erweiterungen für ein Volume zu finden, verwenden Sie den IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS-Steuerelementcode.
Hinweis
Während der Sicherung sollte der Anforderer alle Festplatten einschließen. Wenn der Datenträger, der den Sicherungssatz des Anforderers enthält, ein lokaler Datenträger ist, sollte dieser Datenträger eingeschlossen werden. Während der Wiederherstellung muss der Anforderer den Datenträger ausschließen, der den Sicherungssatz des Anforderers enthält, um zu verhindern, dass er überschrieben wird.
In einer Clusterumgebung erstellt ASR das Layout der freigegebenen Datenträger des Clusters nicht erneut. Diese Datenträger sollten online wiederhergestellt werden, nachdem das Betriebssystem im Windows RE wiederhergestellt wurde.
BcD-Speicher (Boot Configuration Data). Diese Komponente gibt den Pfad des Verzeichnisses an, das den BCD-Speicher enthält. Der Anforderer muss diese Komponente angeben und alle Dateien im BCD-Speicherverzeichnis sichern. Weitere Informationen zum BCD-Speicher finden Sie unter Informationen zu BCD.
Hinweis
Auf Computern, die die Erweiterte Firmware-Schnittstelle (EFI) verwenden, ist die EFI-Systempartition (ESP) immer ausgeblendet und kann nicht in eine Volumeschattenkopie einbezogen werden. Der Anforderer muss den Inhalt dieser Partition sichern. Da diese Partition nicht in eine Volumeschattenkopie einbezogen werden kann, kann die Sicherung nur über das Livevolume und nicht über die Schattenkopie ausgeführt werden. Weitere Informationen zu EFI und ESP finden Sie unter Leitfaden zum Aufrufen.
Die Komponentennamen verwenden die folgenden Formate:
Für Datenträgerkomponenten ist das Format
<COMPONENT logicalPath="Disks" componentName="harddiskn" componentType="filegroup" />
wobei n die Datenträgernummer ist. Es wird nur die Datenträgernummer aufgezeichnet. Verwenden Sie zum Abrufen der Datenträgernummer den IOCTL_STORAGE_GET_DEVICE_NUMBER-Steuerelementcode .
Für Volumekomponenten ist das Format
<COMPONENT logicalPath="Volumes" componentName="Volume{GUID}" componentType="filegroup" />
wobei GUID die Volume-GUID ist.
Für die BCD-Speicherkomponente ist das Format
<COMPONENT logicalPath="BCD" componentName="BCD" componentType="filegroup" componentCaption = "This is the path to the boot BCD store and the boot manager... Alle Dateien in diesem Verzeichnis müssen gesichert werden...">
Wenn die Systempartition über einen Volume-GUID-Namen verfügt, kann diese Komponente ausgewählt werden. Andernfalls kann sie nicht ausgewählt werden.
Hinweis
ASR fügt die Dateien der Dateigruppe der BCD-Speicherkomponente wie folgt hinzu:
Für EFI-Datenträger fügt ASR hinzu
SystemPartitionPath\EFI\Microsoft\Boot\*.*
wobei SystemPartitionPath der Pfad zur Systempartition ist.
Für GPT-Datenträger fügt ASR hinzu
SystemPartitionPath\Boot\*.*
wobei SystemPartitionPath der Pfad zur Systempartition ist.
Der Pfad der Systempartition finden Sie unter dem folgenden Registrierungsschlüssel: HKEY_LOCAL_MACHINE\System\setup\SystemPartition
Bei der Wiederherstellung müssen alle Komponenten, die als kritische Volumes gekennzeichnet sind, wiederhergestellt werden. Wenn ein oder mehrere kritische Volumes nicht wiederhergestellt werden können, schlägt der Wiederherstellungsvorgang fehl.
In der PreRestore-Phase der Wiederherstellungssequenz werden Datenträger, die während der Sicherung nicht ausgeschlossen wurden, standardmäßig neu erstellt und neu formatiert. Sie werden jedoch nicht neu erstellt oder neu formatiert, wenn sie die folgenden Bedingungen erfüllen:
Ein Basisdatenträger wird nicht neu erstellt, wenn sein Datenträgerlayout intakt ist oder nur additive Änderungen an ihm vorgenommen wurden. Das Datenträgerlayout ist intakt, wenn die folgenden Bedingungen zutreffen:
- Datenträgersignatur, Datenträgerformat (GPT oder MBR), logische Sektorgröße und Volumestartoffset werden nicht geändert.
- Die Volumegröße wird nicht verringert.
- Bei GPT-Datenträgern wird der Partitionsbezeichner nicht geändert.
Ein dynamischer Datenträger wird nicht neu erstellt, wenn sein Datenträgerlayout intakt ist oder nur additive Änderungen an ihm vorgenommen wurden. Damit ein dynamischer Datenträger intakt ist, müssen alle Bedingungen für einen Basisdatenträger erfüllt sein. Darüber hinaus muss die Volumestruktur des gesamten Datenträgerpakets intakt sein. Die Volumestruktur des Datenträgerpakets ist intakt, wenn es die folgenden Bedingungen erfüllt, die sowohl für MBR- als auch FÜR GPT-Datenträger gelten:
Die Anzahl der Volumes, die während der Wiederherstellung im physischen Paket verfügbar sind, muss größer oder gleich der Anzahl von Volumes sein, die während der Sicherung in den ASR Writer-Metadaten angegeben wurden.
Die Anzahl der Plexes pro Volume muss unverändert sein.
Die Anzahl der Member muss unverändert sein.
Die Anzahl der physischen Datenträgerblöcke muss größer sein als die in den ASR-Writer-Metadaten angegebene Anzahl von Datenträgerblöcken.
Ein intaktes Paket bleibt intakt, wenn zusätzliche Volumes hinzugefügt werden oder wenn ein Volume im Paket erweitert wird (z. B. von einem einfachen Volume auf ein übergreifendes Volume).
Hinweis
Wenn ein einfaches Volume gespiegelt wird, ist das Paket nicht intakt und wird neu erstellt, um sicherzustellen, dass der BCD- und Startvolumestatus nach der Wiederherstellung konsistent bleiben. Wenn Volumes gelöscht werden, wird das Paket neu erstellt.
Wenn die Volumestruktur des dynamischen Datenträgerpakets intakt ist und nur additive Änderungen vorgenommen wurden, werden die Datenträger im Paket nicht neu erstellt.
Windows Vista: Dynamische Datenträger werden immer neu erstellt. Beachten Sie, dass sich dieses Verhalten mit Windows Server 2008 und Windows Vista mit Service Pack 1 (SP1) geändert hat.
Der Anforderer kann jederzeit vor Beginn der Wiederherstellungsphase angeben, dass die Datenträger schnell formatiert werden sollen, indem er den Registrierungsschlüssel HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ASR\RestoreSession festlegt. Unter diesem Schlüssel befindet sich ein Wert namens QuickFormat mit dem Datentyp REG_DWORD. Wenn dieser Wert nicht vorhanden ist, sollten Sie ihn erstellen. Legen Sie die Daten des QuickFormat-Werts auf 1 für schnelle Formatierung oder 0 für langsame Formatierung fest.
Wenn der QuickFormat-Wert nicht vorhanden ist, werden die Datenträger langsam formatiert.
Schnelle Formatierung ist deutlich schneller als langsame Formatierung (auch als vollständige Formatierung bezeichnet). Die schnelle Formatierung überprüft jedoch nicht jeden Sektor auf dem Volume.
Übersicht über Wiederherstellungsphasentasks
Zur Wiederherstellungszeit führt der Anforderer die folgenden Schritte aus:
Hinweis
Alle Schritte sind erforderlich, sofern nicht anders angegeben.
Rufen Sie die CreateVssBackupComponents-Funktion auf, um eine instance der IVssBackupComponents-Schnittstelle zu erstellen, und rufen Sie die IVssBackupComponents::InitializeForRestore-Methode auf, um die instance für die Wiederherstellung zu initialisieren, indem Sie das Dokument sicherungskomponenten des Anforderers in die instance laden.
[Dieser Schritt ist nur erforderlich, wenn der Anforderer ändern muss, ob "IncludeDisk" oder "ExcludeDisk" für einen oder mehrere Datenträger angegeben wird.] Rufen Sie IVssBackupComponents::SetRestoreOptions auf, um die Wiederherstellungsoptionen für die ASR Writer-Komponenten festzulegen. Der ASR-Writer unterstützt die folgenden Optionen: "IncludeDisk" ermöglicht es dem Anforderer, einen Datenträger in das Zielsystem einzuschließen, der für die Wiederherstellung in Betracht gezogen werden soll, auch wenn er während der Sicherungsphase nicht ausgewählt wurde. Mit "ExcludeDisk" kann der Anforderer verhindern, dass ein Datenträger auf dem Zielsystem neu erstellt wird. Wenn "ExcludeDisk" für einen Datenträger angegeben ist, der ein kritisches Volume enthält, schlägt der nachfolgende Aufruf von IVssBackupComponents::P reRestore fehl.
Das folgende Beispiel zeigt, wie Sie mithilfe von SetRestoreOptions verhindern, dass Datenträger 0 und Datenträger 1 neu erstellt werden, und Wiederherstellungstreiber von Drittanbietern in das wiederhergestellte Startvolume einfügen.
Windows Server 2008, Windows Vista, Windows Server 2003 und Windows XP: Die Einschleusung von Treibern von Drittanbietern wird nicht unterstützt.
Im Beispiel wird davon ausgegangen, dass der Zeiger IVssBackupComponents m_pBackupComponents gültig ist.
m_pBackupComponents->SetRestoreOptions( AsrWriterId, VSS_CT_FILEGROUP, NULL, TEXT("ASR"), TEXT("\"ExcludeDisk\"=\"0\", \"ExcludeDisk\"=\"1\" "), TEXT("\"InjectDrivers\"=\"1\" ") );
Informationen zum Ausschließen aller Datenträger für ein angegebenes Volume finden Sie unter "Ausschließen aller Datenträger für ein Volume".
Rufen Sie IVssBackupComponents::P reRestore auf, um den ASR Writer zu benachrichtigen, um einen Wiederherstellungsvorgang vorzubereiten. Rufen Sie IVssAsync::QueryStatus so oft wie nötig auf, bis der im pHrResult-Parameter zurückgegebene status Wert nicht VSS_S_ASYNC_PENDING ist.
Stellen Sie die Daten wieder her. In der Wiederherstellungsphase konfiguriert ASR den Volume-GUID-Pfad (\\?\Volume{GUID}) für jedes Volume neu, sodass er dem Volume-GUID-Pfad entspricht, der während der Sicherungsphase verwendet wurde. Laufwerkbuchstaben werden jedoch nicht beibehalten, da dies zu Konflikten mit den Laufwerkbuchstaben führen würde, die automatisch in der Wiederherstellungsumgebung zugewiesen werden. Daher muss der Anforderer beim Wiederherstellen von Daten Volume-GUID-Pfade und keine Laufwerkbuchstaben verwenden, um auf die Volumes zuzugreifen.
Legen Sie den Registrierungsschlüssel HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ASR\RestoreSession fest, um den Satz von Volumes anzugeben, die wiederhergestellt oder neu formatiert wurden.
Unter diesem Schlüssel befindet sich ein Wert namens RestoredVolumes mit dem Datentyp REG_MULTI_SZ. Wenn dieser Wert nicht vorhanden ist, sollten Sie ihn erstellen. Unter diesem Wert sollte ihr Anforderer einen GuiD-Eintrag für jedes Volume erstellen, das wiederhergestellt wurde. Dieser Eintrag sollte das folgende Format aufweisen: \\?\Volume{78618c8f-aefd-11da-a898-806e6f6e6e6963}. Jedes Mal, wenn eine Bare-Metal-Wiederherstellung ausgeführt wird, legt ASR den Wert RestoredVolumes auf den Satz von Volumes fest, die ASR wiederhergestellt hat. Wenn der Anforderer zusätzliche Volumes wiederhergestellt hat, sollte er diesen Wert auf die Union der Volumes festlegen, die der Anfordernde wiederhergestellt hat, und der Menge von Volumes, die ASR wiederhergestellt hat. Wenn der Anforderer keine ASR verwendet hat, sollte er die Liste der Volumes ersetzen.
Sie sollten auch einen Wert namens LastInstance mit dem Datentyp REG_SZ erstellen. Dieser Schlüssel sollte ein zufälliges Cookie enthalten, das den aktuellen Wiederherstellungsvorgang eindeutig identifiziert. Ein solches Cookie kann mithilfe der Funktionen UuidCreate und UuidToString erstellt werden. Jedes Mal, wenn eine Bare-Metal-Wiederherstellung ausgeführt wird, setzt ASR diesen Registrierungswert zurück, um Anforderer und Nicht-VSS-Sicherungsanwendungen darüber zu benachrichtigen, dass die Wiederherstellung erfolgt ist.
Rufen Sie IVssBackupComponents::P ostRestore auf, um das Ende des Wiederherstellungsvorgangs anzugeben. Rufen Sie IVssAsync::QueryStatus so oft wie nötig auf, bis der im pHrResult-Parameter zurückgegebene status Wert nicht VSS_S_ASYNC_PENDING ist.
In der Wiederherstellungsphase kann ASR Partitionen erstellen oder entfernen, um den vorherigen Zustand des Computers wiederherzustellen. Anforderer dürfen nicht versuchen, Datenträgernummern aus der Sicherungsphase der Wiederherstellungsphase zuzuordnen.
Bei der Wiederherstellung muss der Anforderer den Datenträger ausschließen, der den Sicherungssatz des Anforderers enthält. Andernfalls kann der Sicherungssatz durch den Wiederherstellungsvorgang überschrieben werden.
Bei der Wiederherstellung wird ein Datenträger ausgeschlossen, wenn er während der Sicherung nicht als Komponente ausgewählt wurde oder wenn er explizit durch Aufrufen von IVssBackupComponents::SetRestoreOptions mit der Option "ExcludeDisk" während der Wiederherstellung ausgeschlossen wird.
Es ist wichtig zu beachten, dass während der WinPE-Notfallwiederherstellung ASR Writer-Funktionalität vorhanden ist, aber keine anderen Writer verfügbar sind und der VSS-Dienst nicht ausgeführt wird. Nachdem die WinPE-Notfallwiederherstellung abgeschlossen ist, der Computer neu gestartet wurde und das Windows-Betriebssystem normal ausgeführt wird, kann der VSS-Dienst gestartet werden, und der Anforderer kann alle zusätzlichen Wiederherstellungsvorgänge ausführen, die die Teilnahme anderer Writer als des ASR Writer erfordern.
Wenn die Sicherungsanwendung während der Wiederherstellungssitzung erkennt, dass die eindeutigen Volume-IDs unverändert sind und daher alle Volumes aus dem Zeitpunkt der Sicherung in WinPE vorhanden und intakt sind, kann die Sicherungsanwendung nur den Inhalt der Volumes wiederherstellen, ohne ASR einzubeziehen. In diesem Fall sollte die Sicherungsanwendung angeben, dass der Computer wiederhergestellt wurde, indem sie den folgenden Registrierungsschlüssel im wiederhergestellten Betriebssystem festlegt: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ASR\RestoreSession
Geben Sie unter diesem Schlüssel LastInstance für den Wertnamen, REG_SZ für den Werttyp und ein zufälliges Cookie (z. B. eine von der UuidCreate-Funktion erstellte GUID) für die Wertdaten an.
Wenn die Sicherungsanwendung während der Wiederherstellungssitzung erkennt, dass ein oder mehrere Volumes geändert wurden oder fehlen, sollte die Sicherungsanwendung ASR verwenden, um die Wiederherstellung durchzuführen. ASR erstellt die Volumes genau so neu, wie sie zum Zeitpunkt der Sicherung waren, und legt den Registrierungsschlüssel RestoreSession fest.
Ausschließen aller Datenträger für ein Volume
Im folgenden Beispiel wird gezeigt, wie alle Datenträger für ein angegebenes Volume ausgeschlossen werden.
HRESULT BuildRestoreOptionString
(
const WCHAR *pwszVolumeNamePath,
CMyString *pstrExclusionList
)
{
HANDLE hVolume = INVALID_HANDLE_VALUE;
DWORD cbSize = 0;
VOLUME_DISK_EXTENTS * pExtents = NULL;
DISK_EXTENT * pExtent = NULL;
ULONG i = 0;
BOOL fIoRet = FALSE;
WCHAR wszDest[MAX_PATH] = L"";
CMyString strVolumeName;
CMyString strRestoreOption;
// Open a handle to the volume device.
strVolumeName.Set( pwszVolumeNamePath );
// If the volume name contains a trailing backslash, remove it.
strVolumeName.UnTrailing( L'\\' );
hVolume = ::CreateFile(strVolumeName, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, 0);
// Check whether the call to CreateFile succeeded.
// Get the list of disks used by this volume.
cbSize = sizeof(VOLUME_DISK_EXTENTS);
pExtents = (VOLUME_DISK_EXTENTS *)::CoTaskMemAlloc(cbSize);
::ZeroMemory(pExtents, cbSize);
fIoRet = ::DeviceIoControl(hVolume, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, NULL, 0, pExtents, cbSize, &cbSize, 0);
if ( !fIoRet && GetLastError() == ERROR_MORE_DATA )
{
// Allocate more memory.
cbSize = FIELD_OFFSET(VOLUME_DISK_EXTENTS, Extents) + pExtents->NumberOfDiskExtents * sizeof(DISK_EXTENT);
::CoTaskMemFree(pExtents);
pExtents = NULL;
pExtents = (VOLUME_DISK_EXTENTS *) ::CoTaskMemAlloc(cbSize);
// Check whether CoTaskMemAlloc returned an out-of-memory error.
::ZeroMemory(pExtents, cbSize);
// Now the buffer should be big enough.
::DeviceIoControl(hVolume, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, NULL, 0, pExtents, cbSize, &cbSize, 0);
// Check whether the IOCTL succeeded.
}
// Check for errors; note that the IOCTL can fail for a reason other than insufficient memory.
// For each disk, mark it to be excluded in the Restore Option string.
for (i = 0; i < pExtents->NumberOfDiskExtents; i++)
{
pExtent = &pExtents->Extents[i];
*wszDest = L'\0';
StringCchPrintf(wszDest, MAX_PATH, L"\"ExcludeDisk\"=\"%d\", ", pExtent->DiskNumber); // check errors
strRestoreOption.Append(wszDest);
// Check for an out-of-memory error.
}
// Remove the trailing comma.
strRestoreOption.TrimRight();
strRestoreOption.UnTrailing(',');
// Set the output parameter.
strRestoreOption.Transfer( pstrExclusionList );
Exit:
if( pExtents )
{
::CoTaskMemFree(pExtents);
pExtents = NULL;
}
if( hVolume != INVALID_HANDLE_VALUE )
{
::CloseHandle(hVolume);
hVolume = INVALID_HANDLE_VALUE;
}
return ( hr );
}