modules/VMKernelDebugging.psm1

Set-StrictMode -Version "Latest"


class VMKernelDebuggingInfo {
    hidden [HyperV.Tools.VM]    $VM_
    hidden [bool]               $debug_port_enabled_
    hidden [uint16]             $debug_port_

    hidden VMKernelDebuggingInfo([HyperV.Tools.VM]  $VM_,
                                 [bool]             $debug_port_enabled_,
                                 [uint16]           $debug_port_) {
        $this.VM_                   = $VM_
        $this.debug_port_enabled_   = $debug_port_enabled_
        $this.debug_port_           = $debug_port_
    }
}


function Enable-VMKernelDebugging {
    [OutputType([VMKernelDebuggingInfo])]
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [HyperV.Tools.VM]
        [Alias("VM")]
            $InputObject,
        [ValidateRange(49152, 65535)]
        [int]
            $DebugPort
    )
    process {
        $VM = $InputObject

        $VM_settings = Get-VMSettings -VM $VM

        # if DebugPort is present set it
        if ((is_null_or_zero($DebugPort)) -eq $false) {
            $VM_settings.DebugPort = $DebugPort
        } else {
            # if DebugPort is missing, that's an error only if there's no value already set
            if (is_null_or_zero($VM_settings.DebugPort)) {
                throw "DebugPort must be specified if it is not already set on the VM ($VM)."
            }
        }

        # if we didn't throw by now, enable kernel debug port
        $VM_settings.DebugPortEnabled = 1

        Set-VMSettings -VMSettings $VM_settings

        return (Get-VMKernelDebugging -VM $VM)
    }
}


Function Disable-VMKernelDebugging {
    [OutputType([VMKernelDebuggingInfo])]
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [HyperV.Tools.VM]
        [Alias("VM")]
            $InputObject
    )
    process {
        $VM = $InputObject

        $VM_settings = Get-VMSettings -VM $VM

        $VM_settings.DebugPortEnabled = 0

        Set-VMSettings -VMSettings $VM_settings

        return (Get-VMKernelDebugging -VM $VM)
    }
}

function Get-VMKernelDebugging {
    [OutputType([VMKernelDebuggingInfo])]
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [HyperV.Tools.VM]
        [Alias("VM")]
            $InputObject
    )
    process {
        $VM = $InputObject

        $VM_settings = Get-VMSettings -VM $VM

        $result = [VMKernelDebuggingInfo]::new($VM, $VM_settings.DebugPortEnabled, $VM_settings.DebugPort)

        return $result
    }
}


function is_null_or_zero($p) {
    if (($null -eq $p) -or (0 -eq $p)) {
        return $true
    } else {
        return $false
    }
}