Кто-нибудь знает как получить source junction'а, т.е допустим у меня есть junction: source - D:\Test, target - D:\MyJunction, как по строке D:\MyJunction (ну или допустим \Device\HarddiskVolume2\MyJunction) получить строку D:\Test ? Знаю что джанкшены реализованы через reparse points, т.е можно через FSCTL_GET_REPARSE_POINT получить сырые данные, но мне хотелось бы каким-нибудь документированным способом это сделать
IceStudent, я имел ввиду что в документации нигде не сказано что мол в REPARSE_DATA_BUFFER хранится путь к source'у джанкшена. И вообще, что-то у меня не получается прочитать информацию о джанкшене с помощью FSCTL_GET_REPARSE_POINT, делаю так: Код (Text): HANDLE hFile; OBJECT_ATTRIBUTES oa; IO_STATUS_BLOCK iob; UNICODE_STRING name; REPARSE_DATA_BUFFER buff; RtlInitUnicodeString(&name, L"\\Device\\HarddiskVolume1\\OtherDisk"); InitializeObjectAttributes(&oa, &name, OBJ_KERNEL_HANDLE, NULL, NULL); status = ZwOpenFile( &hFile, FILE_LIST_DIRECTORY|SYNCHRONIZE, &oa, &iob, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, FILE_DIRECTORY_FILE|FILE_SYNCHRONOUS_IO_NONALERT|FILE_OPEN_FOR_BACKUP_INTENT ); if (NT_SUCCESS(status)) { FSSPY_DBGPRINT(("Dir opened!!!\n")); status = ZwFsControlFile(hFile, NULL, NULL, NULL, &iob, FSCTL_GET_REPARSE_POINT, NULL, 0, &buff, sizeof(buff)); if (NT_SUCCESS(status)) { FSSPY_DBGPRINT(("Reparse point data read!!!\n")); } else { FSSPY_DBGPRINT(("Error: 0x%X\n", status)); } ZwClose(hFile); } Выводится ошибка 0xC0000275, т.е STATUS_NOT_A_REPARSE_POINT. Но это точно джанкшен (его цель) сделанный с помощью утилиты junction Руссиновича.
Вобщем, уже не важно, я сделал проще: ZwOpenFile, открываем файл, потом ObReferenceObjectByHandle и fileObject->FileName, там все символические ссылки + junction'ы + всё что ещё возможно разрешено. Cпасибо!