Вы можете рассмотреть возможность создания цикла с использованием FsRtlDissectName , пока оставшийся аргумент пути не станет пустым.
Что-то подобное может делать то, что вы хотите (хотя вам нужно будет обрабатывать такие вещи, как имена потоков ADS, а также добавлять правильную проверку ошибок):
void FetchFileName( IN PUNICODE_STRING pSourceString, OUT PUNICODE_STRING pFileName )
{
UNICODE_STRING current = *pSourceString; // structure copy.
UNICODE_STRING remaining;
for(;;)
{
// Fetch the next path component.
FsRtlDissectName( current, pFileName, &remaining );
if( remaining.Length == 0 )
{
// Nothing left to parse. pFilename will
// contain the last filename found.
break;
}
// Advance down the string.
current = remaining; // structure copy.
}
}