Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как послать сообщение из драйвера в User Mode?  (Прочитано 14380 раз)
0 Пользователей и 1 Гость смотрят эту тему.
HighLander
Постоялец

il
Offline Offline
Пол: Мужской

« : 04-09-2007 17:49 » 

Всем привет!

У меня есть вопрос: Как можно послать сообщение из драйвера в User Mode?

Просто мне надо послать сообщение из IRP Create или Write в User Mode.

Зарание благодарю!
Записан
sss
Специалист

ru
Offline Offline

« Ответ #1 : 05-09-2007 08:33 » 

И при этом дождаться его обработки в режиме UserMode, а затем измененный передать дальше???
Записан

while (8==8)
HighLander
Постоялец

il
Offline Offline
Пол: Мужской

« Ответ #2 : 05-09-2007 08:39 » 

Да.
Записан
sss
Специалист

ru
Offline Offline

« Ответ #3 : 05-09-2007 08:51 » 

Ну тогда в морг Улыбаюсь.

Используй файлы или закрепленные в памяти списки Mdl и в качестве шлюзов именованные события.
Записан

while (8==8)
HighLander
Постоялец

il
Offline Offline
Пол: Мужской

« Ответ #4 : 05-09-2007 08:59 » 

А можно немного подробнее?
Записан
sss
Специалист

ru
Offline Offline

« Ответ #5 : 05-09-2007 09:01 » 

Да, при этом совсем забыл, а если обработка IRP происходит на повышенных IRQL тогда вообще придется создавать дополнительные очереди IRP, откладывать операции и выполнять их при обработке DeviceIoControl, при чем неизвестно что будет с тем кто будет ожидать.

1) Драйвер: Получил IRP
2) Драйвер: Пометил его как обрабатываемый
3) Драйвер: Сохранил в файл.
4) Драйвер: Вернул управление.
5) UserMode: взял из файла изменил и сохранил обратно.
6) UserMode: вызвал DeviceIoControl
7) Драйвер: Изменил данные отложенного IRP и передал ниже.

Наверняка не получиться  С ума сойти...
Записан

while (8==8)
HighLander
Постоялец

il
Offline Offline
Пол: Мужской

« Ответ #6 : 05-09-2007 11:07 » 

Спасибо, я попробую...
Записан
HighLander
Постоялец

il
Offline Offline
Пол: Мужской

« Ответ #7 : 05-09-2007 13:06 » 

Как можно находясь в IRP Write сохранить что-то в файл не выходя из этого IRP?
Записан
sss
Специалист

ru
Offline Offline

« Ответ #8 : 06-09-2007 06:40 » 

Если на повышенных IRQL - только пометить IRP IoMarkPending ( и все что там надо делать), затем с помощью WorkItem заказать вызов (который запишет в файл) на пониженном IRQL и вернуть управление.
Записан

while (8==8)
HighLander
Постоялец

il
Offline Offline
Пол: Мужской

« Ответ #9 : 07-09-2007 07:20 » 

Я извиняюсь за глупый вопрос, но я кажется не понимаю что-то базавое , и изза этого у меня много проблем.

Сколько копий драйвера есть? Одна для всех IRP, или для каждого IRP есть своя копия драйвера? А что с

глобальными переменными? В них я могу хранить информацию на протяжении всей жизни драйвера?

Если я помечаю IRP как Pending, что с ним происходит? Куда он идет? Где он ждет? Как мне потом продолжить

его? Если в то время как IRP помечен как Pending есть еще другие IRP которые я помечаю как Pending, как я

их различаю потом?

Огромное спасибо за терпение!!!
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 07-09-2007 07:34 » 

для всего одинакового оборудования драйвер(код) один. ссылка на драйвер -  объект DriverObject.

для разных физических устройств системой создаются физические объекты каждого устройства(PhysicalDeviceObject). для каждого устройства вызывается AddDevice вашего драйвера, где вы долны сами создать (IoCreateDevice) соответствующий объект устройства(DeviceObject) связанный с вашим драйвером.

IRP посылаются как бы объекту(DeviceObject) устройства, то есть вызывается один и тот же код драйвера но с разными указателями DeviceObject.

