pwsh/Get-PsDump.ps1
Set-Alias -Name psdump -Value Get-PsDump function Get-PsDump { [CmdletBinding()]param($PSBoundParameters) DynamicParam { New-DynParameter (@{ Name = 'DumpType' Type = [String] Value = 'MiniDump' ValidateSet = ('MiniDump', 'FullDump') ValidateNotNullOrEmpty = $true }, @{ Name = 'SavePath' Type = [String] Value = $pwd.Path ValidateScript = {Test-Path $_} ValidateNotNullOrEmpty = $true }) } process { New-Delegate kernel32 { ptr LoadLibraryW([buf]) bool FreeLibrary([ptr]) } if (($dll = $kernel32.LoadLibraryW.Invoke( [buf].Uni('dbghelp.dll') )) -eq [IntPtr]::Zero) { Write-Verbose 'can not load dbghelp.dll library.' return } New-Delegate dbghelp { bool MiniDumpWriteDump([ptr, uint, sfh, uint, ptr, ptr, ptr]) } $numeric = (6, 261)[$paramDumpType.Value -eq 'MiniDump'] New-PsProxy $PSBoundParameters -Callback { $dmp = "$(Resolve-Path $paramSavePath.Value)\$($_.Name)_$($_.Id).dmp" try { $fs = [IO.File]::Create($dmp) if (!$dbghelp.MiniDumpWriteDump.Invoke( $_.Handle, $_.Id, $fs.SafeFileHandle, $numeric, [IntPtr]::Zero, [IntPtr]::Zero, [IntPtr]::Zero )) { $err = $true throw [InvalidOperationException]::new("Dumping failure PID: $($_.Id)") } } catch { Write-Verbose $_ } finally { if ($fs) { $fs.Dispose() } if ($err) { Remove-Item $dmp -Force } } } if (!$kernel32.FreeLibrary.Invoke($dll)) { Write-Verbose 'can not release dbghelp.dll library.' } } } Export-ModuleMember -Alias psdump -Function Get-PsDump |