public PrivateHeader(byte[] buffer)
        {
            if (buffer.Length > Length)
            {
                // Checksum only applies to the first 512 bytes (even when the sector size > 512 bytes)
                buffer = ByteReader.ReadBytes(buffer, 0, 512);
            }
            Signature = ByteReader.ReadAnsiString(buffer, 0x00, 8);
            uint checksum = BigEndianConverter.ToUInt32(buffer, 0x08);

            MajorVersion              = BigEndianConverter.ToUInt16(buffer, 0x0C);
            MinorVersion              = BigEndianConverter.ToUInt16(buffer, 0x0E);
            LastUpdateDT              = DateTime.FromFileTimeUtc(BigEndianConverter.ToInt64(buffer, 0x10));
            UpdateSequenceNumber      = BigEndianConverter.ToUInt64(buffer, 0x18);
            PrimaryPrivateHeaderLBA   = BigEndianConverter.ToUInt64(buffer, 0x20);
            SecondaryPrivateHeaderLBA = BigEndianConverter.ToUInt64(buffer, 0x28);
            DiskGuidString            = ByteReader.ReadAnsiString(buffer, 0x30, 0x40).Trim('\0');
            HostGuidString            = ByteReader.ReadAnsiString(buffer, 0x70, 0x40).Trim('\0');
            DiskGroupGuidString       = ByteReader.ReadAnsiString(buffer, 0xB0, 0x40).Trim('\0');
            DiskGroupName             = ByteReader.ReadAnsiString(buffer, 0xF0, 31).Trim('\0');
            BytesPerSector            = BigEndianConverter.ToUInt32(buffer, 0x10F);
            Flags = (PrivateHeaderFlags)BigEndianConverter.ToUInt32(buffer, 0x113);
            PublicRegionSliceNumber  = BigEndianConverter.ToUInt16(buffer, 0x117);
            PrivateRegionSliceNumber = BigEndianConverter.ToUInt16(buffer, 0x119);
            PublicRegionStartLBA     = BigEndianConverter.ToUInt64(buffer, 0x11B);
            PublicRegionSizeLBA      = BigEndianConverter.ToUInt64(buffer, 0x123);
            PrivateRegionStartLBA    = BigEndianConverter.ToUInt64(buffer, 0x12B);
            PrivateRegionSizeLBA     = BigEndianConverter.ToUInt64(buffer, 0x133);
            PrimaryTocLBA            = BigEndianConverter.ToUInt64(buffer, 0x13B);
            SecondaryTocLBA          = BigEndianConverter.ToUInt64(buffer, 0x143);

            NumberOfConfigs = BigEndianConverter.ToUInt32(buffer, 0x14B);
            NumberOfLogs    = BigEndianConverter.ToUInt32(buffer, 0x14F);
            ConfigSizeLBA   = BigEndianConverter.ToUInt64(buffer, 0x153);
            LogSizeLBA      = BigEndianConverter.ToUInt64(buffer, 0x15B);

            DiskSignature     = BigEndianConverter.ToUInt32(buffer, 0x163);
            DiskSetGuid       = BigEndianConverter.ToGuid(buffer, 0x167);
            DiskSetGuidRepeat = BigEndianConverter.ToGuid(buffer, 0x177);

            BigEndianWriter.WriteUInt32(buffer, 0x08, (uint)0); // we exclude the checksum field from checksum calculations
            m_isChecksumValid = (checksum == CalculateChecksum(buffer));
        }
Exemple #2
0
        public TOCBlock(byte[] buffer)
        {
            Signature = ByteReader.ReadAnsiString(buffer, 0x00, 8);
            uint checksum = BigEndianConverter.ToUInt32(buffer, 0x08);

            UpdateSequenceNumber = BigEndianConverter.ToUInt64(buffer, 0x0C);
            // 16 zeros
            int offset = 0x24;

            // If the first character is not null (0x00), then there is a region defined
            while (buffer[offset] != 0)
            {
                TOCRegion region = new TOCRegion(buffer, offset);
                Regions.Add(region);
                offset += TOCRegion.Length;
            }

            BigEndianWriter.WriteUInt32(buffer, 0x08, (uint)0); // we exclude the checksum field from checksum calculations
            m_isChecksumValid = (checksum == PrivateHeader.CalculateChecksum(buffer));
        }
