Раздел ОС, представленный как RAW после клонирования томов в Windows Server 2008, 2012 и т. Д.
У меня проблема с клонированием диска. (т. е.) после завершения клонирования раздел ОС появляется как RAW вместо файловой системы NTFS.
Я использовал FSCTL_GET_VOLUME_BITMAP API управления IO устройства для получения буфера растрового изображения тома. Используя это растровое изображение тома, я клонировал только использованные кластеры с исходного диска и записал с тем же смещением целевого диска. В свободном кластере позиции остались как есть.
Клонирование только используемых кластеров вызовет какие-либо проблемы?
Правильно ли это для резидентного и нерезидентного контента в томе? потому что я не рассматривал нерезидентные атрибуты. Просто я клонировал только используемые кластеры, используя следующий код.
Я сталкиваюсь с этой проблемой только с Windows-серверов.
Пожалуйста, любой предложит способ решить мою проблему. найдите фрагмент кода ниже.
Поиск использованных кластеров
BOOL IsClusterUsed (UINT64 Cluster)
{
return ((BitmapBuffer[Cluster / 32] & (1 << (Cluster % 32))) ? TRUE : FALSE);
}
Получение тома Bitmap:
STARTING_LCN_INPUT_BUFFER StartingLCN;
VOLUME_BITMAP_BUFFER *Bitmap = NULL;
ULONGLONG BitmapSize;
DWORD BytesReturned1;
BOOL Status;
ULONGLONG ClusterCount = 0;
DWORD BytesReturned = 0;
_tprintf(L"[%s %d]>>GetBitmap()volume Vol(%s)\n",
gpCFileName,
__LINE__,
i_VolumeName);
if(ISNULL(o_BitmapBuffer) || ISNULL(o_Size))
{
_tprintf(L"[%s %d]>>GetBitmap()Input null open volume Vol(%s)\n",
gpCFileName,
__LINE__,
i_VolumeName);
return -1;
}
HANDLE hFile=CreateFile(L"\\\\.\\C:",GENERIC_READ,FILE_SHARE_READ | FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0);
if(hFile == INVALID_HANDLE_VALUE) // this may happen if another program is already reading from disk
{
LastError = ::GetLastError();
INFOLOG(L"[%s %d]>>GetBitmap()-Unable to open volume Vol(%s) LError(0x%x)\n",
gpCFileName,
__LINE__,
i_VolumeName,
LastError);
CloseHandle(hFile);
return -1;
}
StartingLCN.StartingLcn.QuadPart = 0;
BitmapSize = sizeof (VOLUME_BITMAP_BUFFER) + 4;
Bitmap = (VOLUME_BITMAP_BUFFER *) malloc ((size_t)BitmapSize);
LastError = ::GetLastError();
if(ISNULL(Bitmap))
{
_tprintf(L"[%s %d]>>GetBitmap()-Couldn't properly read volume Bitmap Vol(%s) size(%d) LError(0x%x)\n",
gpCFileName,
__LINE__,
i_VolumeName,
(size_t)BitmapSize,
LastError);
return -1;
}
Status = DeviceIoControl( hFile, FSCTL_GET_VOLUME_BITMAP, &StartingLCN, sizeof (StartingLCN), Bitmap, (DWORD)BitmapSize, &BytesReturned1, NULL);
LastError = ::GetLastError();
if (Status == FALSE && LastError != ERROR_MORE_DATA)
{
SECURE_FREE(Bitmap);
_tprintf(L"[%s %d]>>GetBitmap()-Unable to get Bitmap Vol(%s) LError(0x%x)\n",
gpCFileName,
__LINE__,
i_VolumeName,
LastError);
return -1;
}
ClusterCount = Bitmap->BitmapSize.QuadPart - Bitmap->StartingLcn.QuadPart;//TOT noof clusters
//cout<<"\n Tot no of clusters :"<<ClusterCount<<"\n";
//cout<<"\n StartingLcn :"<<Bitmap->StartingLcn.QuadPart<<"\n";
//printf("Reallocate Memory \n");
BitmapSize = sizeof (VOLUME_BITMAP_BUFFER) + ((Bitmap->BitmapSize.QuadPart) / i_SectorPerCluster) + 1;
Bitmap = (VOLUME_BITMAP_BUFFER *) realloc (Bitmap, (size_t)BitmapSize);
//cout<<"\n Realloc BitmapSize :"<<BitmapSize<<"\n";
//cout<<"\n Realloc size_t BitmapSize :"<<(size_t)BitmapSize<<"\n";
//cout<<"\n GetClusterSize :"<<this->GetClusterSize()<<"\n";
Status = DeviceIoControl( hFile, FSCTL_GET_VOLUME_BITMAP, &StartingLCN, sizeof (StartingLCN), Bitmap, (DWORD)BitmapSize, &BytesReturned, NULL);
LastError = ::GetLastError();
if (Status == FALSE)
{
_tprintf(L"[%s %d]>>GetBitmap()-Couldn't properly read volume Bitmap Vol(%s) Bytes(%ld) LError(0x%x)\n",
gpCFileName,
__LINE__,
i_VolumeName,
BytesReturned,
LastError);
SECURE_FREE(Bitmap);
return -1;
}
ULONGLONG len = sizeof(UINT32) * (1 + (ClusterCount / 32));
*o_BitmapBuffer = (PUINT)new BYTE[(size_t)len];
memcpy (*o_BitmapBuffer, Bitmap->Buffer, ((size_t)(len)));
*o_Size = (DWORD)len;
SECURE_FREE(Bitmap);
CloseHandle(hFile);