解决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
……

GIF1

解决方法

Windows Terminal是开源的,自行修改代码添加相应功能然后重新编译即可。

但需要下载安装体积庞大的VS2019。

image-20220308224517542

我只安装了C++的开发环境,并不想安装.NET等一堆用不上的东西。

于是我尝试使用Hook的方式来实现文件路径修正。

初略的看了下源码,定位到了这里:

https://github.com/microsoft/terminal/blob/d09fdd61cbb11b7ef2ccdd4820349ffe898ad583/src/interactivity/win32/windowproc.cpp#L858

image-20220308224538767

理论上Hook函数DragQueryFile,修改它的返回值就行了。

但实际上没任何效果,这个是OpenConsole.exe的源码,Hook后并不起作用。

仔细翻了翻源码后定位到另一处关键代码:

https://github.com/microsoft/terminal/blob/8276b549e860ee5059e2e3625b9f074d1feab6da/src/cascadia/TerminalControl/TermControl.cpp#L3080

image-20210413152001965

item.Path()是调用windows.storage.dll中的API。

Windows Terminal是UWP应用,调用的是UWP API。

动态调试后确定此处就是拖动文件后的消息处理函数,于是使用inline hook,添加路径转换。

Visual Studio中不支持x64的内联汇编,我只好通过x64dbg写好汇编代码拷贝出shellcode,然后写一个dll将拷贝的shellcode复制到目标地址。

Hook前:

image-20220308224642036

Hook后:

image-20220308224706261

image-20220308224728981

效果:

![GIF2](https://static-1256168285.cos.ap-chengdu.myqcloud.com/GIF 2020-12-31 15-43-22.gif)