TracePeek.psm1

$ErrorActionPreference = "Stop"
Set-StrictMode -Version Latest

Add-Type -Path (Join-Path $psscriptRoot 'TracePeek.dll') -ErrorAction Stop

function New-TracePeekController
{
    param(
        [Parameter(Mandatory=$true)]
        [string]$SessionName
    )
    New-Object -TypeName TracePeek.TracePeekController -ArgumentList $SessionName
}

function Start-TracePeek
{
    [CmdletBinding(PositionalBinding=$true)]
    param(
        [Parameter(Mandatory=$true)]
        [string[]]$Providers,
        [TracePeek.TracePeekProjectionStyle]$ProjectionStyle,
        [string]$SessionName = "TracePeek_DefaultSessionName"
    )
    $tpc = New-TracePeekController -SessionName $SessionName
    
    $providersList = New-Object -TypeName System.Collections.Generic.List`[string]
    foreach($provider in $providers){
        $providersList.Add($provider)
    }
    $tpc.EnableProviders($providersList)
    $eventSubscriberJob = Register-ObjectEvent -InputObject $tpc -EventName OnTracePeekEvent -SourceIdentifier $SessionName
    Write-Host "TracePeek starting up..."
    if($null -eq $ProjectionStyle){$null = $tpc.StartPeek()}
    else{$null = $tpc.StartPeek($ProjectionStyle)}
    Write-Host "TracePeek running."
    Write-Host '!!! Press ALT+s when done to stop session and clean up resources !!!'
    $consoleCancellationRequested = $false
    while($consoleCancellationRequested -eq $false)
    {
        Wait-Event -SourceIdentifier $SessionName -Timeout 1 -ErrorAction SilentlyContinue |
        ForEach-Object{ Write-Output $_.SourceArgs[0] ; Remove-Event -EventIdentifier $_.EventIdentifier}
        while([Console]::KeyAvailable)
        {
            $keyPress = [Console]::ReadKey($true)
            if ($keyPress.Modifiers.HasFlag([System.ConsoleModifiers]::Alt) -and $keyPress.KeyChar -eq 's')
            {
                Write-Host "TracePeek stopping and cleaning up."
                $consoleCancellationRequested = $true
                $tpc.StopPeek()
            }
        }
    }
    Unregister-Event -SourceIdentifier $SessionName
    if($null -ne $eventSubscriberJob){Remove-Job -Id $eventSubscriberJob.Id -Force}
}