现在有很多比 Windows 资源管理器功能强大的资源管理程序,如 Total Commander、xplorer2 和 Ultra Explorer 等等。于是乎,我们就会有了一个新的需求——在使用系统热键 Win + E 的时候能呼出我们自定义的资源管理程序,而不是默认的 Windows 资源管理器。但是,我一直没有找到一个合适的辅助工具来实现这个功能,网上大多的热键工具不是无法替换默认的 Win + E,就是不够完美——例如键入后仍会弹出资源管理器,或弹出开始菜单,甚至有时候会导致 explorer.exe 崩溃退出。
于是我决定自己实现这一功能,最初我选择了键盘钩子,但我发现钩子虽然能捕获到这个热键,但是并不能对这个热键的处理进行重新定向,除我的程序之外,系统仍然会收到这个消息。当然,这样就可以解释为什么大多能够拦截 Win + E 的热键工具不够完美的原因了。
于是我决定使用更猥琐的方法,从 explorer.exe 的内部开始探究。
我的切入点是弹出的资源管理器窗口,既然这个窗口是新建的,那么必然会经过 CreateWindow,于是我选择了 NtUserCreateWindowEx 作为我的断点:
bp USER32!NtUserCreateWindowEx
接下来按下 Win + E,断点如约命中。检查其堆栈,发现:
ChildEBP RetAddr
01c1f3cc 77d2e442 USER32!NtUserCreateWindowEx
01c1f478 77d2d0d6 USER32!_CreateWindowEx+0x1ed
01c1f4b4 77f596af USER32!CreateWin