junctions

Тема в разделе "WASM.NT.KERNEL", создана пользователем Sheph, 15 фев 2008.

  1. Sheph

    Sheph New Member

    Публикаций:
    0
    Регистрация:
    24 янв 2008
    Сообщения:
    89
    Кто-нибудь знает как получить source junction'а, т.е допустим у меня есть junction: source - D:\Test, target - D:\MyJunction, как по строке D:\MyJunction (ну или допустим \Device\HarddiskVolume2\MyJunction) получить строку D:\Test ?
    Знаю что джанкшены реализованы через reparse points, т.е можно через FSCTL_GET_REPARSE_POINT получить сырые данные, но мне хотелось бы каким-нибудь документированным способом это сделать
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Вполне документированы.
     
  3. Sheph

    Sheph New Member

    Публикаций:
    0
    Регистрация:
    24 янв 2008
    Сообщения:
    89
    IceStudent, я имел ввиду что в документации нигде не сказано что мол в REPARSE_DATA_BUFFER хранится путь к source'у джанкшена. И вообще, что-то у меня не получается прочитать информацию о джанкшене с помощью FSCTL_GET_REPARSE_POINT, делаю так:
    Код (Text):
    1.     HANDLE hFile;
    2.     OBJECT_ATTRIBUTES oa;    
    3.     IO_STATUS_BLOCK iob;
    4.     UNICODE_STRING name;
    5.     REPARSE_DATA_BUFFER buff;
    6.  
    7.     RtlInitUnicodeString(&name, L"\\Device\\HarddiskVolume1\\OtherDisk");
    8.  
    9.     InitializeObjectAttributes(&oa, &name, OBJ_KERNEL_HANDLE, NULL, NULL);
    10.  
    11.     status = ZwOpenFile(  &hFile,
    12.                           FILE_LIST_DIRECTORY|SYNCHRONIZE,
    13.                           &oa,
    14.                           &iob,
    15.                           FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
    16.                           FILE_DIRECTORY_FILE|FILE_SYNCHRONOUS_IO_NONALERT|FILE_OPEN_FOR_BACKUP_INTENT  );
    17.  
    18.     if (NT_SUCCESS(status))
    19.     {
    20.       FSSPY_DBGPRINT(("Dir opened!!!\n"));
    21.      
    22.       status = ZwFsControlFile(hFile, NULL, NULL, NULL, &iob, FSCTL_GET_REPARSE_POINT, NULL, 0, &buff, sizeof(buff));
    23.  
    24.       if (NT_SUCCESS(status))
    25.       {
    26.         FSSPY_DBGPRINT(("Reparse point data read!!!\n"));
    27.       }
    28.       else
    29.       {
    30.         FSSPY_DBGPRINT(("Error: 0x%X\n", status));
    31.       }
    32.      
    33.       ZwClose(hFile);
    34.     }
    Выводится ошибка 0xC0000275, т.е STATUS_NOT_A_REPARSE_POINT. Но это точно джанкшен (его цель) сделанный с помощью утилиты junction Руссиновича.
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Тут расписано. То есть, ты не указал FILE_OPEN_REPARSE_POINT.

    msdn
     
  5. Sheph

    Sheph New Member

    Публикаций:
    0
    Регистрация:
    24 янв 2008
    Сообщения:
    89
    Вобщем, уже не важно, я сделал проще: ZwOpenFile, открываем файл, потом ObReferenceObjectByHandle и fileObject->FileName, там все символические ссылки + junction'ы + всё что ещё возможно разрешено. Cпасибо!