コード例 #1
0
 /// <summary>
 /// Makes a shadow copy of a data cluster.
 /// </summary>
 /// <param name="sourceClusterAddress">the address of the first block in the cluster.
 /// If address is zero, it simply creates an empty cluster.</param>
 /// <param name="indexValue">the index value of this first block</param>
 /// <param name="destinationClusterAddress">the first block of the destination cluster</param>
 private void ShadowCopyDataCluster(uint sourceClusterAddress, uint indexValue, uint destinationClusterAddress)
 {
     //if source exist
     if (sourceClusterAddress != 0)
     {
         DiskIoSession sourceData      = m_ioSessions.SourceData;
         DiskIoSession destinationData = m_ioSessions.DestinationData;
         sourceData.ReadOld(sourceClusterAddress, BlockType.DataBlock, indexValue);
         destinationData.WriteToNewBlock(destinationClusterAddress, BlockType.DataBlock, indexValue);
         Memory.Copy(sourceData.Pointer, destinationData.Pointer, sourceData.Length);
         m_ioSessions.SwapData();
     }
     //if source cluster does not exist.
     else
     {
         m_ioSessions.SourceData.WriteToNewBlock(destinationClusterAddress, BlockType.DataBlock, indexValue);
         Memory.Clear(m_ioSessions.SourceData.Pointer, m_ioSessions.SourceData.Length);
     }
 }
コード例 #2
0
        /// <summary>
        /// Makes a shadow copy of an index indirect block and updates a remote address.
        /// </summary>
        /// <param name="sourceBlockAddress">the address of the source.</param>
        /// <param name="destinationBlockAddress">the address of the destination. This can be the same as the source.</param>
        /// <param name="indexValue">the index value that goes in the footer of the file.</param>
        /// <param name="blockType">Gets the expected block type</param>
        /// <param name="remoteAddressOffset">the offset of the remote address that needs to be updated.</param>
        /// <param name="remoteBlockAddress">the value of the remote address.</param>
        private void ReadThenWriteIndexIndirectBlock(uint sourceBlockAddress, uint destinationBlockAddress, uint indexValue, BlockType blockType, int remoteAddressOffset, uint remoteBlockAddress)
        {
            DiskIoSession bufferSource = m_ioSessions.SourceIndex;

            if (sourceBlockAddress == destinationBlockAddress)
            {
                if (*(int *)(bufferSource.Pointer + (remoteAddressOffset << 2)) != remoteBlockAddress)
                {
                    bufferSource.WriteToExistingBlock(destinationBlockAddress, blockType, indexValue);

                    WriteIndexIndirectBlock(bufferSource.Pointer, remoteAddressOffset, remoteBlockAddress);
                }
            }
            else
            {
                bufferSource.ReadOld(sourceBlockAddress, blockType, indexValue);

                DiskIoSession destination = m_ioSessions.DestinationIndex;
                destination.WriteToNewBlock(destinationBlockAddress, blockType, indexValue);
                Memory.Copy(bufferSource.Pointer, destination.Pointer, destination.Length);
                WriteIndexIndirectBlock(destination.Pointer, remoteAddressOffset, remoteBlockAddress);
                m_ioSessions.SwapIndex();
            }
        }