c++ - 如何在 Windows 上获取进程工作目录?

标签 c++ windows winapi

如何使用 native API 在 Windows 上获取进程工作目录(对于使用进程句柄或 PID 的另一个进程)?我看过Process and Thread Functions , PSAPI Functions并没有找到。也许是 WMI?

此外,关于这些主题,PSAPI进程和线程函数 有何关系?它过时了吗?

最佳答案

为此,您需要比 PSAPI 更重的火炮。以下是操作方法(假定为 x86,省略了错误处理):

ProcessBasicInformation     pbi ;
RTL_USER_PROCESS_PARAMETERS upp ;
PEB   peb ;
DWORD len ;

HANDLE handle = OpenProcess (PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid) ;

NtQueryInformationProcess (handle, 0 /*ProcessBasicInformation*/, &pbi,
    sizeof (ProcessBasicInformation), &len) ;

ReadProcessMemory (handle, pbi.PebBaseAddress,    &peb, sizeof (PEB), &len) ;
ReadProcessMemory (handle, peb.ProcessParameters, &upp, sizeof (RTL_USER_PROCESS_PARAMETERS), &len) ;

WCHAR path = new WCHAR[upp.CurrentDirectoryPath.Length / 2 + 1] ;

ReadProcessMemory (handle, upp.CurrentDirectoryPath.Buffer, path, upp.CurrentDirectoryPath.Length, &len) ;

// null-terminate
path[upp.CurrentDirectoryPath.Length / 2] = 0 ;

请注意,除非进程被挂起,否则此方法包含竞争。

关于c++ - 如何在 Windows 上获取进程工作目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14018280/

相关文章:

c++ - wchar_t 是否保证与任何整数类型不同?

python - 用户文件夹 VBA 引用位置(对于 xlwings)

linux - 错误 : "linker ' cc' not found"when cross compiling a rust project from windows to linux using cargo

c++ - 对 imp_getaddrinfo 的 undefined reference

C++在控制台中移动光标

c++ - Cpp 中的构造函数和变量声明

c++ - 除了生成证书和 key 之外,openssl 是否需要熵用于其他目的?

c++ - 部署不起作用且可执行扩展

windows - 'Pretty print' windows %PATH% variable - 如何在 CMD shell 中拆分 ';'

winapi - 将 COM 变体序列化为 BLOB 或 IStream