解决Windows Terminal文件拖放路径问题
解决Windows Terminal文件拖放路径问题
背景
在Windows Terminal中运行cygwin,wsl2的shell,拖放文件后路径不能自动转换。官方也有人提了很多相关的issue,两年过去,官方并没有改进。
issue: Feature Request: Path translation in WSL and Git Bash
issue: Drag/Drop into Ubuntu shell pastes wrong path format
……

解决方法
Windows Terminal是开源的,自行修改代码添加相应功能然后重新编译即可。
但需要下载安装体积庞大的VS2019。

我只安装了C++的开发环境,并不想安装.NET等一堆用不上的东西。
于是我尝试使用Hook的方式来实现文件路径修正。
初略的看了下源码,定位到了这里:

理论上Hook函数DragQueryFile,修改它的返回值就行了。
但实际上没任何效果,这个是OpenConsole.exe的源码,Hook后并不起作用。
仔细翻了翻源码后定位到另一处关键代码:

item.Path()是调用windows.storage.dll中的API。
Windows Terminal是UWP应用,调用的是UWP API。
动态调试后确定此处就是拖动文件后的消息处理函数,于是使用inline hook,添加路径转换。
Visual Studio中不支持x64的内联汇编,我只好通过x64dbg写好汇编代码拷贝出shellcode,然后写一个dll将拷贝的shellcode复制到目标地址。
Hook前:

Hook后:


效果:
