Я бы предположил, что самый простой способ - использовать инструмент командной строки Handle от тех же людей, что и Process Explorer.
Возможно, вы можете вызвать процесс из своего кода, а затем проанализировать вывод, который в основном представляет собой большой список открытых файлов (и записей реестра), разделенный на разделы с процессом, который открыл файл в качестве заголовка.
Я думаю, что под капотом Handle используется API-интерфейс NT Object Manager, так что, возможно, стоит разобраться, если вам все это нужно сделать самостоятельно.