Como acesso programaticamente o caminho de destino de um link simbólico do Windows?

O Windows 6 (Vista e Server 2008) suporta links simbólicos adequados, que podem ser criados através doCreateSymbolicLink função. Mas não parece haver uma função correspondente para interrogar um link simbólico para obter o caminho do destino do link.

Descobri que os links simbólicos são uma implementação de pontos de nova análise e, portanto, as funções do ponto de nova análise podem ser usadas para obter o caminho de destino. Mas os arquivos de cabeçalho que eu preciso usar pontos de nova análise parecem vir com oKit de driver do Windows. A instalação deste kit com o VS2008 parece ser uma tarefa não trivial.

Existe uma função simples e agradável que eu perdi para obter o destino de um link, ou eu realmente tenho que configurar um ambiente de desenvolvimento de driver do Windows apenas para escrever código para acessar essas informações?

Edição: Adam Mitz veio com a sugestão de GetFinalPathNameByHandle. Essa função funciona muito bem para links simbólicos locais, mas não parece funcionar para resolver links remotos (via caminho UNC).

EDIT 2: A pedido de Adam, aqui estão mais detalhes do que eu tentei:

Eu inicialmente desceu aFSCTL_GET_REPARSE_POINT/ DeviceIoControl rota, mas isso gera umaREPARSE_DATA_BUFFER estrutura. Os cabeçalhos que definem essa estrutura parecem existir apenas no Windows Driver Kit.

GetFinalPathNameByHandle() funciona bem quando o link existe em um disco local (C:\...\link etc). Curiosamente, descobri que poderia obter o identificador para o link - e, assim, obter o alvo - usandoCreateFileW() se oFILE_FLAG_OPEN_REPARSE_POINT O sinalizador foi especificado ou não, independentemente de o arquivo de destino existir.

QuandoCreateFileW() eGetFinalPathNameByHandle() são usados para interrogar um link remoto (\\?\UNC\....), as coisas começam a se desfazer. E seFILE_FLAG_OPEN_REPARSE_POINT é especificado,GetFinalPathNameByHandle() sempre retorna o caminho do link, não o caminho de destino. E seFILE_FLAG_OPEN_REPARSE_POINT não for especificado, o caminho de destino será retornado, mas apenas se o destino existir e estiver na mesma máquina que o link. Se o link apontar para outra máquina, eu recebo um erro de permissão de rede. Se o link apontar para um arquivo local - inexistente -, eu recebo um erro de arquivo não encontrado.

questionAnswers(1)

yourAnswerToTheQuestion