А что помешает вызвать NtQuerySystemInformation, NtDuplicateObject, NtQueryObject в r3?
Пример как получить список хендлов можно здесь посмотреть, а там далее копируем дескриптор в свой процесс (NtDuplicateObject), смотрим тип (SYSTEM_HANDLE_ENTRY::ObjectTy pe, если не ошибаюсь файлы это тип 0x1C) и получаем имя объекта (NtQueryObject + ObjectNameInformation) для файла. Преобразовать в нормальный путь имя объекта можно с помощью GetFinalPathNameByHandle/GetFileInformationByHandleEx.
typedef enum _OBJECT_INFORMATION_CLASS {
ObjectBasicInformation,
ObjectNameInformation,
ObjectTypeInformation,
ObjectAllInformation,
ObjectDataInformation
} OBJECT_INFORMATION_CLASS, *POBJECT_INFORMATION_CLASS;
typedef struct _UNICODE_STRING {
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING, *PUNICODE_STRING;
typedef struct _OBJECT_NAME_INFORMATION {
UNICODE_STRING Name;
WCHAR Buffer[0];
} OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;