глобальные переменные - становятся общими для всех объектов. общую информацию вы можете хранить в глобальных переменных, однако если вам ПРОСТО нужна память для работы устройства - используйте DeviceExtension. либо непосредственно в ней, либо размещая ссылки. (у каждого объекта устройства будет свой DeviceExtension)

IRP... ээ... повторять долго масса книг уже есть- почитайте Вальтера Они книга выложена тут на сайте. по поводу различения IRP - вы воообще сами структуры посмотрите) где они объявлены, как они выглядят, что там за поля есть... и IRP и DeviceObject. половина вопросов снимется.. возникнут драугие)
« Последнее редактирование: 07-09-2007 07:36 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
sss
Специалист

ru
Offline Offline

« Ответ #11 : 07-09-2007 09:03 » 

Различать IRP придется с помощью очереди отложенных IRP. Эту очередь создать и поддерживать придется тебе самому. Вообще - это непростая задача, выполнимая но не простая. Что бы ее  решить, надо действительно разбираться с работой очередей IRP на уровне В. Они ( или лучше). Вообще - проще решать всю обработку IRP внутри драйвера...
Записан

while (8==8)
HighLander
Постоялец

il
Offline Offline
Пол: Мужской

« Ответ #12 : 08-09-2007 05:58 » 

Большое спасибо! Я проверю насчет всего что вы сказали...

Еще раз спасибо!
Записан
HighLander
Постоялец

il
Offline Offline
Пол: Мужской

« Ответ #13 : 10-09-2007 13:32 » 

"...однако если вам ПРОСТО нужна память для работы устройства - используйте DeviceExtension. либо непосредственно в ней, либо размещая ссылки. (у каждого объекта устройства будет свой DeviceExtension)..."

Как я могу обращатся к DeviceExtension и из драйвера и из программы в User Mode?
Записан
sss
Специалист

ru
Offline Offline

« Ответ #14 : 11-09-2007 01:02 » 

Нужно использовать MDL списки ( IoAllocateMdl).
Записан

while (8==8)
HighLander
Постоялец

il
Offline Offline
Пол: Мужской

« Ответ #15 : 11-09-2007 06:51 » 

Ok, спасибо! Я проверю это...
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #16 : 11-09-2007 07:22 » 

HighLander,
из драйвера вы к ней обращаетесь очень просто.
указатель на эту сруктуру всегда можно получить из DeviceObject->DeviceExtension.
из приложения К НЕЙ напрямую - обращатся не стоит из соображений стабильности системы.
не дай бог приложение порушит информацию драйвера - такой возможности надо избегать при любых обстоятельствах. какие бы ошибки приложение не делало - система падать не должна. это считайте за аксиому.

для общения с приложением выделите отдельный участок памяти. указатель на него храните в DevExt. по нему будете обращатся из драйвера. у приложения будет свой указатель на ту же память.
система такая:
выделение памяти:
h0 = ExAllocatePool( NonPagedPool,sizeof(AAA));
создаете под нее MDL:
pMdl= IoAllocateMdl(h0, sizeof(AAA), FALSE, FALSE, NULL);
    if (!(pMdl))
    {
        return STATUS_SH01D_INSUFFICIENT_RESOURCES_MEM;
    };
    MmBuildMdlForNonPagedPool(pMdl);
отдаете прилоежению (вызывать в контесте конечного приложения!!!!! например при вызове IOCTL от данного приложения):
   h3 = MmMapLockedPagesSpecifyCache(pMdl,UserMode,MmCached,NULL,FALSE,NormalPagePriority);
все....далее делаете с ней что хотите:
h3 - хендел для приложения. его отдаете приложению и оно работает с ним как с обычной памятью через h3->...
драйвер работает с той де памятью через h0->...


удаление в обратном порядке
размапируете от приложения(вызывать в контексте того же приложения (например по IOCTL):
__try //попытка защиты от вызова из другого процесса! впрочем корректнее было бы проверять Handle вызывающего процесса
{
  ProbeForWrite(h3,sizeof(AAA)...);
  MmUnmapLockedPages(h3,pMdl);
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
   KdPrint(( "XXX:__except:ProbeForWrite(h3... \n"));
};
Удаляете MDL и саму память:
IoFreeMdl(pMdl);
ExFreePool(h0);


PS о каждой команде - ВНИМАТЕЛЬНО почитайте DDK.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines