public void FragmentsRun9()
        {
            byte[] data = new byte[] { 0x21, 0x02, 0xEF, 0x07, 0x01, 0x0E, 0x00 };
            List <DataFragment> fragments = DataFragment.ParseFragments(data, data.Length, 0, 0, 15).ToList();

            // These fragments have compression
            DataFragment.CompactCompressedFragments(fragments);

            Assert.AreEqual(1, fragments.Count);

            DataFragmentHelpers.CheckFragment(fragments[0], 2, 14, 0, 0x21, 2031, false, true);

            // Save to bytes
            byte[] newData = DataFragmentHelpers.SaveFragments(fragments.ToArray());

            Assert.IsTrue(newData.SequanceEqualIn(data));
        }
        public void FragmentsRun5()
        {
            byte[] data = new byte[] { 0x11, 0x08, 0x40, 0x01, 0x08, 0x11, 0x10, 0x08, 0x11, 0x0C, 0x10, 0x01, 0x04, 0x00 };
            List <DataFragment> fragments = DataFragment.ParseFragments(data, data.Length, 0, 0, 47).ToList();

            // These fragments have compression
            DataFragment.CompactCompressedFragments(fragments);

            Assert.AreEqual(3, fragments.Count);

            DataFragmentHelpers.CheckFragment(fragments[0], 8, 8, 0, 0x11, 64, false, true);
            DataFragmentHelpers.CheckFragment(fragments[1], 16, 0, 16, 0x11, 72, false, false);
            DataFragmentHelpers.CheckFragment(fragments[2], 12, 4, 32, 0x11, 88, false, true);

            // Save to bytes
            byte[] newData = DataFragmentHelpers.SaveFragments(fragments.ToArray());

            Assert.IsTrue(newData.SequanceEqualIn(data));
        }
Пример #3
0
        public void ActualFragmentRun5()
        {
            // Mikes Disk C: MFT# -- Data Non-Resident (Sparse & Compressed)
            byte[] data = new byte[] { 0x01, 0x60, 0x41, 0x02, 0x6C, 0xB3, 0xAA, 0x00, 0x01, 0x0E, 0x11, 0x01, 0x10, 0x01, 0x0F, 0x00 };
            List <DataFragment> fragments = DataFragment.ParseFragments(data, data.Length, 0, 0, 127).ToList();

            DataFragment.CompactCompressedFragments(fragments);

            Assert.AreEqual(3, fragments.Count);

            DataFragmentHelpers.CheckFragment(fragments[0], 96, 0, 0, 0x01, 0, true, false);
            DataFragmentHelpers.CheckFragment(fragments[1], 2, 14, 96, 0x41, 11187052, false, true);
            DataFragmentHelpers.CheckFragment(fragments[2], 1, 15, 112, 0x11, 11187068, false, true);

            // Save to bytes
            byte[] newData = DataFragmentHelpers.SaveFragments(fragments.ToArray());

            Assert.IsTrue(newData.SequanceEqualIn(data));
        }
Пример #4
0
        public static Attribute ParseSingleAttribute(byte[] data, int maxLength, int offset = 0)
        {
            // Debug.Assert(data.Length - offset >= maxLength);
            // Debug.Assert(0 <= offset && offset <= data.Length);

            AttributeType type = GetType(data, offset);

            if (type == AttributeType.EndOfAttributes)
            {
                Attribute tmpRes = new AttributeGeneric();
                tmpRes.ParseHeader(data, offset);

                return(tmpRes);
            }

            Attribute res;

            switch (type)
            {
            case AttributeType.Unknown:
                res = new AttributeGeneric();
                break;

            case AttributeType.STANDARD_INFORMATION:
                res = new AttributeStandardInformation();
                break;

            case AttributeType.ATTRIBUTE_LIST:
                res = new AttributeList();
                break;

            case AttributeType.FILE_NAME:
                res = new AttributeFileName();
                break;

            case AttributeType.OBJECT_ID:
                // Also OBJECT_ID
                // TODO: Handle either case
                res = new AttributeObjectId();
                break;

            case AttributeType.SECURITY_DESCRIPTOR:
                res = new AttributeSecurityDescriptor();
                break;

            case AttributeType.VOLUME_NAME:
                res = new AttributeVolumeName();
                break;

            case AttributeType.VOLUME_INFORMATION:
                res = new AttributeVolumeInformation();
                break;

            case AttributeType.DATA:
                res = new AttributeData();
                break;

            case AttributeType.INDEX_ROOT:
                res = new AttributeIndexRoot();
                break;

            case AttributeType.INDEX_ALLOCATION:
                res = new AttributeIndexAllocation();
                break;

            case AttributeType.BITMAP:
                res = new AttributeBitmap();
                break;

            case AttributeType.REPARSE_POINT:
                // TODO
                res = new AttributeGeneric();
                break;

            case AttributeType.EA_INFORMATION:
                res = new AttributeExtendedAttributeInformation();
                break;

            case AttributeType.EA:
                res = new AttributeExtendedAttributes();
                break;

            // Property set seems to be obsolete
            //case AttributeType.PROPERTY_SET:
            //    res = new MFTAttributeGeneric();
            //    break;
            case AttributeType.LOGGED_UTILITY_STREAM:
                res = new AttributeLoggedUtilityStream();
                break;

            default:
                // TODO
                res = new AttributeGeneric();
                break;
            }

            res.ParseHeader(data, offset);
            if (res.NonResidentFlag == ResidentFlag.Resident)
            {
                // Debug.Assert((res.AllowedResidentStates & AttributeResidentAllow.Resident) != 0);

                res.ResidentHeader = AttributeResidentHeader.ParseHeader(data, offset + 16);

                int bodyOffset = offset + res.ResidentHeader.ContentOffset;
                int length     = offset + res.TotalLength - bodyOffset;

                // Debug.Assert(length >= res.ResidentHeader.ContentLength);
                // Debug.Assert(offset + maxLength >= bodyOffset + length);

                res.ParseAttributeResidentBody(data, length, bodyOffset);
            }
            else if (res.NonResidentFlag == ResidentFlag.NonResident)
            {
                // Debug.Assert((res.AllowedResidentStates & AttributeResidentAllow.NonResident) != 0);

                res.NonResidentHeader = AttributeNonResidentHeader.ParseHeader(data, offset + 16);

                int bodyOffset = offset + res.NonResidentHeader.ListOffset;
                int length     = res.TotalLength - res.NonResidentHeader.ListOffset;

                // Debug.Assert(offset + maxLength >= bodyOffset + length);

                res.NonResidentHeader.Fragments = DataFragment.ParseFragments(data, length, bodyOffset, res.NonResidentHeader.StartingVCN, res.NonResidentHeader.EndingVCN);

                // Compact compressed fragments
                if (res.NonResidentHeader.CompressionUnitSize != 0)
                {
                    List <DataFragment> fragments = res.NonResidentHeader.Fragments;
                    DataFragment.CompactCompressedFragments(fragments);
                    res.NonResidentHeader.Fragments = fragments;
                }
            }
            else
            {
                throw new NotImplementedException("Couldn't process residentflag");
            }

            return(res);
        }