Używanie zautomatyzowanego odzyskiwania systemu VSS na potrzeby odzyskiwania po awarii
Aplikacja do tworzenia kopii zapasowych i odzyskiwania usługi VSS, która wykonuje odzyskiwanie po awarii (nazywane również odzyskiwaniem na poziomie sprzętu), może używać modułu zapisywania ASR (Automated System Recovery) wraz ze środowiskiem preinstalacji systemu Windows (Windows PE) do tworzenia kopii zapasowych i przywracania kluczowych woluminów i innych składników stanu systemu rozruchowego. Aplikacja do tworzenia kopii zapasowej jest implementowana jako element żądający usługi VSS.
Uwaga Aplikacje korzystające z usługi ASR muszą mieć licencję systemu Windows PE.
Windows Server 2003 i Windows XP: usługa ASR nie jest implementowana jako składnik zapisywania usługi VSS.
Aby uzyskać informacje na temat narzędzi do śledzenia, których można używać z aplikacjami VSS ASR, zobacz Korzystanie z narzędzi do śledzenia z aplikacjami VSS ASR.
W tym artykule:
- omówienie zadań fazy tworzenia kopii zapasowej
- Wybieranie komponentów krytycznych do utworzenia kopii zapasowej
- omówienie zadań fazy przywracania
- wykluczanie wszystkich dysków z woluminu
Omówienie zadań fazy tworzenia kopii zapasowej
W czasie tworzenia kopii zapasowej żądający wykonuje następujące kroki.
Notatka
Wszystkie kroki są wymagane, chyba że wskazano inaczej.
Wywołaj funkcję CreateVssBackupComponents, aby utworzyć wystąpienie interfejsu IVssBackupComponents i wywołać metodę IVssBackupComponents::InitializeForBackup, aby zainicjować wystąpienie do zarządzania kopią zapasową.
Wywołaj IVssBackupComponents::SetContext, aby ustawić kontekst operacji kopiowania w tle.
Wywołaj IVssBackupComponents::SetBackupState, aby skonfigurować kopię zapasową. Ustaw parametr bBackupBootableSystemState na true, aby wskazać, że kopia zapasowa będzie zawierać stan systemu rozruchowego.
Wybierz składniki krytyczne w dokumencie metadanych modułu zapisywania usługi ASR, aby utworzyć kopię zapasową i wywołać IVssBackupComponents::AddComponent dla każdego z nich.
Wywołaj IVssBackupComponents::StartSnapshotSet, aby utworzyć nowy, pusty zestaw kopii migawkowej.
Wywołaj IVssBackupComponents::GatherWriterMetadata, aby zainicjować asynchroniczny kontakt z autorami.
Wywołaj IVssBackupComponents::GetWriterMetadata, aby pobrać dokument metadanych pisarza ASR. Identyfikator modułu zapisywania dla składnika zapisywania ASR to BE000CBE-11FE-4426-9C58-531AA6355FC4, a ciąg nazwy składnika zapisywania to "Składnik zapisywania asr".
Wywołaj IVssExamineWriterMetadata::SaveAsXML, aby zapisać kopię dokumentu metadanych pisarza ASR.
Wywołaj IVssBackupComponents::AddToSnapshotSet dla każdego woluminu, który może uczestniczyć w kopiach w tle, aby dodać wolumin do zestawu kopii w tle.
Wywołaj IVssBackupComponents::PrepareForBackup, aby powiadomić autorów o przygotowaniu się do operacji tworzenia kopii zapasowej.
Wywołaj IVssBackupComponents::GatherWriterStatus i IVssBackupComponents::GetWriterStatus (lub IVssBackupComponentsEx3::GetWriterStatus), aby zweryfikować status pisarza ASR.
W tym momencie można wykonywać zapytania dotyczące komunikatów o błędach ustawionych przez zapisującego w metodzie CVssWriter::OnPrepareBackup. Na przykład kod pokazujący sposób wyświetlania tych komunikatów, zobacz IVssComponentEx::GetPrepareForBackupFailureMsg.
Wywołaj IVssBackupComponents::DoSnapshotSet, aby utworzyć kopię woluminu cieniową.
Wywołaj IVssBackupComponents::GatherWriterStatus i IVssBackupComponents::GetWriterStatus, aby zweryfikować stan pisarza ASR.
Tworzenie kopii zapasowej danych.
Wskaż, czy operacja tworzenia kopii zapasowej powiodła się, wywołując IVssBackupComponents::SetBackupSucceededed.
Wywołaj IVssBackupComponents::BackupComplete, aby wskazać, że operacja tworzenia kopii zapasowej została ukończona.
Wywołaj IVssBackupComponents::GatherWriterStatus oraz IVssBackupComponents::GetWriterStatus. Pamięć stanu sesji modułu zapisywania jest ograniczonym zasobem, a autorzy muszą ostatecznie ponownie używać stanów sesji. Ten krok oznacza, że stan sesji zapisywania kopii zapasowej został ukończony i powiadamia usługę VSS, że miejsce tej sesji może zostać ponownie wykorzystane przez kolejną operację twórczą kopii zapasowej.
Notatka
Jest to konieczne tylko w systemie Windows Server 2008 z dodatkiem Service Pack 2 (SP2) i jego wcześniejszymi wersjami.
Wywołaj IVssBackupComponents::SaveAsXML, aby zapisać kopię dokumentu składników kopii zapasowej żądającego. Informacje w dokumencie Składniki kopii zapasowej są używane podczas przywracania, gdy żądający wywołuje metodę IVssBackupComponents::InitializeForRestore.
Wybieranie składników krytycznych do utworzenia kopii zapasowej
W fazie inicjowania kopii zapasowej pisarz ASR zgłasza następujące typy składników w dokumencie metadanych pisarza:
Woluminy krytyczne, takie jak woluminy rozruchowe, systemowe i środowiska odzyskiwania systemu Windows (Windows RE), oraz partycja Windows RE powiązana z uruchomioną instancją systemu Windows Vista lub Windows Server 2008. Wolumin jest woluminem krytycznym, jeśli zawiera informacje o stanie systemu. Woluminy rozruchowe i systemowe są uwzględniane automatycznie. Żądający musi uwzględniać wszystkie woluminy zawierające składniki krytyczne dla systemu zgłaszane przez moduły piszące, takie jak woluminy, które zawierają Active Directory. Składniki krytyczne dla systemu są oznaczone jako "niedostępne do tworzenia kopii zapasowej". W usłudze VSS "niedostępne" oznacza "nie opcjonalne". W związku z tym żądający jest zobowiązany do utworzenia ich kopii zapasowej jako część stanu systemu. Aby uzyskać więcej informacji, zobacz Tworzenie kopii zapasowych i przywracanie stanu systemu. Składniki, dla których ustawiono flagę VSS_CF_NOT_SYSTEM_STATE, nie są krytyczne dla systemu.
Notatka
Składnik usługi ASR jest krytycznym komponentem systemu, który jest zgłaszany przez pisarza ASR.
Dysków. Każdy stały dysk na komputerze jest widoczny jako składnik w ASR. Jeśli dysk nie został wykluczony podczas tworzenia kopii zapasowej, zostanie przypisany podczas przywracania i można go ponownie utworzyć i ponownie sformatować. Należy pamiętać, że podczas przywracania żądający nadal może ponownie utworzyć dysk, który został wykluczony podczas tworzenia kopii zapasowej, wywołując metodę IVssBackupComponents::SetRestoreOptions. Jeśli wybrano jeden dysk w pakiecie dysków dynamicznych, należy również wybrać wszystkie inne dyski w tym pakiecie. Jeśli wolumin jest wybrany, ponieważ jest woluminem krytycznym (czyli woluminem zawierającym informacje o stanie systemu), należy również wybrać każdy dysk zawierający zakres dla tego woluminu. Aby znaleźć zakresy woluminu, użyj kodu sterującego IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS.
Notatka
Podczas tworzenia kopii zapasowej wnioskodawca powinien uwzględniać wszystkie dyski stałe. Jeśli dysk zawierający zestaw kopii zapasowych osoby żądającego jest dyskiem lokalnym, należy dołączyć ten dysk. Podczas przywracania użytkownik musi wykluczyć dysk zawierający jego zestaw kopii zapasowych, aby zapobiec jego nadpisaniu.
W środowisku klastrowania usługa ASR nie rekonstruuje układu dysków współdzielonych klastra. Te dyski należy przywrócić w trybie online po przywróceniu systemu operacyjnego w systemie Windows RE.
Magazyn danych konfiguracji rozruchu (BCD). Ten składnik określa ścieżkę katalogu, który zawiera magazyn BCD. Moduł żądający musi określić ten składnik i utworzyć kopię zapasową wszystkich plików w katalogu magazynu BCD. Aby uzyskać więcej informacji na temat magazynu BCD, zobacz About BCD.
Notatka
Na komputerach korzystających z rozszerzonego interfejsu oprogramowania układowego (EFI) partycja EFI (ESP) jest zawsze ukryta i nie może być uwzględniona w migawce wolumenu. Żądający musi utworzyć kopię zapasową zawartości tej partycji. Ponieważ tej partycji nie można dołączyć do kopii woluminu w tle, kopia zapasowa może być wykonywana tylko z woluminu na żywo, a nie z kopii w tle. Aby uzyskać więcej informacji na temat EFI i ESP, zobacz przewodnik uruchamiania .
Nazwy składników używają następujących formatów:
W przypadku składników dysku format to
<COMPONENT logicalPath="Disks" componentName="harddiskn" componentType="filegroup" />
gdzie n jest numerem dysku. Rejestrowany jest tylko numer dysku. Aby uzyskać numer dysku, użyj IOCTL_STORAGE_GET_DEVICE_NUMBER kodu sterującego.
W przypadku składników woluminu format to
<COMPONENT logicalPath="Volumes" componentName="Volume{GUID}" componentType="filegroup" />
gdzie GUID to identyfikator woluminu GUID.
W przypadku składnika magazynu BCD format to
<COMPONENT logicalPath="BCD" componentName="BCD" componentType="filegroup" componentCaption = "To jest ścieżka do rozruchowego magazynu BCD i menedżerów rozruchu... Należy utworzyć kopię zapasową wszystkich plików w tym katalogu...">
Jeśli partycja systemowa ma nazwę identyfikatora GUID woluminu, można wybrać ten składnik. W przeciwnym razie nie można go wybrać.
Notatka
ASR dodaje pliki do grupy plików składnika magazynu BCD w następujący sposób:
W przypadku dysków EFI usługa ASR dodaje
SystemPartitionPath\EFI\Microsoft\Boot\*.*
gdzie systemPartitionPath jest ścieżką do partycji systemowej.
W przypadku dysków GPT usługa ASR dodaje
SystemPartitionPath\Boot\*.*
gdzie systemPartitionPath jest ścieżką do partycji systemowej.
Ścieżkę partycji systemowej można znaleźć w następującym kluczu rejestru: HKEY_LOCAL_MACHINE\System\Setup\SystemPartition
Po przywróceniu należy przywrócić wszystkie składniki oznaczone jako woluminy krytyczne. Jeśli nie można przywrócić co najmniej jednego woluminu krytycznego, operacja przywracania zakończy się niepowodzeniem.
W fazie przywracania wstępnego sekwencji przywracania, dyski, które nie zostały wykluczone podczas tworzenia kopii zapasowej, są domyślnie odtworzone i sformatowane ponownie. Nie są one jednak ponownie tworzone ani ponownie sformatowane, jeśli spełniają następujące warunki:
Dysk podstawowy nie jest tworzony ponownie, jeśli jego układ dysku jest nienaruszony lub wprowadzono w nim tylko zmiany addytywne. Układ dysku jest nienaruszony, jeśli spełnione są następujące warunki:
- Podpis dysku, styl dysku (GPT lub MBR), rozmiar sektora logicznego i przesunięcie startu woluminu nie są zmieniane.
- Rozmiar woluminu nie jest zmniejszony.
- W przypadku dysków GPT identyfikator partycji nie jest zmieniany.
Dysk dynamiczny nie jest tworzony ponownie, jeśli jego układ dysku jest nienaruszony lub wprowadzono do niego tylko zmiany addytywne. Aby dysk dynamiczny był nienaruszony, należy spełnić wszystkie warunki dla dysku podstawowego. Ponadto struktura woluminu całego pakietu dysków musi być nienaruszona. Struktura woluminu pakietu dysków jest nienaruszona, jeśli spełnia następujące warunki, które mają zastosowanie zarówno do dysków MBR, jak i GPT:
Liczba woluminów dostępnych w zestawie fizycznym podczas przywracania musi być większa lub równa liczbie woluminów określonych w metadanych modułu zapisywania ASR podczas tworzenia kopii zapasowej.
Liczba pleksów na jednostkę objętości musi być niezmieniona.
Liczba członków musi być niezmieniona.
Liczba zakresów dysków fizycznych musi być większa niż liczba zakresów dysków określonych w metadanych modułu zapisywania ASR.
Nienaruszony pakiet pozostaje nienaruszony w przypadku dodawania dodatkowych woluminów lub rozszerzenia woluminu w pakiecie (na przykład z woluminu prostego do woluminu rozproszonego).
Notatka
Jeśli wolumin prosty jest dublowany, pakiet nie jest nienaruszony i zostanie utworzony ponownie, aby upewnić się, że stan bcD i woluminu rozruchowego pozostają spójne po przywróceniu. Jeśli woluminy zostaną usunięte, pakiet zostanie utworzony ponownie.
Jeśli struktura woluminu pakietu dysków dynamicznych jest nienaruszona i zostaną wprowadzone tylko zmiany addytywne, dyski w pakiecie nie zostaną ponownie utworzone.
Windows Vista: dyski dynamiczne są zawsze tworzone ponownie. Należy pamiętać, że to zachowanie zostało zmienione w systemach Windows Server 2008 i Windows Vista z dodatkiem Service Pack 1 (SP1).
W dowolnym momencie przed rozpoczęciem fazy przywracania, żądający może określić, że dyski powinny być szybko sformatowane, ustawiając HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ASR\RestoreSession klucza rejestru. W tym kluczu istnieje wartość o nazwie QuickFormat z typem danych REG_DWORD. Jeśli ta wartość nie istnieje, należy ją utworzyć. Ustaw dane wartości QuickFormat na 1 w celu szybkiego formatowania lub 0 w celu powolnego formatowania.
Jeśli wartość QuickFormat nie istnieje, dyski zostaną sformatowane wolno.
Szybkie formatowanie jest znacznie szybsze niż powolne formatowanie (nazywane również pełnym formatowaniem). Jednak szybkie formatowanie nie weryfikuje każdego sektora na woluminie.
Omówienie zadań fazy przywracania
W czasie przywracania, żądający wykonuje następujące kroki:
Notatka
Wszystkie kroki są wymagane, chyba że wskazano inaczej.
Wywołaj funkcję CreateVssBackupComponents, aby utworzyć wystąpienie interfejsu IVssBackupComponents, a następnie wywołaj metodę IVssBackupComponents::InitializeForRestore, aby zainicjować to wystąpienie do przywrócenia, ładując dokument Składników Kopii Zapasowej obiektu żądającego do tego wystąpienia.
[Ten krok jest wymagany tylko wtedy, gdy obiekt żądający musi zmienić, czy parametr "IncludeDisk" lub "ExcludeDisk" jest określony dla co najmniej jednego dysku. Wywołaj IVssBackupComponents::SetRestoreOptions, aby ustawić opcje przywracania dla komponentów zapisywania ASR. Składnik zapisywania usługi ASR obsługuje następujące opcje: "IncludeDisk" pozwala wnioskodawcy dołączyć dysk do systemu docelowego z uwzględnieniem przywracania, nawet jeśli nie został wybrany podczas fazy tworzenia kopii zapasowej. Wyrażenie "ExcludeDisk" pozwala wnioskodawcy zapobiec ponownemu utworzeniu dysku na docelowym systemie. Należy pamiętać, że jeśli dla dysku zawierającego wolumin krytyczny określono wartość "ExcludeDisk", kolejne wywołanie IVssBackupComponents::PreRestore zakończy się niepowodzeniem.
W poniższym przykładzie pokazano, jak używać SetRestoreOptions, aby zapobiec ponownemu utworzeniu dysku 0 i dyskowi 1 i wstrzyknięciu sterowników innych firm do przywróconego woluminu rozruchowego.
Windows Server 2008, Windows Vista, Windows Server 2003 i Windows XP: Wstrzykiwanie sterowników firm trzecich nie jest obsługiwane.
W przykładzie przyjęto założenie, że IVssBackupComponents wskaźnik m_pBackupComponents jest prawidłowy.
m_pBackupComponents->SetRestoreOptions( AsrWriterId, VSS_CT_FILEGROUP, NULL, TEXT("ASR"), TEXT("\"ExcludeDisk\"=\"0\", \"ExcludeDisk\"=\"1\" "), TEXT("\"InjectDrivers\"=\"1\" ") );
Aby wykluczyć wszystkie dyski dla określonego woluminu, zobacz następujące "Wykluczanie wszystkich dysków dla woluminu".
Wywołaj IVssBackupComponents::PreRestore, aby powiadomić moduł zapisywania usługi ASR o przygotowaniu do operacji przywracania. Wywołuj IVssAsync::QueryStatus tyle razy, ile to konieczne, aż wartość stanu zwrócona w parametrze pHrResult nie będzie równa VSS_S_ASYNC_PENDING.
Przywróć dane. W fazie przywracania usługa ASR ponownie konfiguruje ścieżkę identyfikatora GUID woluminu (\\?\Volume{GUID}) dla każdego woluminu w celu dopasowania ścieżki identyfikatora GUID woluminu użytej podczas fazy tworzenia kopii zapasowej. Jednak litery dysku nie są zachowywane, ponieważ spowodowałoby to kolizje z literami dysku, które są automatycznie przypisywane w środowisku odzyskiwania. W związku z tym podczas przywracania danych żądający musi korzystać ze ścieżek identyfikatora GUID woluminu zamiast liter dysków, aby uzyskać dostęp do woluminów.
Ustaw HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ASR\RestoreSession klucz rejestru, aby wskazać zestaw woluminów, które zostały przywrócone lub sformatowane.
W tym kluczu istnieje wartość o nazwie RestoredVolumes z typem danych REG_MULTI_SZ. Jeśli ta wartość nie istnieje, należy ją utworzyć. W ramach tej wartości żądający powinien utworzyć wpis GUID dla każdego woluminu, który został przywrócony. Ten wpis powinien mieć następujący format: \\?\Volume{78618c8f-aefd-11da-a898-806e6f6e66663}. Za każdym razem, gdy jest wykonywane odzyskiwanie na poziomie sprzętowym, ASR ustawia wartość RestoredVolumes na zestaw woluminów przywróconych przez ASR. Jeśli żądający przywrócił dodatkowe woluminy, powinien ustawić tę wartość na połączenie zestawów woluminów przywróconych przez żądającego i woluminów przywróconych przez ASR. Jeśli żądający nie używał silnika rozpoznawania mowy (ASR), należy zastąpić listę woluminów.
Należy również utworzyć wartość o nazwie LastInstance z typem danych REG_SZ. Ten klucz powinien zawierać losowy plik cookie, który jednoznacznie identyfikuje bieżącą operację przywracania. Taki plik cookie można utworzyć przy użyciu funkcji UuidCreate i UuidToString. Za każdym razem, gdy wykonywane jest odzyskiwanie typu bare-metal, usługa ASR resetuje tę wartość rejestru, aby powiadomić osoby żądające i aplikacje kopii zapasowych inne niż VSS, że doszło do odzyskiwania.
Wywołaj IVssBackupComponents::PostRestore aby wskazać koniec operacji przywracania. Wywołaj IVssAsync::QueryStatus tyle razy, ile jest to konieczne, dopóki wartość stanu zwrócona w parametrze pHrResult nie jest VSS_S_ASYNC_PENDING.
W fazie przywracania usługa ASR może tworzyć lub usuwać partycje, aby przywrócić komputer do poprzedniego stanu. Wnioskodawcy nie mogą próbować mapować numerów dysków z fazy tworzenia kopii zapasowej do fazy przywracania.
Po przywróceniu żądający musi wykluczyć dysk zawierający zestaw kopii zapasowej żądającego. W przeciwnym razie zestaw kopii zapasowych może zostać zastąpiony przez operację przywracania.
Podczas przywracania dysk jest wykluczony, jeśli nie został wybrany jako składnik podczas tworzenia kopii zapasowej lub jeśli jest jawnie wykluczony przez wywołanie IVssBackupComponents::SetRestoreOptions z opcją "ExcludeDisk" podczas przywracania.
Należy pamiętać, że podczas odzyskiwania po awarii w środowisku WinPE funkcjonalność pisarza ASR jest dostępna, ale nie są dostępne żadne inne pisarze, a usługa VSS nie jest uruchomiona. Po zakończeniu odzyskiwania po awarii środowiska WinPE, komputer został uruchomiony ponownie, a system operacyjny Windows działa normalnie, można uruchomić usługę VSS, a żądający może wykonać wszelkie dodatkowe operacje przywracania, które wymagają udziału dostawców kopii zapasowych innych niż dostawca ASR.
Jeśli podczas sesji przywracania aplikacja kopii zapasowej wykryje, że unikatowe identyfikatory woluminu są niezmienione, a w związku z tym wszystkie woluminy z czasu tworzenia kopii zapasowej są obecne i nienaruszone w środowisku WinPE, aplikacja kopii zapasowej może kontynuować przywracanie tylko zawartości woluminów bez udziału usługi ASR. W takim przypadku aplikacja kopii zapasowej powinna wskazywać, że komputer został przywrócony przez ustawienie następującego klucza rejestru w przywróconym systemie operacyjnym: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ASR\RestoreSession
W tym kluczu określ LastInstance dla nazwy wartości, REG_SZ dla typu wartości oraz losowy plik cookie (taki jak identyfikator GUID utworzony przez funkcję UuidCreate) dla danych wartości.
Jeśli podczas sesji przywracania aplikacja kopii zapasowej wykryje, że co najmniej jeden wolumin zostanie zmieniony lub brakuje go, aplikacja kopii zapasowej powinna użyć usługi ASR do wykonania przywracania. Usługa ASR dokładnie odtworzy woluminy w stanie, w jakim były podczas tworzenia kopii zapasowej, i ustawi klucz rejestru RestoreSession.
Wykluczanie wszystkich dysków z woluminu
W poniższym przykładzie pokazano, jak wykluczyć wszystkie dyski dla określonego woluminu.
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 );
}