如何在 Window 上用 C++ 实现 cd 命令
Posted
技术标签:
【中文标题】如何在 Window 上用 C++ 实现 cd 命令【英文标题】:How to implement the cd command in C++ on Window 【发布时间】:2020-08-26 11:00:34 【问题描述】:是否可以从 Windows 上的 C++ 程序内部更改调用 CMD 控制台中的目录?
我知道有很多方法可以在程序范围内更改工作目录,例如使用_chdir()
,但我希望在程序退出时保留目录更改。
我希望行为类似于:
C:\Some\Path>MyProgram.exe
C:\Some\Other\Path>
(类似于在控制台中调用cd
)
一种解决方案是将程序包装在.bat
文件中,然后将程序的输出用作cd
命令的输入。但是,如果没有必要,我想这样做。
【问题讨论】:
是this 你在找什么? 我认为你不能改变父进程的当前目录 @AryanParekh 您的建议只会更改被调用程序的工作目录,而不是父进程。 如果你使用CALL "MyProgram.exe"
会发生什么?
@lit 什么都没有发生,程序的工作目录被改变了,而不是命令提示符内的工作目录
【参考方案1】:
好吧,我还没有检查,但我很确定你可以在父进程中使用CreateRemoteThread 执行SetCurrentDirectoryW。
SetCurrentDirectory
匹配 lpStartAddress
签名,因此应该可以在父进程内存空间中分配具有新目录路径的 z 终止字符串,并将此字符串作为lpParameter
传递给CreateRemoteThread
。诀窍是在父进程中获取SetCurrentDirectory
的地址。您应该枚举父进程模块,并使用Kernel32.dll
的基地址计算SetCurrentDirectory
函数的正确偏移量。
要分配字符串,您应该使用VirtualAllocEx,并使用WriteProcessMemory 将值写入分配的内存。当远程线程完成后,您应该使用VirtualFreeEx
释放内存。
你确定批处理不是更简单的解决方案吗?
【讨论】:
我不确定 cmd.exe 窗口是否会意识到显示它的更改。您可能还需要注入一个命令来更新。 我很确定 cmd.exe 不会以某种诡计的方式维护 CWD,因此它应该在可执行文件(用 CD 完成了这个技巧)完成后更新提示。 我知道这个问题被标记为 CMD,但是当 CMD 是外壳而不是控制台或终端时,看到 OP 使用了混淆的短语“CMD 控制台”,应该强调这种技术不不一定适用于可以在控制台或终端中使用的其他 shell。特别是它不适用于 PowerShell,它在驱动器提供程序(例如注册表)方面具有更高级别的工作“目录”概念,并且 - 我上次检查过 - 忽略了进程级文件系统工作目录。 问题中有一条注释wrap the program in a .bat file
。这证实了我 cmd.exe 的性质。但是,是的,该解决方案不适用于 powershell 或 bash,因为 CD 维护完全不同。以上是关于如何在 Window 上用 C++ 实现 cd 命令的主要内容,如果未能解决你的问题,请参考以下文章