VMSyntheticKernelDebugging.psm1

#Requires -Modules Hyper-V
#Requires -Modules CimCmdlets

New-Variable -Option Constant -Name DEPRECATION_WARNING -Value "This module is deprecated and. Please use the 'Hyper-V.Tools' module instead."

Write-Warning $DEPRECATION_WARNING

Function Modify-SystemSettings {
    [Diagnostics.CodeAnalysis.SuppressMessage('PSUseApprovedVerbs', '', Justification='Internal function')]
    [CmdletBinding(PositionalBinding=$false)]
    Param (
        [Parameter(Mandatory = $true)]
        $VMData
    )
    
    $CIMSerializer = [Microsoft.Management.Infrastructure.Serialization.CimSerializer]::Create()
    $VMDataSerialized = $CIMSerializer.Serialize($VMData, [Microsoft.Management.Infrastructure.Serialization.InstanceSerializationOptions]::None)
    $VMDataXML = [System.Text.Encoding]::Unicode.GetString($VMDataSerialized)

    $MgmtSvc = Get-CimInstance -Class "Msvm_VirtualSystemManagementService" `
                            -Namespace "root\virtualization\v2"

    Invoke-CimMethod -CimInstance $MgmtSvc -MethodName ModifySystemSettings @{SystemSettings = $VMDataXML} | Out-Null
}

Function Get-VMData {
    [CmdletBinding(PositionalBinding=$false)]
    Param (
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [Microsoft.HyperV.PowerShell.VirtualMachine]$VM
    )
    
    $VMData = Get-CimInstance -Namespace "root\virtualization\v2" `
                        -Class Msvm_VirtualSystemSettingData `
        | Where-Object -Property ConfigurationID -EQ $VM.Id
    
    Return $VMData
}

Function Enable-VMSyntheticKernelDebugging {
    [CmdletBinding(PositionalBinding=$false)]
    Param (
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [Microsoft.HyperV.PowerShell.VirtualMachine]$VM,
        [Parameter(Mandatory = $true)]
        [ValidateRange(49152, 65535)]
        [Int]$DebugPort
    )
    Begin {
        Write-Warning $DEPRECATION_WARNING
    }
    Process {
        $VMData = Get-VMData -VM $VM

        $VMData.DebugPort = $DebugPort
        $VMData.DebugPortEnabled = 1

        Modify-SystemSettings -VMData $VMData

        Return $VM
    }
}

Function Disable-VMSyntheticKernelDebugging {
    [CmdletBinding(PositionalBinding=$false)]
    Param (
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [Microsoft.HyperV.PowerShell.VirtualMachine]$VM
    )
    Begin {
        Write-Warning $DEPRECATION_WARNING
    }
    Process {
        $VMData = Get-VMData -VM $VM

        $VMData.DebugPortEnabled = 0

        Modify-SystemSettings -VMData $VMData

        Return $VM
    }
}

Function Get-VMSyntheticKernelDebugging {
    [CmdletBinding(PositionalBinding=$false)]
    Param (
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [Microsoft.HyperV.PowerShell.VirtualMachine]$VM
    )
    Begin {
        Write-Warning $DEPRECATION_WARNING
    }
    Process {
        $VMData = Get-VMData -VM $VM
        
        $Result = [PSCustomObject]@{
            "VM" = $VM;
            "Name" = $VM.Name;
            "DebugPortEnabled" = $VMData.DebugPortEnabled;
            "DebugPort" = $VMData.DebugPort
        }

        $DefaultDisplaySet = "Name", "DebugPortEnabled", "DebugPort"
        $DefaultDisplayPropertySet = New-Object System.Management.Automation.PSPropertySet('DefaultDisplayPropertySet',[string[]]$DefaultDisplaySet)
        $PSStandardMembers = [System.Management.Automation.PSMemberInfo[]]@($DefaultDisplayPropertySet)
        $Result | Add-Member MemberSet PSStandardMembers $PSStandardMembers

        Return $Result
    }
}