public SecurityDescriptors(File file)
        {
            _file      = file;
            _hashIndex = new IndexView <HashIndexKey, HashIndexData>(file.GetIndex("$SDH"));
            _idIndex   = new IndexView <IdIndexKey, IdIndexData>(file.GetIndex("$SII"));

            foreach (var entry in _idIndex.Entries)
            {
                if (entry.Key.Id > _nextId)
                {
                    _nextId = entry.Key.Id;
                }

                long end = entry.Value.SdsOffset + entry.Value.SdsLength;
                if (end > _nextSpace)
                {
                    _nextSpace = end;
                }
            }

            if (_nextId == 0)
            {
                _nextId = 256;
            }
            else
            {
                _nextId++;
            }

            _nextSpace = Utilities.RoundUp(_nextSpace, 16);
        }
Beispiel #2
0
        public static Quotas Initialize(File file)
        {
            Index ownerIndex = file.CreateIndex("$O", (AttributeType)0, AttributeCollationRule.Sid);
            Index quotaIndox = file.CreateIndex("$Q", (AttributeType)0, AttributeCollationRule.UnsignedLong);

            IndexView <OwnerKey, OwnerRecord>    ownerIndexView = new IndexView <OwnerKey, OwnerRecord>(ownerIndex);
            IndexView <OwnerRecord, QuotaRecord> quotaIndexView = new IndexView <OwnerRecord, QuotaRecord>(quotaIndox);

            OwnerKey    adminSid     = new OwnerKey(new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, null));
            OwnerRecord adminOwnerId = new OwnerRecord(256);

            ownerIndexView[adminSid] = adminOwnerId;

            quotaIndexView[new OwnerRecord(1)] = new QuotaRecord(null);
            quotaIndexView[adminOwnerId]       = new QuotaRecord(adminSid.Sid);

            return(new Quotas(file));
        }
Beispiel #3
0
        private void VerifyDirectories()
        {
            foreach (FileRecord fr in _context.Mft.Records)
            {
                if (fr.BaseFile.Value != 0)
                {
                    continue;
                }

                File f = new File(_context, fr);
                foreach (var stream in f.AllStreams)
                {
                    if (stream.AttributeType == AttributeType.IndexRoot && stream.Name == "$I30")
                    {
                        IndexView <FileNameRecord, FileRecordReference> dir = new IndexView <FileNameRecord, FileRecordReference>(f.GetIndex("$I30"));
                        foreach (var entry in dir.Entries)
                        {
                            FileRecord refFile = _context.Mft.GetRecord(entry.Value);

                            // Make sure each referenced file actually exists...
                            if (refFile == null)
                            {
                                ReportError("Directory {0} references non-existent file {1}", f, entry.Key);
                            }

                            File referencedFile    = new File(_context, refFile);
                            StandardInformation si = referencedFile.StandardInformation;
                            if (si.CreationTime != entry.Key.CreationTime || si.MftChangedTime != entry.Key.MftChangedTime ||
                                si.ModificationTime != entry.Key.ModificationTime)
                            {
                                ReportInfo("Directory entry {0} in {1} is out of date", entry.Key, f);
                            }
                        }
                    }
                }
            }
        }
Beispiel #4
0
 public ReparsePoints(File file)
 {
     _file  = file;
     _index = new IndexView <Key, Data>(file.GetIndex("$R"));
 }
Beispiel #5
0
 public ObjectIds(File file)
 {
     _file  = file;
     _index = new IndexView <IndexKey, ObjectIdRecord>(file.GetIndex("$O"));
 }
Beispiel #6
0
 public Quotas(File file)
 {
     _ownerIndex = new IndexView <OwnerKey, OwnerRecord>(file.GetIndex("$O"));
     _quotaIndex = new IndexView <OwnerRecord, QuotaRecord>(file.GetIndex("$Q"));
 }