Я работаю над сообщением некоторой информации, полученной из собственных системных 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?
PathCanonicalize
? msdn.microsoft.com/en-us/ библиотека/bb773569%28v=vs.85%29.aspx - person Praetorian   schedule 15.12.2010NtCreateFile
(msdn.microsoft.com/ en-us/library/bb432380%28v=vs.85%29.aspx), чтобы открыть файл, том и т. д. для чтения. Затем используйте возвращенныйHANDLE
, чтобы получить полный путь, как описано здесь msdn.microsoft.com/en-us/library/aa366789%28v=vs.85%29.aspx - person Praetorian   schedule 15.12.2010FindFirstFile
может легко создавать пути Win32; вы должны дать ему один для начала, в отличие отZwQueryDirectoryFile
, который вместо этого берет РУЧКУ. Конечно, ваша проблема была бы решена, если бы существовал API для возврата пути Win32 из HANDLE. - person ephemient   schedule 15.12.2010QUERY_INFORMATION
(а неGENERIC_READ
илиGENERIC_WRITE
), то вы никоим образом не должны мешать другим программам, использующим файл. - person Ben Voigt   schedule 15.12.2010NtQueryFileInformation
и попроситьFILE_NAMES_INFORMATION
с дескриптора. - person Billy ONeal   schedule 15.12.2010