在一个标准的 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 回编译,得到可执行文件。
然而我这木耳并没有听出有什么不同,除了爆音变多了