Передача данных из User в Kernel

Тема в разделе "WASM.BEGINNERS", создана пользователем mavok, 7 янв 2011.

  1. mavok

    mavok New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2010
    Сообщения:
    7
    Всем Доброго Времени суток!

    Пишу драйвер-фильтр файловой системы. Нужно передавать данные из user приложение в ядро. Для этого использую в user приложении:
    Код (Text):
    1. HRESULT FilterSendMessage(
    2.   __in      HANDLE hPort,
    3.   __in_opt  LPVOID lpInBuffer,
    4.   __in      DWORD dwInBufferSize,
    5.   __out     LPVOID lpOutBuffer,
    6.   __in      DWORD dwOutBufferSize,
    7.   __out     LPDWORD lpBytesReturned
    8. )
    ,
    а в драйвере
    Код (Text):
    1. VOID RtlCopyMemory(
    2.   __in  VOID UNALIGNED *Destination,
    3.   __in  const VOID UNALIGNED *Source,
    4.   __in  SIZE_T Length
    5. );
    Все довольно классно работает. Но!

    Мне нужно передать не просто переменную, а массив строк в драйвер (список файлов). Создавать свой массив в драйвере очень нехочется, хочется просто передать указатель на этот массив строк, а в драйвере его читать.

    Но тут в отладчике то я и обнаружил, что память по адресу нефига не доступна за пределами функции считывания информации от приложения.

    Как же создать массив строк, чтобы он был виден из драйвера по переданному ему указателю?

    Спасибо за внимание.
     
  2. shm

    shm New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2010
    Сообщения:
    93
    Не знаю как это делается средствами винды, но вообще для этого нужно монтировать память кусок памяти приложения в пространство ядра, т.е. техника примерна такая: нужно получить физические адреса соотв. страниц и их примаппить к ядру. Вполне возможно, что для этого уже есть готовые вызовы.
     
  3. mavok

    mavok New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2010
    Сообщения:
    7
    shm, спасибо!

    Есть у кого ещё идеи по этому поводу?
     
  4. 0x6b65

    0x6b65 Забанен

    Публикаций:
    0
    Регистрация:
    8 окт 2009
    Сообщения:
    92
    Решить поставленную задачу можно с использованием MDL - http://msdn.microsoft.com/en-us/library/ff565421(VS.85).aspx. Механизмы MDL позволят залочить страницы и спроецировать физическую память, выделенную в user mod’е, в адресное пространство ядра.

    Но лучше все же воспользоваться пулом и хранить копию данных в ядре
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    А можно просто обратиться к оригинальному массиву строк в юзермоде по указателю, если IRQL = PASSIVE_LEVEL.
    Но это в простейших случаях. Частенько придется лочить.

    Открывай мсдн на тему IoAllocateMdl, MmProbeAndLockPages, MmMapLockedPagesSpecifyCache и сотоварищи.
     
  6. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    Так а что, DeviceIoControl нынче не в моде ? Чем он плох? Передал буфер строк и размер, дров его принял, выделил память и закатал себе. Или это слишком просто и я от чего-то отстал? Или мы коммунисты не ищем легких путей ?
     
  7. mavok

    mavok New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2010
    Сообщения:
    7
    0x6b65
    Спасибо, буду рыть в этом направлении!
    k3internal
    в том то и дело, зачем мне создавать копию в драйвере? А если строк тысячи? А если они ещё и меняются постоянно?
    Great
    Нет, не катит. Там даже для аналога моего фильтра в сорцах WDK в месте, где нужно обращаться к массиву стоит макрос:
    Код (Text):
    1. ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);
    .
    Т.е. драйвер в этом месте не должен выполняться на уровне IRQL = PASSIVE_LEVEL (интересно, а как драйвер в принципе может быть на таком уровне?). Или я что-то не так понял?

    К тому же, я продебажил свой драйвер. Через буфер передал указатель на мою строку. И если в функции драйвера, где происходит подсоединение в user программе это строка ещё видна по переданному адресу, то в других переменная, которая должна содержать строку содержит следующее:
    Код (Text):
    1. struct _UNICODE_STRING "--- memory read error at address 0x0027f8e4 ---"
    .
     
  8. 0x6b65

    0x6b65 Забанен

    Публикаций:
    0
    Регистрация:
    8 окт 2009
    Сообщения:
    92
    mavok
    "Учите мат.-часть"(С) : организация страничной адресации, виртуальная/физическая память, реализация в ядре NT-based OS, реализация адресного пространства процессов в NT-based OS.

    P.S. ASSERT проверяет, что условие выполняется. Т. е. приведенный кусок кода должен исполняться только на PASSIVE_LEVEL
     
  9. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    mavok
    Ну если не лень, можешь приаттачиться в свой процесс и из него напрямую читать список (если знаешь адрес смещения). Для этого используй например KeStackAttachProcess.
     
  10. mavok

    mavok New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2010
    Сообщения:
    7
    0x6b65
    Ну вот как раз и изучаю! :)

    блин, точно! :lol: Засиделся я что-то! :lol:

    Так, а почему в отладчике тогда memory read error? Может в HEAP память выделять тогда в user приложении?
     
  11. expert

    expert New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2009
    Сообщения:
    151
    k3internal
    создавать устройство палево )
     
  12. 0x6b65

    0x6b65 Забанен

    Публикаций:
    0
    Регистрация:
    8 окт 2009
    Сообщения:
    92
    Память, выделенная в куче, условно говоря, выделяется для конкретного процесса (в частности на это указывает адрес 0x0027f8e4). А "другая функция драйвера", видимо, вызывается в контексте другого процесса, у которого адресное пространство другое. Поэтому и нужно перепроецировать память в ядро – адресное пространство ядра доступно для драйвера в любом процессе.

    Кстати, есть еще функция переключения адресного пространства процесса (что бы прочитать данные из процесса, в котором они хранятся) - KeStackAttachProcess (http://msdn.microsoft.com/en-us/library/ff549659(VS.85).aspx). Но переключение АП процесса довольно тормозная операция, да и процесс может умереть или осводить память - лучше юзать MDL
     
  13. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    0x6b65
    1) про пререключение ему уже подсказали
    2) Как пример юзания MDL - Разделяемая память
     
  14. mavok

    mavok New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2010
    Сообщения:
    7
    Как раз эту статью сейчас читаю! :)
     
  15. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    Руткит пишешь чтоль?
     
  16. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Как раз наоборот)
    Драйвер может быть парктически на любом уровне.