unsafe private void SetupMFT_Enum_DataBuffer(ref IntPtr medBuffer, IntPtr changeJournalRootHandle) { uint bytesReturned = 0; WinApi.USN_JOURNAL_DATA ujd = new WinApi.USN_JOURNAL_DATA(); bool bOk = WinApi.DeviceIoControl( changeJournalRootHandle, // Handle to drive WinApi.FSCTL_QUERY_USN_JOURNAL, // IO Control Code IntPtr.Zero, // In Buffer 0, // In Buffer Size out ujd, // Out Buffer sizeof(WinApi.USN_JOURNAL_DATA), // Size Of Out Buffer out bytesReturned, // Bytes Returned IntPtr.Zero // lpOverlapped ); if (bOk) { WinApi.MFT_ENUM_DATA med; med.StartFileReferenceNumber = 0; med.LowUsn = 0; med.HighUsn = ujd.NextUsn; int sizeMftEnumData = Marshal.SizeOf(med); medBuffer = Marshal.AllocHGlobal(sizeMftEnumData); WinApi.ZeroMemory(medBuffer, sizeMftEnumData); Marshal.StructureToPtr(med, medBuffer, true); } else { throw new IOException("DeviceIoControl() returned false", new Win32Exception(Marshal.GetLastWin32Error())); } }
private unsafe void SetupMFT_Enum_DataBuffer(ref IntPtr medBuffer, IntPtr changeJournalRootHandle) { uint bytesReturned = 0; WinApi.USN_JOURNAL_DATA ujd = new WinApi.USN_JOURNAL_DATA (); bool bOk = WinApi.DeviceIoControl ( changeJournalRootHandle, // Handle to drive WinApi.FSCTL_QUERY_USN_JOURNAL, // IO Control Code IntPtr.Zero, // In Buffer 0, // In Buffer Size out ujd, // Out Buffer sizeof(WinApi.USN_JOURNAL_DATA), // Size Of Out Buffer out bytesReturned, // Bytes Returned IntPtr.Zero // lpOverlapped ); if (bOk) { WinApi.MFT_ENUM_DATA med; med.StartFileReferenceNumber = 0; med.LowUsn = 0; med.HighUsn = ujd.NextUsn; int sizeMftEnumData = Marshal.SizeOf (med); medBuffer = Marshal.AllocHGlobal (sizeMftEnumData); WinApi.ZeroMemory (medBuffer, sizeMftEnumData); Marshal.StructureToPtr (med, medBuffer, true); } else { throw new IOException ("DeviceIoControl() returned false", new Win32Exception (Marshal.GetLastWin32Error ())); } }