Передача данных из kernel в user mode
От: zxm  
Дата: 08.10.06 19:43
Оценка:
Здраствуйте. Такая проблема. Нужно из драйвера передать определённые данные приложению. IRP пакеты не подходят из-за скорости, нужно что-то болеее быстрое. Появилась идея: юзер-моде приложение выделяет в своей памяти опр место, передаёт драйверу адресс начала и конца выделеного участка памяти, драйвер ишет туда данные и сообщает об этом приложению. Тоесть драйвер должен записать данные в область памяти usermode приложения. Как это реализовать? Мне посоветовали копать в сторону ZwCreateSection, ZwMapViewOfSection. Может кто-то поделится примером на С ? Был бы очень признателен.

09.10.06 07:46: Перенесено модератором из 'WIN API' — Alex Fedotov
Re: Передача данных из kernel в user mode
От: FlashBack  
Дата: 08.10.06 21:01
Оценка: -2
Примерно такую же штуку делал, но не с драйвером, а с DLL.
здесь
Автор: FlashBack
Дата: 06.10.06
Re: Передача данных из kernel в user mode
От: Andrew S Россия http://alchemy-lab.com
Дата: 08.10.06 22:54
Оценка:
zxm>Здраствуйте. Такая проблема. Нужно из драйвера передать определённые данные приложению. IRP пакеты не подходят из-за скорости, нужно что-то болеее быстрое. Появилась идея: юзер-моде приложение выделяет в своей памяти опр место, передаёт драйверу адресс начала и конца выделеного участка памяти, драйвер ишет туда данные и сообщает об этом приложению. Тоесть драйвер должен записать данные в область памяти usermode приложения. Как это реализовать? Мне посоветовали копать в сторону ZwCreateSection, ZwMapViewOfSection. Может кто-то поделится примером на С ? Был бы очень признателен.

Думаю, стОит спросить на профильном форуме + посмотрите для начала http://support.microsoft.com/kb/191840
ZwCreateSection не самый правильный и удобный вариант. Думаю, следует обратить внимание на варианты с завершением запроса, при этом шарить память удобнее из драйвера — MmMapLockedPages. Вот только почему-то в онлайн статье (в приведенной выше ссылке) этот метод не описан, тогда как у меня в локальной версии — есть. В любом случае, на osr это есть, вот только приведен не совсем корректный вариант.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re: Передача данных из kernel в user mode
От: TarasCo  
Дата: 09.10.06 06:08
Оценка:
Во-первых, в любом случае приложение с драйвером общаются посредством IRP.
Во-вторых, если использовать DIRECT_IO модель ввода-вывода — система сама проделает все работу — буфер приложения будет залочен и замаплен на системную память ( это довольно быстро все произойдет ). Кроме того, система также позаботится о дополнительном сервисе — поддержки очередей запросов, синхронизации и.т.д. Такая модель позволит довольно таки быстрое взаимодейстивие — например, чтение с диска происходит со скоростью в несколько десятков мегабайт в секунду. Для передачи данных от драйвера это самый прямой путь. Другое дело, если данные нужно часто передавать аппаратуре ( можно впомнить DirectDraw, DirectSocket ) — тут довольно эффективным может оказаться подход отображение аппаратных буферов на пользовательское пространство.

Использование секций IMHO тут неоправдано.
Да пребудет с тобою сила
Re: Передача данных из kernel в user mode
От: Sergey Storozhevykh Россия  
Дата: 09.10.06 07:25
Оценка:
Здравствуйте, zxm, Вы писали:

zxm>Здраствуйте. Такая проблема. Нужно из драйвера передать определённые данные приложению. IRP пакеты не подходят из-за скорости, нужно что-то болеее быстрое. Появилась идея: юзер-моде приложение выделяет в своей памяти опр место, передаёт драйверу адресс начала и конца выделеного участка памяти, драйвер ишет туда данные и сообщает об этом приложению. Тоесть драйвер должен записать данные в область памяти usermode приложения. Как это реализовать? Мне посоветовали копать в сторону ZwCreateSection, ZwMapViewOfSection. Может кто-то поделится примером на С ? Был бы очень признателен.


Все это можно реализовать с помощью механизма LPC.
Re[2]: Передача данных из kernel в user mode
От: Злость Россия  
Дата: 09.10.06 08:23
Оценка:
Здравствуйте, Sergey Storozhevykh, Вы писали:

SS>Здравствуйте, zxm, Вы писали:


zxm>>Здраствуйте. Такая проблема. Нужно из драйвера передать определённые данные приложению. IRP пакеты не подходят из-за скорости, нужно что-то болеее быстрое. Появилась идея: юзер-моде приложение выделяет в своей памяти опр место, передаёт драйверу адресс начала и конца выделеного участка памяти, драйвер ишет туда данные и сообщает об этом приложению. Тоесть драйвер должен записать данные в область памяти usermode приложения. Как это реализовать? Мне посоветовали копать в сторону ZwCreateSection, ZwMapViewOfSection. Может кто-то поделится примером на С ? Был бы очень признателен.


SS>Все это можно реализовать с помощью механизма LPC.


Не забываем что при довольно небольших размерах сообщений (0x130) всеравно придем к CreateSection.
Пусто
Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.
Re[3]: Передача данных из kernel в user mode
От: Sergey Storozhevykh Россия  
Дата: 09.10.06 09:04
Оценка:
Здравствуйте, Злость, Вы писали:

