为 Hyper-V 增强会话模式启用无损音频

在一个标准的 RDP 会话中,我们可以通过向 .rdp 文件加入 audioqualitymode:i:2 来启用无损音频以在一般网络环境中听到更多爆音。但是 vmconnect 并没有提供这个选项。
那怎么办?不要怂,就是干!

首先我们来反编译一下代码,在 Microsoft.Virtualization.Client.InteractiveSession.ConnectCallback(Microsoft.Virtualization.Client.Management.IVMComputerSystem, bool) 中发现了以下代码:

this.m_RdpClient.AdvancedSettings8.RedirectSmartCards = this.m_RdpOptions.SmartCardsRedirection;
this.m_RdpClient.AdvancedSettings8.RedirectPrinters = this.m_RdpOptions.PrinterRedirection;
this.m_RdpClient.AdvancedSettings8.RedirectClipboard = this.m_RdpOptions.ClipboardRedirection;
this.m_RdpClient.AdvancedSettings8.AudioRedirectionMode = (uint) this.m_RdpOptions.AudioPlaybackRedirectionMode;
this.m_RdpClient.AdvancedSettings8.AudioCaptureRedirectionMode = this.m_RdpOptions.AudioCaptureRedirectionMode;
((IMsRdpClientNonScriptable5) this.m_RdpClient.GetOcx()).UseMultimon = this.m_RdpOptions.UseAllMonitors;

RdpClient 类是在 Microsoft.Virtualization.Client.RdpClientAxHost.dll 中定义的。
查看发现 RdpClient.AdvancedSettings8 中正好有我们需要的 AudioQualityMode 属性。

接下来就很简单了,直接加上一句

this.m_RdpClient.AdvancedSettings8.AudioQualityMode = 2;

就能达到我们的目的。但是由于反编译代码不一定能直接再次编译,这里选择直接修改 MSIL 字节码。

打开随 Visual Studio 附带的 IL DASM 程序,把 vmconnect.exe 拖进去,选择 File/Dump,使用默认设置反编译出 IL 文件。(注:这一步会在同一目录下生成多个文件)
然后用适当的编辑器打开 vmconnect.il,查找 IMsRdpClientAdvancedSettings7::set_AudioCaptureRedirectionMode,并在下一行加入

IL_0368:  callvirt   instance bool [Microsoft.Virtualization.Client]Microsoft.Virtualization.Client.RdpOptions::get_AudioCaptureRedirectionMode()
IL_036d:  callvirt   instance void [Microsoft.Virtualization.Client.RdpClientInterop]Microsoft.Virtualization.Client.Interop.IMsRdpClientAdvancedSettings7::set_AudioCaptureRedirectionMode(bool)
          ldarg.0      
          ldfld      class Microsoft.Virtualization.Client.InteractiveSession.RdpClient Microsoft.Virtualization.Client.InteractiveSession.RdpViewerControl::m_RdpClient
          callvirt   instance class [Microsoft.Virtualization.Client.RdpClientInterop]Microsoft.Virtualization.Client.Interop.IMsRdpClientAdvancedSettings7 [Microsoft.Virtualization.Client.RdpClientAxHost]AxMicrosoft.Virtualization.Client.Interop.AxMsRdpClient8NotSafeForScripting::get_AdvancedSettings8()
          ldc.i4.2     
          callvirt   instance void [Microsoft.Virtualization.Client.RdpClientInterop]Microsoft.Virtualization.Client.Interop.IMsRdpClientAdvancedSettings7::set_AudioQualityMode(uint32)  
IL_0372:  ldarg.0
IL_0373:  ldfld      class Microsoft.Virtualization.Client.InteractiveSession.RdpClient Microsoft.Virtualization.Client.InteractiveSession.RdpViewerControl::m_RdpClient

然后保存修改,使用 ilasm 回编译,得到可执行文件。

然而我这木耳并没有听出有什么不同,除了爆音变多了

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据