Windows server 2008、2012和;等

Windows server 2008、2012和;等,windows,visual-c++,sccm,ntfs-mft,mdt,Windows,Visual C++,Sccm,Ntfs Mft,Mdt,我面临磁盘克隆的问题。(即)克隆完成后,操作系统分区将作为原始文件系统,而不是NTFS文件系统 我使用了FSCTL\u GET\u VOLUME\u BITMAP设备IO控制API来获取卷位图缓冲区。使用此卷位图,我仅从源磁盘克隆了已使用的群集,并将其写入目标磁盘的相同偏移量中。在左侧的自由簇位置 只有使用过的群集克隆才会导致任何问题? 对于卷位图中的常驻和非常驻内容是否正确?。因为我没有考虑非居民属性。简单地说,我仅使用以下代码克隆了已使用的群集。 我只在Windows server计算机上面

我面临磁盘克隆的问题。(即)克隆完成后,操作系统分区将作为原始文件系统,而不是NTFS文件系统

我使用了FSCTL\u GET\u VOLUME\u BITMAP设备IO控制API来获取卷位图缓冲区。使用此卷位图,我仅从源磁盘克隆了已使用的群集,并将其写入目标磁盘的相同偏移量中。在左侧的自由簇位置

  • 只有使用过的群集克隆才会导致任何问题?

  • 对于卷位图中的常驻和非常驻内容是否正确?。因为我没有考虑非居民属性。简单地说,我仅使用以下代码克隆了已使用的群集。

  • 我只在Windows server计算机上面临此问题。

  • 请任何人提出解决我问题的办法。找到下面的代码片段

    查找已使用的群集

    BOOL IsClusterUsed (UINT64 Cluster)
    {
    return ((BitmapBuffer[Cluster / 32] & (1 << (Cluster % 32))) ? TRUE : FALSE);   
    }
    
    BOOL已集群化(UINT64集群)
    {
    返回((BitmapBuffer[Cluster/32]&(1 BitmapSize.QuadPart-Bitmap->StartingLcn.QuadPart;//TOT noof clusters
    //库特
    
     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);