Здраствуйте. Такая проблема. Нужно из драйвера передать определённые данные приложению. IRP пакеты не подходят из-за скорости, нужно что-то болеее быстрое. Появилась идея: юзер-моде приложение выделяет в своей памяти опр место, передаёт драйверу адресс начала и конца выделеного участка памяти, драйвер ишет туда данные и сообщает об этом приложению. Тоесть драйвер должен записать данные в область памяти usermode приложения. Как это реализовать? Мне посоветовали копать в сторону ZwCreateSection, ZwMapViewOfSection. Может кто-то поделится примером на С ? Был бы очень признателен.
09.10.06 07:46: Перенесено модератором из 'WIN API' — Alex Fedotov
zxm>Здраствуйте. Такая проблема. Нужно из драйвера передать определённые данные приложению. IRP пакеты не подходят из-за скорости, нужно что-то болеее быстрое. Появилась идея: юзер-моде приложение выделяет в своей памяти опр место, передаёт драйверу адресс начала и конца выделеного участка памяти, драйвер ишет туда данные и сообщает об этом приложению. Тоесть драйвер должен записать данные в область памяти usermode приложения. Как это реализовать? Мне посоветовали копать в сторону ZwCreateSection, ZwMapViewOfSection. Может кто-то поделится примером на С ? Был бы очень признателен.
Думаю, стОит спросить на профильном форуме + посмотрите для начала http://support.microsoft.com/kb/191840
ZwCreateSection не самый правильный и удобный вариант. Думаю, следует обратить внимание на варианты с завершением запроса, при этом шарить память удобнее из драйвера — MmMapLockedPages. Вот только почему-то в онлайн статье (в приведенной выше ссылке) этот метод не описан, тогда как у меня в локальной версии — есть. В любом случае, на osr это есть, вот только приведен не совсем корректный вариант.
Во-первых, в любом случае приложение с драйвером общаются посредством IRP.
Во-вторых, если использовать DIRECT_IO модель ввода-вывода — система сама проделает все работу — буфер приложения будет залочен и замаплен на системную память ( это довольно быстро все произойдет ). Кроме того, система также позаботится о дополнительном сервисе — поддержки очередей запросов, синхронизации и.т.д. Такая модель позволит довольно таки быстрое взаимодейстивие — например, чтение с диска происходит со скоростью в несколько десятков мегабайт в секунду. Для передачи данных от драйвера это самый прямой путь. Другое дело, если данные нужно часто передавать аппаратуре ( можно впомнить DirectDraw, DirectSocket ) — тут довольно эффективным может оказаться подход отображение аппаратных буферов на пользовательское пространство.
Здравствуйте, zxm, Вы писали:
zxm>Здраствуйте. Такая проблема. Нужно из драйвера передать определённые данные приложению. IRP пакеты не подходят из-за скорости, нужно что-то болеее быстрое. Появилась идея: юзер-моде приложение выделяет в своей памяти опр место, передаёт драйверу адресс начала и конца выделеного участка памяти, драйвер ишет туда данные и сообщает об этом приложению. Тоесть драйвер должен записать данные в область памяти usermode приложения. Как это реализовать? Мне посоветовали копать в сторону ZwCreateSection, ZwMapViewOfSection. Может кто-то поделится примером на С ? Был бы очень признателен.
Здравствуйте, Sergey Storozhevykh, Вы писали:
SS>Здравствуйте, zxm, Вы писали:
zxm>>Здраствуйте. Такая проблема. Нужно из драйвера передать определённые данные приложению. IRP пакеты не подходят из-за скорости, нужно что-то болеее быстрое. Появилась идея: юзер-моде приложение выделяет в своей памяти опр место, передаёт драйверу адресс начала и конца выделеного участка памяти, драйвер ишет туда данные и сообщает об этом приложению. Тоесть драйвер должен записать данные в область памяти usermode приложения. Как это реализовать? Мне посоветовали копать в сторону ZwCreateSection, ZwMapViewOfSection. Может кто-то поделится примером на С ? Был бы очень признателен.
SS>Все это можно реализовать с помощью механизма LPC.
Не забываем что при довольно небольших размерах сообщений (0x130) всеравно придем к CreateSection.
Пусто
Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.
Здравствуйте, Злость, Вы писали:
З>Здравствуйте, Sergey Storozhevykh, Вы писали:
SS>>Здравствуйте, zxm, Вы писали:
zxm>>>Здраствуйте. Такая проблема. Нужно из драйвера передать определённые данные приложению. IRP пакеты не подходят из-за скорости, нужно что-то болеее быстрое. Появилась идея: юзер-моде приложение выделяет в своей памяти опр место, передаёт драйверу адресс начала и конца выделеного участка памяти, драйвер ишет туда данные и сообщает об этом приложению. Тоесть драйвер должен записать данные в область памяти usermode приложения. Как это реализовать? Мне посоветовали копать в сторону ZwCreateSection, ZwMapViewOfSection. Может кто-то поделится примером на С ? Был бы очень признателен.
SS>>Все это можно реализовать с помощью механизма LPC.
З> Не забываем что при довольно небольших размерах сообщений (0x130) всеравно придем к CreateSection.
Ага, если размер данных укладывается в 0х130, данные пересылаются в теле самого сообщения, иначе используется memory mapping. Я так понимаю, автор интересуется как раз возможностью обмена данными через регион разделяемой памяти. При использовании LPC детали реализации такой схемы скрываются от разработчмка — нужно лишь создать section object, который система сама отобразит в адресные пространства клиента и сервера. Ну и основная проблема — синхронизации доступа к разделяемой памяти — также решается внутри самого механизма LPC. Единственный недостаток механизма, ИМХО, — его недокументированность
Здравствуйте, zxm, Вы писали:
zxm>Здраствуйте. Такая проблема. Нужно из драйвера передать определённые данные приложению. IRP пакеты не подходят из-за скорости, нужно что-то болеее быстрое. Появилась идея: юзер-моде приложение выделяет в своей памяти опр место, передаёт драйверу адресс начала и конца выделеного участка памяти, драйвер ишет туда данные и сообщает об этом приложению. Тоесть драйвер должен записать данные в область памяти usermode приложения. Как это реализовать? Мне посоветовали копать в сторону ZwCreateSection, ZwMapViewOfSection. Может кто-то поделится примером на С ? Был бы очень признателен.
Здравствуйте, 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
Пусто
Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.
Здравствуйте, zxm, Вы писали:
zxm>Тоесть драйвер должен записать данные в область памяти usermode приложения. Как это реализовать?
Вам тут насоветовали каких-то ужасов, когда все значительно проще. Приложение передает драйверу буфер посредством обычного IRP с методом DIRECT либо NEITHER (во втором случае нужно будет дополнительно сделать MmGetSystemAddressForMdlSafe), и вперед — драйвер пишет данные в буфер, приложение читает, или наоборот, как больше нравится. Завершение IRP делается при окончании связи приложения с драйвером. При желании можно таких буферов передать сколько угодно.
Если нужны уведомления — пожалуйста, хоть событиями/семафорами, хоть APC, хоть тупым опросом нужных полей в буфере в цикле со Sleep (1).