Esempio n. 1
0
        public void GetEntries(long usn, ulong fileNumber, GetEntriesHandler handler, int count)
        {
            List <UsnEntry> result       = new List <UsnEntry>();
            UsnErrorCode    usnErrorCode = this.QueryUSNJournal();

            if (usnErrorCode == UsnErrorCode.SUCCESS)
            {
                MFT_ENUM_DATA mftEnumData = new MFT_ENUM_DATA();
                mftEnumData.StartFileReferenceNumber = fileNumber;
                mftEnumData.LowUsn  = 0;
                mftEnumData.HighUsn = this.ntfsUsnJournalData.NextUsn;
                int    sizeMftEnumData = Marshal.SizeOf(mftEnumData);
                IntPtr ptrMftEnumData  = GetHeapGlobalPtr(sizeMftEnumData);
                Marshal.StructureToPtr(mftEnumData, ptrMftEnumData, true);
                int    ptrDataSize = sizeof(UInt64) + 10000;
                IntPtr ptrData     = GetHeapGlobalPtr(ptrDataSize);
                uint   outBytesCount;

                while (false != Win32Api.DeviceIoControl(
                           this.DriveRootHandle,
                           UsnControlCode.FSCTL_ENUM_USN_DATA,
                           ptrMftEnumData,
                           sizeMftEnumData,
                           ptrData,
                           ptrDataSize,
                           out outBytesCount,
                           IntPtr.Zero))
                {
                    long   purvalue     = ptrData.ToInt64() + sizeof(long);
                    IntPtr ptrUsnRecord = new IntPtr(purvalue);

                    while (outBytesCount > 60)
                    {
                        var usnRecord = new USN_RECORD_V2(ptrUsnRecord);

                        UsnEntry rec = new UsnEntry(usnRecord);
                        if (rec.FileReferenceNumber > fileNumber || rec.Usn > usn)
                        {
                            result.Add(rec);
                        }

                        ptrUsnRecord   = new IntPtr(ptrUsnRecord.ToInt64() + usnRecord.RecordLength);
                        outBytesCount -= usnRecord.RecordLength;

                        if (result.Count >= count)
                        {
                            handler?.Invoke(Drive, result);
                            result = new List <UsnEntry>();
                        }
                    }
                    Marshal.WriteInt64(ptrMftEnumData, Marshal.ReadInt64(ptrData, 0));
                }

                Marshal.FreeHGlobal(ptrData);
                Marshal.FreeHGlobal(ptrMftEnumData);
            }
            handler?.Invoke(Drive, result);
        }
Esempio n. 2
0
        public List <UsnEntry> GetEntries()
        {
            var result = new List <UsnEntry>();

            UsnErrorCode usnErrorCode = this.QueryUSNJournal();

            if (usnErrorCode == UsnErrorCode.SUCCESS)
            {
                MFT_ENUM_DATA mftEnumData = new MFT_ENUM_DATA();
                mftEnumData.StartFileReferenceNumber = 0;
                mftEnumData.LowUsn  = 0;
                mftEnumData.HighUsn = this.ntfsUsnJournalData.NextUsn;
                int    sizeMftEnumData = Marshal.SizeOf(mftEnumData);
                IntPtr ptrMftEnumData  = GetHeapGlobalPtr(sizeMftEnumData);
                Marshal.StructureToPtr(mftEnumData, ptrMftEnumData, true);
                int    ptrDataSize = sizeof(UInt64) + 10000;
                IntPtr ptrData     = GetHeapGlobalPtr(ptrDataSize);
                uint   outBytesCount;

                while (false != Win32Api.DeviceIoControl(
                           this.DriveRootHandle,
                           UsnControlCode.FSCTL_ENUM_USN_DATA,
                           ptrMftEnumData,
                           sizeMftEnumData,
                           ptrData,
                           ptrDataSize,
                           out outBytesCount,
                           IntPtr.Zero))
                {
                    // ptrData includes following struct:
                    //typedef struct
                    //{
                    //    USN             LastFileReferenceNumber;
                    //    USN_RECORD_V2   Record[1];
                    //} *PENUM_USN_DATA;

                    long   purvalue     = ptrData.ToInt64() + sizeof(long);
                    IntPtr ptrUsnRecord = new IntPtr(purvalue);

                    while (outBytesCount > 60)
                    {
                        var usnRecord = new USN_RECORD_V2(ptrUsnRecord);
                        result.Add(new UsnEntry(usnRecord));
                        ptrUsnRecord   = new IntPtr(ptrUsnRecord.ToInt64() + usnRecord.RecordLength);
                        outBytesCount -= usnRecord.RecordLength;
                    }
                    Marshal.WriteInt64(ptrMftEnumData, Marshal.ReadInt64(ptrData, 0));
                }

                Marshal.FreeHGlobal(ptrData);
                Marshal.FreeHGlobal(ptrMftEnumData);
            }

            return(result);
        }
Esempio n. 3
0
        public UsnJournalData GetUsnJournal()
        {
            UsnErrorCode usnErrorCode = this.QueryUSNJournal();

            UsnJournalData result = null;

            if (usnErrorCode == UsnErrorCode.SUCCESS)
            {
                result = new UsnJournalData(this.Drive, this.ntfsUsnJournalData);
            }

            return(result);
        }
Esempio n. 4
0
        public bool UsnIsExist(long usn)
        {
            bool         rs           = false;
            UsnErrorCode usnErrorCode = QueryUSNJournal();

            if (ntfsUsnJournalData.NextUsn < usn)
            {
                return(rs);
            }

            if (usnErrorCode == UsnErrorCode.SUCCESS)
            {
                MFT_ENUM_DATA mftEnumData = new MFT_ENUM_DATA();
                mftEnumData.StartFileReferenceNumber = 0;
                mftEnumData.LowUsn  = usn;
                mftEnumData.HighUsn = usn;
                int    sizeMftEnumData = Marshal.SizeOf(mftEnumData);
                IntPtr ptrMftEnumData  = GetHeapGlobalPtr(sizeMftEnumData);
                Marshal.StructureToPtr(mftEnumData, ptrMftEnumData, true);
                int    ptrDataSize = sizeof(UInt64) + 10000;
                IntPtr ptrData     = GetHeapGlobalPtr(ptrDataSize);
                uint   outBytesCount;

                while (false != Win32Api.DeviceIoControl(
                           this.DriveRootHandle,
                           UsnControlCode.FSCTL_ENUM_USN_DATA,
                           ptrMftEnumData,
                           sizeMftEnumData,
                           ptrData,
                           ptrDataSize,
                           out outBytesCount,
                           IntPtr.Zero))
                {
                    IntPtr ptrUsnRecord = new IntPtr(ptrData.ToInt32() + sizeof(Int64));

                    while (outBytesCount > 60)
                    {
                        var usnRecord = new USN_RECORD_V2(ptrUsnRecord);
                        ptrUsnRecord   = new IntPtr(ptrUsnRecord.ToInt32() + usnRecord.RecordLength);
                        outBytesCount -= usnRecord.RecordLength;
                        rs             = true;
                    }
                    Marshal.WriteInt64(ptrMftEnumData, Marshal.ReadInt64(ptrData, 0));
                }

                Marshal.FreeHGlobal(ptrData);
                Marshal.FreeHGlobal(ptrMftEnumData);
            }
            return(rs);
        }