Как получить фактический путь перенаправленного пути?

32-разрядный процесс, работающий на 64-разрядной версии, получит обобщенный путь к перенаправленному пути из-за перенаправления файлов. Вызов GetCurrentDirectory, например, если процесс запущен из \Windows\SysWOW64, даст результат: Windows\System32.

Тем не менее, очень возможно определить, работает ли 32-битный процесс на 64-битной хост-машине. Я ищу решение, которое укажет мне правильный / фактический путь. Что-то вроде пути ResolveWOWPathToActual, который даст \Windows\SysWOW64 вместо пути \Windows\System32.

РЕДАКТИРОВАТЬ:

WCHAR szCurFolder[MAX_PATH];

PVOID dummy;
Wow64DisableWow64FsRedirection(&dummy);

GetCurrentDirectoryW(MAX_PATH, szCurFolder);

printf("Current Dir: %S\n", szCurFolder);

person Ajay    schedule 14.05.2014    source источник
comment
msdn.microsoft.com/en -us / library / windows / desktop /   -  person Abhineet    schedule 14.05.2014
comment
Отключите перенаправление, делайте свою работу, включите их снова.   -  person Abhineet    schedule 14.05.2014
comment
Уже пробовал. Не работает. Обновляющий вопрос для добавления кода.   -  person Ajay    schedule 14.05.2014
comment
Вы должны проверить, не удалось ли Wow64DisableWow64FsRedirection.   -  person Abhineet    schedule 14.05.2014
comment
Что-нибудь еще, Абхинит?   -  person Ajay    schedule 14.05.2014
comment
Wow64DisableWow64FsRedirection успешно?   -  person Abhineet    schedule 14.05.2014
comment
Да, получается ... похоже, это возвращает неправильный путь .. по крайней мере, для моего Win7SP1 ...   -  person Jochen Kalmbach    schedule 14.05.2014
comment
Интересно, что FindFirstFile(".", &fd) также возвращает system32 вместо syswow64 ...   -  person Jochen Kalmbach    schedule 14.05.2014
comment
GetCurrentDirectory не взаимодействует с перенаправителем файловой системы. Это просто текстовое свойство процесса. В данном случае текущий каталог действительно System32. Перенаправление срабатывает, когда вы пытаетесь разрешить каталог в объект файловой системы.   -  person David Heffernan    schedule 14.05.2014
comment
Да, FindFirstFile и другие функции выдают System32, а не SysWOW64.   -  person Ajay    schedule 14.05.2014
comment
Да, GetCurrentDirectory мало что делает. Я экспериментировал, что команда explorer . из 32-разрядного cmd.exe запускала \ Windows \ System32 в проводнике, а не Windows \ SysWOW64.   -  person Ajay    schedule 14.05.2014
comment
И также кажется, что GetFullPathName(".") использует неправильный текущий каталог; (   -  person Jochen Kalmbach    schedule 14.05.2014


Ответы (1)


Функция API GetFinalPathNameByHandle может удовлетворить ваши потребности. Вам нужно будет открыть файл или каталог, чтобы получить его дескриптор. Передайте этот дескриптор GetFinalPathNameByHandle, и он даст вам истинный путь к файлу. Отключать перенаправитель файловой системы не нужно.

Я полагаю, что единственный возможный недостаток - это то, что вам нужно указать дескриптор, а не путь.

person David Heffernan    schedule 14.05.2014
comment
Это также приводит к проблемам ... он возвращает C:\Windows\SysWOW64, если FsRedir включен, и возвращает C:\Windows\System32, если FsRedit отключен;) Я предполагал, что он всегда должен возвращать правильный .. . - person Jochen Kalmbach; 14.05.2014
comment
@JochenKalmbach Этого и следовало ожидать. Если перенаправление файловой системы отключено, C:\Windows\System32 действительно означает C:\Windows\System32. Если вы хотите использовать такой термин, как «правильно», вам нужно очень точно указать, что это на самом деле означает. - person David Heffernan; 14.05.2014
comment
Это служит цели. Превосходно. Просто нужно сдирать \\? \ С начала. - person Ajay; 14.05.2014