public bool CreateUsnJournal(UInt64 maximumSize = 0x10000000, UInt64 allocationDelta = 0x100000) { uint bytesReturnedCount; var createUsnJournalData = new CREATE_USN_JOURNAL_DATA(); createUsnJournalData.MaximumSize = maximumSize; createUsnJournalData.AllocationDelta = allocationDelta; int sizeCujd = Marshal.SizeOf(createUsnJournalData); IntPtr cujdBuffer = GetHeapGlobalPtr(sizeCujd); Marshal.StructureToPtr(createUsnJournalData, cujdBuffer, true); bool isSuccess = Win32Api.DeviceIoControl( this.DriveRootHandle, UsnControlCode.FSCTL_CREATE_USN_JOURNAL, cujdBuffer, sizeCujd, IntPtr.Zero, 0, out bytesReturnedCount, IntPtr.Zero); Marshal.FreeHGlobal(cujdBuffer); return(isSuccess); }
public void Create(long maximumSize, long allocationDelta) { var creationData = new CREATE_USN_JOURNAL_DATA { AllocationDelta = allocationDelta, MaximumSize = maximumSize, }; Win32DeviceControl.ControlWithInput(ChangeJournalHandle, Win32ControlCode.CreateUsnJournal, ref creationData, 0); ReadJournalData(); }
/// <summary> /// CreateUsnJournal() creates a USN journal on the volume. If a journal already exists this function /// will adjust the MaximumSize and AllocationDelta parameters of the journal if the requested size /// is larger. /// </summary> /// <param name="maxSize">maximum size requested for the UsnJournal</param> /// <param name="allocationDelta">when space runs out, the amount of additional /// space to allocate</param> /// <returns>a UsnJournalReturnCode /// USN_JOURNAL_SUCCESS CreateUsnJournal() function succeeded. /// VOLUME_NOT_NTFS volume is not an NTFS volume. /// INVALID_HANDLE_VALUE NtfsUsnJournal object failed initialization. /// USN_JOURNAL_NOT_ACTIVE USN journal is not active on volume. /// ERROR_ACCESS_DENIED accessing the USN journal requires admin rights, see remarks. /// ERROR_INVALID_FUNCTION error generated by DeviceIoControl() call. /// ERROR_FILE_NOT_FOUND error generated by DeviceIoControl() call. /// ERROR_PATH_NOT_FOUND error generated by DeviceIoControl() call. /// ERROR_TOO_MANY_OPEN_FILES error generated by DeviceIoControl() call. /// ERROR_INVALID_HANDLE error generated by DeviceIoControl() call. /// ERROR_INVALID_DATA error generated by DeviceIoControl() call. /// ERROR_NOT_SUPPORTED error generated by DeviceIoControl() call. /// ERROR_INVALID_PARAMETER error generated by DeviceIoControl() call. /// ERROR_JOURNAL_DELETE_IN_PROGRESS USN journal delete is in progress. /// ERROR_INVALID_USER_BUFFER error generated by DeviceIoControl() call. /// USN_JOURNAL_ERROR unspecified USN journal error. /// </returns> /// <remarks> /// If function returns ERROR_ACCESS_DENIED you need to run application as an Administrator. /// </remarks> public int CreateUsnJournal(ulong maxSize, ulong allocationDelta) { var lastError = (int)UsnJournalReturnCode.VOLUME_NOT_NTFS; if (_isNtfsVolume) { if (_usnJournalRootHandle.ToInt64() != Win32Api.INVALID_HANDLE_VALUE) { lastError = (int)UsnJournalReturnCode.USN_JOURNAL_SUCCESS; var cujd = new CREATE_USN_JOURNAL_DATA { MaximumSize = maxSize, AllocationDelta = allocationDelta }; var sizeCujd = Marshal.SizeOf(cujd); var cujdBuffer = Marshal.AllocHGlobal(sizeCujd); Win32Api.ZeroMemory(cujdBuffer, sizeCujd); Marshal.StructureToPtr(cujd, cujdBuffer, true); var fOk = Win32Api.DeviceIoControl( _usnJournalRootHandle, Win32Api.FSCTL_CREATE_USN_JOURNAL, cujdBuffer, sizeCujd, IntPtr.Zero, 0, out _, IntPtr.Zero); if (!fOk) { lastError = Marshal.GetLastWin32Error(); } Marshal.FreeHGlobal(cujdBuffer); } else { lastError = (int)UsnJournalReturnCode.INVALID_HANDLE_VALUE; } } return(lastError); }