我正在报告从本地系统API中获取的一些信息。(我知道这是不好的...但我在得到无法通过其他方式获得的信息,如果必要,我更新我的应用程序也没什么问题。)
本机API返回本机路径名,如
我可以替换常见的前缀,例如:
本机API返回本机路径名,如
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(本地或其他方式)可以将它们转换为Win32路径名,我会非常惊讶。这样的API存在吗?
NtCreateFile
(http://msdn.microsoft.com/en-us/library/bb432380%28v=vs.85%29.aspx)打开文件、卷等以进行读取。然后使用返回的`HANDLE`按照这里所述的方式获取完整路径http://msdn.microsoft.com/en-us/library/aa366789%28v=vs.85%29.aspx。 - PraetorianNtQueryFileInformation
并从句柄请求FILE_NAMES_INFORMATION
。 - Billy ONeal