IoQueryFileDosDeviceName функция подошла бы, но для неё надо знать PFILE_OBJECT, а есть только имя файла и PID, x64 в своём блоге писал, что есть какой-то непростой способ получить FILE_OBJECT зная PID, но так и не описал его. Кстати в статье
http://x64.blog.ru/51061171.html описано обратное преобразование.
Уже решил проблему, но ничего умнее не нашёл, как перечисляя все буквы дисков от A до Z найти для каждой из них путь вида \Device\... с помощью ZwOpenSymbolicLinkObject ZwQuerySymbolicLinkObject. А потом этот путь сравнивать с началом моего пути. Конечно не самый быстрый способ, но работает.
Единственная тонкость: файл, запущеный из сети с расшареного ресурса, имеет начало: \Device\LanmanRedirector\%comp_name%. Здесь "\Device\LanmanRedirector" надо заменять на "\".