З>Здравствуйте, Sergey Storozhevykh, Вы писали:


SS>>Здравствуйте, zxm, Вы писали:


zxm>>>Здраствуйте. Такая проблема. Нужно из драйвера передать определённые данные приложению. IRP пакеты не подходят из-за скорости, нужно что-то болеее быстрое. Появилась идея: юзер-моде приложение выделяет в своей памяти опр место, передаёт драйверу адресс начала и конца выделеного участка памяти, драйвер ишет туда данные и сообщает об этом приложению. Тоесть драйвер должен записать данные в область памяти usermode приложения. Как это реализовать? Мне посоветовали копать в сторону ZwCreateSection, ZwMapViewOfSection. Может кто-то поделится примером на С ? Был бы очень признателен.


SS>>Все это можно реализовать с помощью механизма LPC.


З> Не забываем что при довольно небольших размерах сообщений (0x130) всеравно придем к CreateSection.


Ага, если размер данных укладывается в 0х130, данные пересылаются в теле самого сообщения, иначе используется memory mapping. Я так понимаю, автор интересуется как раз возможностью обмена данными через регион разделяемой памяти. При использовании LPC детали реализации такой схемы скрываются от разработчмка — нужно лишь создать section object, который система сама отобразит в адресные пространства клиента и сервера. Ну и основная проблема — синхронизации доступа к разделяемой памяти — также решается внутри самого механизма LPC. Единственный недостаток механизма, ИМХО, — его недокументированность
Re: Передача данных из kernel в user mode
От: vlad.k.sm  
Дата: 11.10.06 04:57
Оценка:
Здравствуйте, zxm, Вы писали:

zxm>Здраствуйте. Такая проблема. Нужно из драйвера передать определённые данные приложению. IRP пакеты не подходят из-за скорости, нужно что-то болеее быстрое. Появилась идея: юзер-моде приложение выделяет в своей памяти опр место, передаёт драйверу адресс начала и конца выделеного участка памяти, драйвер ишет туда данные и сообщает об этом приложению. Тоесть драйвер должен записать данные в область памяти usermode приложения. Как это реализовать? Мне посоветовали копать в сторону ZwCreateSection, ZwMapViewOfSection. Может кто-то поделится примером на С ? Был бы очень признателен.


Inverted call — легальный метод
Re[2]: Передача данных из kernel в user mode
От: Злость Россия  
Дата: 11.10.06 06:14
Оценка: 1 (1)
Здравствуйте, vlad.k.sm, Вы писали:

VKS>Здравствуйте, zxm, Вы писали:


zxm>>Здраствуйте. Такая проблема. Нужно из драйвера передать определённые данные приложению. IRP пакеты не подходят из-за скорости, нужно что-то болеее быстрое. Появилась идея: юзер-моде приложение выделяет в своей памяти опр место, передаёт драйверу адресс начала и конца выделеного участка памяти, драйвер ишет туда данные и сообщает об этом приложению. Тоесть драйвер должен записать данные в область памяти usermode приложения. Как это реализовать? Мне посоветовали копать в сторону ZwCreateSection, ZwMapViewOfSection. Может кто-то поделится примером на С ? Был бы очень признателен.


VKS>Inverted call — легальный метод


Все сводится к манипуляции IRP — человек этого не хочет.

А вопрошающему надо уточнить.
1. Данные уже готовы для передачи, когда приложение зделает запрос? Если да, то я бы посоветол посмотреть в сторону поддержки у себя FastIoDeviceControl.
2. Если нет, то всеже реализация у себя отложенной обработки запросов от приложения. Здесь самое главное правильно выбрать метод передачи, в нашем случае это METHOD_OUT_DIRECT. Хотя если вероятность что данные могут быть уже готовы то скорее всего можно выбрать METHOD_NEITHER, а уже потом в случае их отсутствия запирать буфер в памяти и ... дальше действовать по методу METHOD_OUT_DIRECT.

Можно зделать еще одну вещь, это попросить драйвер распределить на адресное пространнство процеса страници, которые он будет заполнять, и любым синхронизирующим примитивом управлять взаимодейстивем.
Последовательность действий.
ExAllocatePool -> IoAllocateMdl -> MmBuildMdlForNonPagedPool -> MmMapLockedPages/MmMapLockedPagesSpecifyCache
Пусто
Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.
Re: Передача данных из kernel в user mode
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 29.10.06 07:34
Оценка:
Здравствуйте, zxm, Вы писали:

zxm>Тоесть драйвер должен записать данные в область памяти usermode приложения. Как это реализовать?


Вам тут насоветовали каких-то ужасов, когда все значительно проще. Приложение передает драйверу буфер посредством обычного IRP с методом DIRECT либо NEITHER (во втором случае нужно будет дополнительно сделать MmGetSystemAddressForMdlSafe), и вперед — драйвер пишет данные в буфер, приложение читает, или наоборот, как больше нравится. Завершение IRP делается при окончании связи приложения с драйвером. При желании можно таких буферов передать сколько угодно.

Если нужны уведомления — пожалуйста, хоть событиями/семафорами, хоть APC, хоть тупым опросом нужных полей в буфере в цикле со Sleep (1).
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.