Exemple #3
0
        /// <returns>List of sectors that failed verification</returns>
        public static List <long> VerifyTestPattern(Disk disk, ref long sectorsRead)
        {
            int transferSize = Settings.MaximumTransferSizeLBA;

            sectorsRead = 0;
            List <long> failedSectorList = new List <long>();
            long        totalSectors     = disk.TotalSectors;

            for (long sectorIndex = 0; sectorIndex < totalSectors; sectorIndex += transferSize)
            {
                int sectorsToRead = (int)Math.Min(transferSize, totalSectors - sectorIndex);
                // Clear allocations from previous iteration
                GC.Collect();
                GC.WaitForPendingFinalizers();
                byte[] data = disk.ReadSectors(sectorIndex, sectorsToRead);
                for (int offset = 0; offset < sectorsToRead; offset++)
                {
                    byte[] sectorBytes = ByteReader.ReadBytes(data, (int)(offset * disk.BytesPerSector), disk.BytesPerSector);
                    byte[] expected    = GetTestPattern(sectorIndex + offset, disk.BytesPerSector);

                    if (sectorIndex + offset == 0)
                    {
                        long sectorNumber = (long)BigEndianConverter.ToUInt64(sectorBytes, 0);
                        long sectorCount  = (long)BigEndianConverter.ToUInt64(sectorBytes, 8);
                        if (sectorNumber == 0 && sectorCount > 0)
                        {
                            totalSectors = sectorCount;
                            BigEndianWriter.WriteUInt64(sectorBytes, 8, 0);
                        }
                    }

                    if (!ByteUtils.AreByteArraysEqual(sectorBytes, expected))
                    {
                        failedSectorList.Add(sectorIndex + offset);
                    }
                }

                sectorsRead += sectorsToRead;
            }
            return(failedSectorList);
        }
Exemple #4
0
        private List <KernelUpdateLogEntry> m_logEntries = new List <KernelUpdateLogEntry>(); // PendingTransactionID, CommitTransactionID

        public KernelUpdateLogPage(byte[] buffer)
        {
            Signature            = ByteReader.ReadAnsiString(buffer, 0x00, 4);
            UnknownTransactionID = BigEndianConverter.ToUInt64(buffer, 0x04);
            SequenceNumber       = BigEndianConverter.ToUInt32(buffer, 0x0C);
            NumberOfPages        = BigEndianConverter.ToUInt32(buffer, 0x10);
            PageIndex            = BigEndianConverter.ToUInt32(buffer, 0x14);

            // Note: for the first KLog, the most recent entry is at the top
            m_logEntries.Clear();

            int offset = 0x18;

            while (offset < buffer.Length - 24) // room of one more entry
            {
                KernelUpdateLogEntryStatus status = (KernelUpdateLogEntryStatus)buffer[offset];
                offset += 1;
                if (status != KernelUpdateLogEntryStatus.NotExist)
                {
                    KernelUpdateLogEntry entry = new KernelUpdateLogEntry();
                    entry.Status = status;
                    entry.CommittedTransactionID = BigEndianConverter.ToUInt64(buffer, offset);
                    offset += 8;
                    entry.PendingTransactionID = BigEndianConverter.ToUInt64(buffer, offset);
                    offset += 8;
                    entry.RecoverySequenceNumber = BigEndianConverter.ToUInt32(buffer, offset);
                    offset += 4;
                    m_logEntries.Add(entry);
                    offset += 3; // padding to align to 4-byte boundary
                }
                else
                {
                    break;
                }
            }
        }
Exemple #5
0
        public TrueCryptHeader(byte[] buffer, byte[] password)
        {
            Salt = ByteReader.ReadBytes(buffer, 0, 64);
            byte[] headerBytes = new byte[448];
            Array.Copy(buffer, 64, headerBytes, 0, 448);
            byte[] decrypted = DecryptHeader(headerBytes, password);
            if (m_isValid)
            {
                Signature                  = ByteReader.ReadAnsiString(decrypted, 0, 4);
                FormatVersion              = BigEndianConverter.ToUInt16(decrypted, 4);
                MinProgramVersionRequired  = BigEndianConverter.ToUInt16(decrypted, 6);
                Checksum256                = BigEndianConverter.ToUInt32(decrypted, 8);
                HiddenVolumeSize           = BigEndianConverter.ToUInt64(decrypted, 28);
                VolumeSize                 = BigEndianConverter.ToUInt64(decrypted, 36);
                MasterKeyScopeOffset       = BigEndianConverter.ToUInt64(decrypted, 44);
                MasterKeyEncryptedAreaSize = BigEndianConverter.ToUInt64(decrypted, 52);
                Flags      = BigEndianConverter.ToUInt32(decrypted, 60);
                SectorSize = BigEndianConverter.ToUInt32(decrypted, 64);
                Checksum64 = BigEndianConverter.ToUInt32(decrypted, 188);
                MasterKey  = ByteReader.ReadBytes(decrypted, 192, 192);

                AssignKey(m_algorithmChain, MasterKey);
            }
        }
