gpt4 book ai didi

.net - 获取cmd.exe的当前工作目录

转载 作者:行者123 更新时间:2023-12-02 04:53:15 26 4
gpt4 key购买 nike

如何检索 cmd.exe 的当前工作目录?

这似乎是可能的。例如,使用 ProcessExplorer,选择 CMD.exe,右键单击,属性,图像选项卡,“当前目录”代表使用 CD 或 CHDIR 命令设置的目录。

我查看了 .NET Process 和 ProcessStartInfo 类(ProcessStartInfo.WorkingDirectory 始终返回“”),但似乎找不到确定这一点的方法。 PInvoke 没有任何内容也很突出。

作为一个例子,我希望能够以编程方式说出类似的内容: Process.GetCurrentWorkingDirectory(processID) 其中 processID 是另一个正在运行的进程的 Windows 进程 ID。

有什么解决方案吗,WinAPI 还是.NET?

[更新]

问这个问题的原因:

我已经使用“命令提示符资源管理器栏”一段时间了,它很棒,除非我“CD”到新目录,当前资源管理器窗口也不会改变。 (即同步只是从资源管理器到命令提示符的一种方式)。我正在寻找两种方法。

最佳答案

未经测试,一种可能的方法:

使用 DllMain 创建一个 DLL,该 DllMain 使用 GetThreadStartInformation() 查找缓冲区的地址,然后使用 GetCurrentDirectory 填充它。这应该没问题,因为这两个函数都在 kernel32 中,而 kernel32 始终存在。您需要有一些结构来返回成功/失败。

  1. 获取 cmd.exe 进程的句柄。
  2. 在那里分配一些内存(VirtualAllocEx)
  3. 将 DLL 的路径放入内存中。 (写入进程内存)
  4. 将 dll 加载到 cmd.exe 地址空间中。 (CreateRemoteThread,入口点为LoadLibrary,参数是您之前分配的内存。)
  5. WaitForSingleObject 后接 GetExitCodeThread(),为您提供 cmd.exe 进程中 DLL 的 HMODULE。
  6. ReadProcessMemory 获取当前目录。
  7. 从 cmd.exe 地址空间卸载 dll。 CreateRemote Thread,入口点为 FreeLibrary,参数为 HMODULE。
  8. WaitForSingleObject 等待 DLL 卸载。

粗略的草图:细节留作练习!风险:在 cmd.exe 地址空间中分配内存,更改其状态。必须小心 DllMain 中调用的函数。

关于.net - 获取cmd.exe的当前工作目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/217951/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com