Esempio n. 1
0
        public void Scan()
        {
            USN firstUsn = this.FromUsn;

            do
            {
                var usnRecords = this.usnIo.FileSystemReadUsnJournal(UsnJournalReasonMask.All, firstUsn);
                foreach (USN_RECORD_V2 usnRecord in usnRecords)
                {
                    var fileDescriptor = new FILE_ID_DESCRIPTOR
                    {
                        dwSize = 100,
                        FileReferenceNumber = usnRecord.FileReferenceNumber,
                        type = FILE_ID_TYPE.FileIdType
                    };
                    var fileHandle = Kernel32.OpenFileById(this.volumeHandle, ref fileDescriptor, FileAccess.Read, FileShare.ReadWrite, IntPtr.Zero, FileAttributes.Normal);

                    if (fileHandle.IsInvalid)
                    {
                        continue;
                    }

                    var filePath = Kernel32.GetFinalPathNameByHandle(fileHandle);
                    var reason   = Convert(usnRecord.Reason);
                    if (this.AcceptFile(filePath, usnRecord.FileName) && this.Filter(filePath, reason))
                    {
                        this.recordListener.Listen(filePath, reason);
                    }
                }

                if (usnRecords.Length == 0)
                {
                    break;
                }

                firstUsn.Usn = usnRecords.Last().Usn.Usn + 1;
            } while (true);

            this.ScanLastUsn = firstUsn.Usn;
        }
        /// <summary><see cref="https://msdn.microsoft.com/en-us/library/windows/desktop/aa364586(v=vs.85).aspx"/></summary>
        public IUSN_RECORD[] FileSystemReadUsnJournal(long volumeJournalId, UsnJournalReasonMask reasonMask, USN firstUsn, int bytesToWaitFor = 0, int timeout = 0)
        {
            READ_USN_JOURNAL_DATA_V0 input = new READ_USN_JOURNAL_DATA_V0();

            input.StartUsn       = firstUsn;
            input.UsnJournalId   = volumeJournalId;
            input.ReasonMask     = reasonMask;
            input.BytesToWaitFor = bytesToWaitFor;
            input.Timeout        = timeout;

            int errorCode;

            byte[] data = DeviceIoControlHelper.InvokeIoControl(Handle, IOControlCode.FsctlReadUsnJournal, 1024 * 1024, input, out errorCode);

            List <IUSN_RECORD> res = new List <IUSN_RECORD>();

            using (UnmanagedMemory mem = new UnmanagedMemory(data))
            {
                int dataOffset = 8;

                while (dataOffset < data.Length)
                {
                    int         length;
                    IUSN_RECORD rec = ParseUsnRecord(mem, dataOffset, out length);

                    if (length <= 0)
                    {
                        break;
                    }

                    res.Add(rec);

                    // Move to next record
                    dataOffset += length;
                }
            }

            return(res.ToArray());
        }
        /// <summary><see cref="https://msdn.microsoft.com/en-us/library/windows/desktop/aa364586(v=vs.85).aspx"/></summary>
        public IUSN_RECORD[] FileSystemReadUsnJournal(UsnJournalReasonMask reasonMask, USN firstUsn, int bytesToWaitFor = 0, int timeout = 0)
        {
            USN_JOURNAL_DATA_V0 usnQuery = FileSystemQueryUsnJournal();

            return(FileSystemReadUsnJournal(usnQuery.UsnJournalID, reasonMask, firstUsn, bytesToWaitFor, timeout));
        }