Exemple #6
0
        public CodeDirectoryBlob(byte[] buffer, int offset) : base(buffer, offset)
        {
            uint length = BigEndianConverter.ToUInt32(buffer, offset + 4);

            Version = BigEndianConverter.ToUInt32(buffer, offset + 8);
            Flags   = (CodeDirectoryFlags)BigEndianConverter.ToUInt32(buffer, offset + 12);
            uint hashOffset           = BigEndianConverter.ToUInt32(buffer, offset + 16);
            uint identOffset          = BigEndianConverter.ToUInt32(buffer, offset + 20);
            uint numberOfSpecialSlots = BigEndianConverter.ToUInt32(buffer, offset + 24);
            uint numberOfCodeSlots    = BigEndianConverter.ToUInt32(buffer, offset + 28);

            CodeLimit    = BigEndianConverter.ToUInt32(buffer, offset + 32);
            HashSize     = ByteReader.ReadByte(buffer, offset + 36);
            HashType     = (HashType)ByteReader.ReadByte(buffer, offset + 37);
            Platform     = ByteReader.ReadByte(buffer, offset + 38);
            PageSizeLog2 = ByteReader.ReadByte(buffer, offset + 39);
            Spare2       = BigEndianConverter.ToUInt32(buffer, offset + 40);
            uint scatterOffset = 0;
            uint teamIDOffset  = 0;

            if (Version >= ScatterMinimumVersion)
            {
                scatterOffset = BigEndianConverter.ToUInt32(buffer, offset + 44);
                if (Version >= TeamIDMinimumVersion)
                {
                    teamIDOffset = BigEndianConverter.ToUInt32(buffer, offset + 48);
                    if (Version >= CodeLimit64MinimumVersion)
                    {
                        Spare3      = BigEndianConverter.ToUInt32(buffer, offset + 52);
                        CodeLimit64 = BigEndianConverter.ToUInt64(buffer, offset + 56);
                        if (Version >= ExecSegMinimumVersion)
                        {
                            ExecSegBase  = BigEndianConverter.ToUInt64(buffer, offset + 64);
                            ExecSegLimit = BigEndianConverter.ToUInt64(buffer, offset + 72);
                            ExecSegFlags = BigEndianConverter.ToUInt64(buffer, offset + 80);
                        }
                    }
                }
            }

            if (identOffset != 0)
            {
                Ident = ByteReader.ReadNullTerminatedAnsiString(buffer, offset + (int)identOffset);
            }

            if (teamIDOffset != 0)
            {
                TeamID = ByteReader.ReadNullTerminatedAnsiString(buffer, offset + (int)teamIDOffset);
            }

            int specialHashesOffset = (int)hashOffset - (int)numberOfSpecialSlots * (int)HashSize;

            for (int index = 0; index < numberOfSpecialSlots; index++)
            {
                byte[] hash = ByteReader.ReadBytes(buffer, offset + specialHashesOffset + index * (int)HashSize, (int)HashSize);
                SpecialHashes.Add(hash);
            }

            for (int index = 0; index < numberOfCodeSlots; index++)
            {
                byte[] hash = ByteReader.ReadBytes(buffer, offset + (int)hashOffset + index * (int)HashSize, (int)HashSize);
                CodeHashes.Add(hash);
            }
        }
Exemple #7
0
 public LongLBAModeParameterBlockDescriptor(byte[] buffer, int offset)
 {
     NumberOfBlocks     = BigEndianConverter.ToUInt64(buffer, offset + 0);
     Reserved           = BigEndianConverter.ToUInt32(buffer, offset + 8);
     LogicalBlockLength = BigEndianConverter.ToUInt32(buffer, offset + 12);
 }
Exemple #8
0
 public ReadCapacity16Parameter(byte[] buffer)
 {
     ReturnedLBA        = BigEndianConverter.ToUInt64(buffer, 0);
     BlockLengthInBytes = BigEndianConverter.ToUInt32(buffer, 8);
 }
Exemple #9
0
 protected override void ReadOperationParameters(byte[] buffer, int offset)
 {
     VolumeGuid = BigEndianConverter.ToGuid(buffer, offset + 0);
     NumberOfCommittedSectors = BigEndianConverter.ToUInt64(buffer, offset + 16);
 }