ZwCreateFile - формат имени файла

Тема в разделе "WASM.NT.KERNEL", создана пользователем SpiritFire, 13 ноя 2008.

  1. SpiritFire

    SpiritFire New Member

    Публикаций:
    0
    Регистрация:
    21 янв 2008
    Сообщения:
    31
    Ребят, подскажите, пожалуйста, в каком формате передавать имя файла функции ZwCreateFile?

    Стандартных семплов, её юзающих, не нашел.
    Документация по WDK тоде молчит по этому поводу.
    По коду CreateProcessW нашел, что она каким-то образом вызывает что-то вида RtlDosFileNameTont_U (пишу по памяти), но понять. куда оно пишет результирующую строку я пока не смог.

    При передаче имени файла вида
    Код (Text):
    1. L"C:\\1.txt" /* C:\1.txt */
    возвращается статус "синтаксическая ошибка в имени файла или папки"

    Код (Text):
    1.     HANDLE                    hLocked;
    2.     OBJECT_ATTRIBUTES  attLocked;
    3.     IO_STATUS_BLOCK     iobLocked;
    4.  
    5.     RtlZeroMemory(&attLocked,sizeof(attLocked));
    6.     RtlZeroMemory(&iobLocked,sizeof(iobLocked));
    7.  
    8.     InitializeObjectAttributes(&attLocked,(PUNICODE_STRING)inBuffer/*name*/,OBJ_KERNEL_HANDLE,NULL,NULL);
    9.  
    10.     status = ZwCreateFile(&hLocked,GENERIC_READ,&attLocked,&iobLocked,NULL/*allocation size*/,FILE_ATTRIBUTE_NORMAL,0/*share*/,FILE_OPEN/*no create*/,FILE_NON_DIRECTORY_FILE,NULL,0);
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    в формате относительно корня менеджера объектов.
    что есть в менеджере объектов - качай WinObj/WinObjEx.
    Для доступа к файловой системе можно, например, использовать ссылку \??\X:\Path\File.ext, где X: - буква диска, Path - путь, File.ext - файл и расширение.
    Можно открыть девайс - \Device\XXX, где XXX имя девайса.
    и так далее.

    >>RtlDosFileNameTont
    да, я тоже не помню как она называется, но есть такая функция, которая конвертирует DOS-путь (X:\Path\File.ext) в NT-путь (\??\X:\Path\File.ext)

    PS. Везде выше вместо ?? справедливо так же Globals?? или DosDevices.
     
  3. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    А у меня она почему-то более разговорчивая :))
    Ещё в KmdTut загляни.
     
  4. SpiritFire

    SpiritFire New Member

    Публикаций:
    0
    Регистрация:
    21 янв 2008
    Сообщения:
    31
    Примерно разобрался: "\??\C:\1txt". Гугл рулит.
    И ве же, остался вопрос, почему так, и если не тяжело, подскажите, пожалуйста, почему так, и где почитать об именах файлов в kernel-mode?
     
  5. SpiritFire

    SpiritFire New Member

    Публикаций:
    0
    Регистрация:
    21 янв 2008
    Сообщения:
    31
    Если я вас правиьно понял:
    \ DosDevices - старые устройства и пути
    \ (Globals)?? - все, что есть на этом компе
    \ Device - девайсы

    Спасибо.
     
  6. SpiritFire

    SpiritFire New Member

    Публикаций:
    0
    Регистрация:
    21 янв 2008
    Сообщения:
    31
    Поменял. Исправил ошибку с уровнем IRQ - теперь приведенный ZwCreateFile возвращает "указан недопусимый путь" для "\\??\\C:\1.txt" или бсодит на "\\DosDevices\\C:\\1.txt"

    Файл по заданному пути существует. IoCreateFile(..) возвращает "Неверная попытка доступа к адресу памяти".
    Код (Text):
    1.       HANDLE            hLocked;
    2.       OBJECT_ATTRIBUTES attLocked;
    3.       IO_STATUS_BLOCK   iobLocked;
    4.      
    5.       RtlZeroMemory(&attLocked,sizeof(attLocked));
    6.       RtlZeroMemory(&iobLocked,sizeof(iobLocked));
    7.      
    8.       InitializeObjectAttributes(&attLocked,(PUNICODE_STRING)inBuffer/*name*/,OBJ_KERNEL_HANDLE|OBJ_CASE_INSENSITIVE,NULL,NULL);
    9.      
    10.                
    11.       currentIrql = KeGetCurrentIrql();
    12.       if(currentIrql==PASSIVE_LEVEL)
    13. //      status = ZwCreateFile(&hLocked,FILE_READ_ATTRIBUTES,&attLocked,&iobLocked,NULL/*allocation size*/,FILE_ATTRIBUTE_NORMAL,0/*share*/,FILE_OPEN_IF,FILE_SYNCHRONOUS_IO_NONALERT,NULL,0);
    14.         status = IoCreateFile(&hLocked,
    15.                                 FILE_READ_ATTRIBUTES,
    16.                                 &attLocked,
    17.                                 &iobLocked,
    18.                                 NULL,
    19.                                 FILE_ATTRIBUTE_NORMAL,
    20.                                 0 /* no share */,
    21.                                 FILE_OPEN_IF,
    22.                                 FILE_NON_DIRECTORY_FILE,
    23.                                 NULL,
    24.                                 0,
    25.                                 CreateFileTypeNone,
    26.                                 NULL,
    27.                                 IO_FORCE_ACCESS_CHECK);
     
  7. SpiritFire

    SpiritFire New Member

    Публикаций:
    0
    Регистрация:
    21 янв 2008
    Сообщения:
    31
    Если в пути указать GLOBALS?? - ситуация аналогична "??"
     
  8. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    SpiritFire
    KmdTut -> Базовая техника -> Каталоги и файлы
    там рабочий пример с подробными комментариями.
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Нет. И \?? и \Globals?? и \DosDevices это одно и то же. Я даже написал что можно поменять на любое из этих. Это все каталог - символьных ссылок (кроме DosDevices, который сам - символьная ссылка на этот кталог), экспортируемых в юзермод.
    Хочешь чтобы девайс был доступен в юзермоде например? Создавай ссылку \??\XXX на \Device\XXX.
    Насчет \Device ты прав - там действительно девайсы.

    Читай Марка Руссиновича и Д.Соломона - там все прекрасно расписано и про пути, и про ссылки, и про девайсы и про все на свете.