FILE_OBJECT в памяти

Тема в разделе "WASM.BEGINNERS", создана пользователем SystemError, 19 июн 2005.

  1. SystemError

    SystemError New Member

    Публикаций:
    0
    Регистрация:
    19 июн 2005
    Сообщения:
    6
    Можно ли (и как) создать файл в памяти, так чтоб "скармливать" его FILE_OBJECT функциям IoPageRead, FsRtlGetFileSize и т.п. как будто это реальный файл.
     
  2. zzzyab

    zzzyab New Member

    Публикаций:
    0
    Регистрация:
    13 май 2004
    Сообщения:
    115
    Если для windows то MMF(memory maped file).
     
  3. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Может быть ZwCreateSection + ObReferenceObjectByHandle ?
     
  4. SystemError

    SystemError New Member

    Публикаций:
    0
    Регистрация:
    19 июн 2005
    Сообщения:
    6
    Я тоже думал о MMF, но вот не знаю, как потом обращаться с ним, как с файловым объектом.

    Т.е. передавать его туда, где требуется FILE_OBJECT.



    Спасибо за помощь, попробую ObReferenceObjectByHandle.

    Как понял надо передать IoFileObjectType, чтоб получить FILE_OBJECT ?

    Вот только боюсь, что потом ещё надо будет колдовать над самой структурой, чтоб например задать тип носителя и т.п.

    Я правильно думаю?
     
  5. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    IoFileObjectType как я понимаю для access check нужен, так что если FILE_OBJECT будет только из ядра использоваться, то можно и 0 передать. А вот по поводу типа носителя - это что? Файл в памяти всё равно будет иметь файл на диске - pagefile.sys
     
  6. SystemError

    SystemError New Member

    Публикаций:
    0
    Регистрация:
    19 июн 2005
    Сообщения:
    6
    Я собираюсь делать это на прикладном уровне, а не в ядре.

    И не получилось заюзать ObReferenceObjectByHandle.

    Подключил wdm.lib, заинклудил ntddk.h, а ругается линкер, типа не нашел __imp__ObReferenceObjectByHandle.



    Про тип носителя, это просто я глянул содержимое IoPageRead. Там берется поле из FILE_OBJECT и проверяется на тип носителя (флопик, жесткий диск и т.п.).
     
  7. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    SystemError >




    То есть из прикладного? Я так понимаю, будет драйвер, которому из юзерлэнда отправят IOCTL, он откроет хендл и по нему получит FILE_OBJECT.



    >




    В wdm.lib есть только ObReferenceObject (точнее ObfReferenceObject), нужно подключить ntoskrnl.lib.



    >




    IMHO ObReferenceObjectByHandle в FILE_OBJECT всё что нужно запишет, что это винт и файл подкачки.
     
  8. SystemError

    SystemError New Member

    Публикаций:
    0
    Регистрация:
    19 июн 2005
    Сообщения:
    6


    Я имею в виду, что ObReferenceObjectByHandle буду вызывать не из драйвера, а из приложения. Т.е. все, что я пытаюсь сделать, делается в обычном виндовом приложении, а не в ядре. Честно говоря не нашел противопоказаний использования ObReferenceObjectByHandle в приложении.





    Подключил и ntoskrnl.lib, картина такая же, не линкер находит __imp__ObReferenceObjectByHandle.



    Вот предложили ещё попробовать использовать IoCreateStreamFileObject.
     
  9. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    А каким образом ObReferenceObjectByHandle будет вызываться не из драйвера, а из приложения?



    >




    Чем/что/как компилируешь? У меня нормально собирается msvc 7.1 и intel 8.1 с файлами из XPDDK
     
  10. SystemError

    SystemError New Member

    Публикаций:
    0
    Регистрация:
    19 июн 2005
    Сообщения:
    6




    Не знаю. Зашел в тупик.

    Задача в общем выглядит так:

    Открыть файл, т.е. в 3-м кольце получить его HANDLE, который связан, точнее представляет собой буффер в памяти, а не файл на диске?



    Ну то есть операция обратная CreateFileForMapping (ZwCreateSection), т.е. не представить файл в виде области памяти, а представить область памяти в виде файла, чтоб передавать в функции, которые запрашивают хендл файла.
     
  11. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Функции CreateFileForMapping нет в Win32 API. Есть CreateFileMapping. IMHO для поставленной задачи она и нужна, в качестве хендла файла передавать INVALID_HANDLE_VALUE. А лезть в ядро смысл какой? ObReferenceObjectByHandle из юзерленда вызвать нельзя, для этих целей нужен драйвер. Подробнее про них см. статьи от Four-F на сайте.
     
  12. SystemError

    SystemError New Member

    Публикаций:
    0
    Регистрация:
    19 июн 2005
    Сообщения:
    6
    Про ObReferenceObjectByHandle уже понял, спасибо.



    Но задача остается... :dntknw:

    В общем задача сводится к следующему:



    HANDLE hFile = CreateFile(....);



    HANDLE hMemory = CreateFileMapping(hFile, ...);

    assert(hMemory != 0);



    Только hFile - не файл на диске.

    Пробовал использовать pipe и mailslot, не получилось.
     
  13. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Посмотри описание CreateFileMapping:



    То есть, всё что нужно - вызвать эту ф-цию, передавая ей не хендл файла, а INVALID_HANDLE_VALUE.
     
  14. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Упс, только щас вроде понял задачу :dntknw:



    >




    IMHO это почти невозможно. Для симуляции файлов предназначены пайпы, но они как бы не имеют памяти.

    Лучше распиши задачу подробнее, почему не устраивает временный файл и какими ф-циями будет использоваться хэндл такого "файла".