private unsafe void GetUSN() { uint bytesReturned = 0; mUSN = new PInvokeWin32.USN_JOURNAL_DATA(); bool retOK = PInvokeWin32.DeviceIoControl(mDriveHandle, PInvokeWin32.FSCTL_QUERY_USN_JOURNAL, IntPtr.Zero, 0, out mUSN, sizeof(PInvokeWin32.USN_JOURNAL_DATA), // Size Of Out Buffer out bytesReturned, // Bytes Returned IntPtr.Zero); // mUSN.UsnJournalID the id of usn journal if (!retOK) { throw new IOException("DeviceIoControl() returned false", new Win32Exception(Marshal.GetLastWin32Error())); } }
public PInvokeWin32.USN_JOURNAL_DATA Query() { PInvokeWin32.USN_JOURNAL_DATA ujd = new PInvokeWin32.USN_JOURNAL_DATA(); uint bytesReturned = 0; var bOk = PInvokeWin32.DeviceIoControl(ChangeJournalRootHandle, // Handle to drive PInvokeWin32.FSCTL_QUERY_USN_JOURNAL, // IO Control Code IntPtr.Zero, // In Buffer 0, // In Buffer Size out ujd, // Out Buffer PInvokeWin32.SizeOf_USN_JOURNAL_DATA, // Size Of Out Buffer out bytesReturned, // Bytes Returned IntPtr.Zero); // lpOverlapped if (!bOk) { throw new Win32Exception(Marshal.GetLastWin32Error()); } return ujd; }
unsafe private void SetupMFT_Enum_DataBuffer(ref IntPtr medBuffer) { uint bytesReturned = 0; ujd = new PInvokeWin32.USN_JOURNAL_DATA(); bool bOk = PInvokeWin32.DeviceIoControl(_changeJournalRootHandle, // Handle to drive PInvokeWin32.FSCTL_QUERY_USN_JOURNAL, // IO Control Code IntPtr.Zero, // In Buffer 0, // In Buffer Size out ujd, // Out Buffer sizeof(PInvokeWin32.USN_JOURNAL_DATA), // Size Of Out Buffer out bytesReturned, // Bytes Returned IntPtr.Zero); // lpOverlapped if (bOk) { PInvokeWin32.MFT_ENUM_DATA med; med.StartFileReferenceNumber = 0; med.LowUsn = 0; med.HighUsn = ujd.NextUsn; int sizeMftEnumData = Marshal.SizeOf(med); medBuffer = Marshal.AllocHGlobal(sizeMftEnumData); PInvokeWin32.ZeroMemory(medBuffer, sizeMftEnumData); Marshal.StructureToPtr(med, medBuffer, true); } else { throw new IOException("DeviceIoControl() returned false", new Win32Exception(Marshal.GetLastWin32Error())); } }