gpt4 book ai didi

c++ - 如何将 native (NT) 路径名转换为 Win32 路径名?

转载 作者:可可西里 更新时间:2023-11-01 13:18:13 32 4
gpt4 key购买 nike

我正在报告从 native 系统 API 收集的一些信息。 (我知道这很糟糕......但我得到了我无法通过其他方式获得的信息,而且如果/当那个时间到来时,我不必更新我的应用程序。)

native API 返回 native 路径名,如 ob 所见,即 \SystemRoot\System32\Ntoskrnl.exe\??\C:\Program Files\VMWare Workstation\vstor-ws60.sys.

我可以替换常见的前缀,即

std::wstring NtPathToWin32Path( std::wstring ntPath )
{
if (boost::starts_with(ntPath, L"\\\\?\\"))
{
ntPath.erase(ntPath.begin(), ntPath.begin() + 4);
return ntPath;
}
if (boost::starts_with(ntPath, L"\\??\\"))
{
ntPath.erase(ntPath.begin(), ntPath.begin() + 4);
}
if (boost::starts_with(ntPath, L"\\"))
{
ntPath.erase(ntPath.begin(), ntPath.begin() + 1);
}
if (boost::istarts_with(ntPath, L"globalroot\\"))
{
ntPath.erase(ntPath.begin(), ntPath.begin() + 11);
}
if (boost::istarts_with(ntPath, L"systemroot"))
{
ntPath.replace(ntPath.begin(), ntPath.begin() + 10, GetWindowsPath());
}
if (boost::istarts_with(ntPath, L"windows"))
{
ntPath.replace(ntPath.begin(), ntPath.begin() + 7, GetWindowsPath());
}
return ntPath;
}

TEST(Win32Path, NtPathDoubleQuestions)
{
ASSERT_EQ(L"C:\\Example", NtPathToWin32Path(L"\\??\\C:\\Example"));
}

TEST(Win32Path, NtPathUncBegin)
{
ASSERT_EQ(L"C:\\Example", NtPathToWin32Path(L"\\\\?\\C:\\Example"));
}

TEST(Win32Path, NtPathWindowsStart)
{
ASSERT_EQ(GetCombinedPath(GetWindowsPath(), L"Hello\\World"), NtPathToWin32Path(L"\\Windows\\Hello\\World"));
}

TEST(Win32Path, NtPathSystemrootStart)
{
ASSERT_EQ(GetCombinedPath(GetWindowsPath(), L"Hello\\World"), NtPathToWin32Path(L"\\SystemRoot\\Hello\\World"));
}

TEST(Win32Path, NtPathGlobalRootSystemRoot)
{
ASSERT_EQ(GetCombinedPath(GetWindowsPath(), L"Hello\\World"), NtPathToWin32Path(L"\\globalroot\\SystemRoot\\Hello\\World"));
}

但如果没有某些 API(无论是 native API 还是其他 API)将它们转换为 Win32 路径名,我会感到非常惊讶。是否存在这样的 API?

最佳答案

我们在生产代码中这样做。据我所知,没有处理此问题的 API(公共(public)或私有(private))。我们只是用几个前缀做一些字符串比较,它对我们有用。

显然在 ntdll.dll 中有一个名为 RtlNtPathNameToDosPathName() 的函数(随 XP 引入?),但我不知道它的作用;不过,我猜它与\Device\Harddisk0 之类的东西有更多关系。

不过,我不确定是否真的需要这样的功能。 Win32 将路径(在 CreateFile 等意义上)传递给 NT; NT 不会将路径传递给 Win32。所以 ntdll.dll 并不真的需要从 NT 路径转到 Win32 路径。在某些 NT 查询函数返回完整路径的极少数情况下,任何转换函数都可以在 Win32 dll 内部(例如,不导出)。我什至不知道他们是否打扰,因为像 GetModuleFileName() 这样的东西只会返回用于加载图像的任何路径。我想这只是一个有漏洞的抽象。

关于c++ - 如何将 native (NT) 路径名转换为 Win32 路径名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4445108/

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