Scripts/Remove-UsnJournal.ps1

Function Remove-UsnJournal {
    [cmdletbinding(
        SupportsShouldProcess = $True
    )]
    Param (
        [parameter()]
        [ValidateScript({
            If ($_ -notmatch '^\w:$') {
                Throw "$($_) must match this format: C:"
            } Else {$True}
        })]
        [string]$DriveLetter = 'C:'
    )
    [uint32]$AvailableBytes = 0
    $JournalID = Get-UsnJournal | Select -ExpandProperty UsnJournalID

    #Create Structure
    $DELETE_USN_JOURNAL_DATA = New-Object DELETE_USN_JOURNAL_DATA
    $DELETE_USN_JOURNAL_DATA.UsnJournalID = $JournalID
    $DELETE_USN_JOURNAL_DATA.DeleteFlags = [UsnJournalDeleteFlags]::'USN_DELETE_FLAG_DELETE'

    #Allocate buffers
    $DUJD_Size = [System.Runtime.InteropServices.Marshal]::SizeOf($DELETE_USN_JOURNAL_DATA)
    $DUJD_Buffer = [System.Runtime.InteropServices.Marshal]::AllocHGlobal($DUJD_Size)
    [PoshChJournal]::ZeroMemory($DUJD_Buffer, $DUJD_Size)
    [void][System.Runtime.InteropServices.Marshal]::StructureToPtr($DELETE_USN_JOURNAL_DATA, $DUJD_Buffer, $True)

    If ($PSCmdlet.ShouldProcess($JournalID, 'Remove Usn Journal')) {
        $VolumeHandle = OpenUSNJournal -DriveLetter $DriveLetter
        $Return = [PoshChJournal]::DeviceIoControl(
            $VolumeHandle,
            [EIOControlCode]::FSCTL_DELETE_USN_JOURNAL,
            $DUJD_Buffer,
            $DUJD_Size,
            [intptr]::Zero,
            0,
            [ref]$AvailableBytes,
            [intptr]::Zero
        )
        If (-Not $Return) {
            Write-Warning "Could not remove Usn Journal on $($DriveLetter)"
        }        
    }
    #Cleanup
    [System.Runtime.InteropServices.Marshal]::FreeHGlobal($DUJD_Buffer)
}