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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Организация обмена между драйвером и пользовательской программой.  (Прочитано 7642 раз)
0 Пользователей и 1 Гость смотрят эту тему.
GerontDev1
Гость
« : 01-04-2008 16:06 » 

Есть драйвер виртуального диска, пока хранятся данные в файле. Я пытаюсь, чтобы он за данными обращался наверх к пользовательской программе.
Мне необходимо организовать обмен между драйвер <-> пользовательская программа. Для этого есть событие (Event) приходящие из драйвера (в моменты r/w), после которого должен идти обмен данными.
Я уже пытался всунуться к драйверу через DeviceIoControl, но все стопорится на CreateFile…  Не понял
Думал организавать доступный буфер для драйвера и пользовательской программы,  как понял это не реально, или  ?  Здесь была моя ладья...
Сейчас, думаю уже через Named Pipe делать … ! ?
Кто что может подсказать  !!! ?? А черт его знает...
Это диплом, что-то вроде RAID системы сделать нужно, уже 1 месяц остался… С ума сойти...
Записан
Ochkarik
Модератор

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

« Ответ #1 : 02-04-2008 06:30 » 

через Read/WriteFile можно, в чем стопорится может - не понимаю) там вроде все прозрачно...?
Через IOCTL.
через память. реально. размещаешь драйвером NonPagedPool(впрочем можно и Paged наверное) буфер, создаешь для него MDL и инициализируешь.
потом важно - в контексте пользовательского приложения отмапировать память в пространство вызываемого процесса - MmMapLockedPagesSpecifyCache (или MmMapLockedPages) с параметром UserMode.
передаешь получившийся указатель приложению и пользуешь его там. в драйвере используешь указатель от ExAllocatePool.

через память - будет быстро... но через Read/Write наверное правильнее? хотя специфику работы не совсем понял.

кстати, где учитесь? в последнее время наплыв дипломников и народа с курсовыми)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
GerontDev1
Гость
« Ответ #2 : 02-04-2008 16:17 » 

через память. реально. размещаешь драйвером NonPagedPool(впрочем можно и Paged наверное) буфер, создаешь для него MDL и инициализируешь.
потом важно - в контексте пользовательского приложения отмапировать память в пространство вызываемого процесса - MmMapLockedPagesSpecifyCache (или MmMapLockedPages) с параметром UserMode.
передаешь получившийся указатель приложению и пользуешь его там. в драйвере используешь указатель от ExAllocatePool.
Вот что написал вариант:  Скромно так...
PBUFFER_DATA_INFORMATION - указатель на структура, которая передается дальше передается в пользовательский режиме.
device_extension: {
...
 PBUFFER_DATA_INFORMATION _pbuf;//Буффер обмена
 PMDL  _pMdl_buf; //MDL
 PVOID _pUserVoid;//Аддрес для  пользователя
}.
//--------------------- Код --------------------------------------------------
device_extension->_pbuf = (PBUFFER_DATA_INFORMATION) ExAllocatePool(NonPagedPool, PAGE_SIZE);
if(device_extension->_pbuf != NULL)
{
 device_extension->_pbuf->sizebufferfull = PAGE_SIZE;
 device_extension->_pUserVoid = NULL;
 device_extension->_pMdl_buf= IoAllocateMdl(device_extension->_pbuf,
  device_extension->_pbuf->sizebufferfull, FALSE, FALSE, NULL);
 if(device_extension->_pMdl_buf == NULL)  ... else ...
 MmBuildMdlForNonPagedPool(device_extension->_pMdl_buf);
 device_extension->_pUserVoid = MmMapLockedPagesSpecifyCache(device_extension->_pMdl_buf,
   UserMode, MmCached, NULL, FALSE,  NormalPagePriority);
 if(device_extension->_pUserVoid == NULL)  ... else ...
  device_extension->_pbuf->dwByteOffset.QuadPart = 1;
  device_extension->_pbuf->dwSize = 1;
  device_extension->_pbuf->status = 1;
  device_extension->_pbuf->ucCommand = 1;
}
//--------------------- end ----------------------------------
Далее передаю адрес (device_extension->_pUserVoid) в пользовательский режим  (на верх), при попытки записи он выдает исключение, и по содержанию не то что я записывал..  Быть такого не может Не понял
Что может быть не верно?
кстати, где учитесь? в последнее время наплыв дипломников и народа с курсовыми)
Пермский Гос.Тех.Уне.
Записан
Ochkarik
Модератор

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

« Ответ #3 : 03-04-2008 08:38 » 

все верно Класс!
но Не-а...
в контексте пользовательского приложения отмапировать память
MmMapLockedPagesSpecifyCache - не просто вызвать, а в контексте приложения! то есть приложение должно вызвать функцию драйвера в которой происходит мапирование. текущий процесс должнен быть пользовательским. а не произвольным.
а ты, я подозреваю это во время инициализации драйвера делал... так?) соответственно отмапировал память в системный процесс)
короче, помести этот код напрмиер в какой нибудь DeviceIOCTL(у меня), или в обработчик CreateFile. чей процесс откроет - туда и отмапируется. кстати одну и ту же память можно мапировать одновременно в несколько процессов.

кстати,
"If AccessMode is UserMode and the specified pages cannot be mapped, the routine raises an exception. Callers that specify UserMode must wrap the call to MmMapLockedPagesSpecifyCache in a try/except block. For more information, see Handling Exceptions."
впрочем я подозреваю это для жестко заданного конечного адреса - у меня долгое время работало и без этого.
и не забудь размапировать в конце работы. впрочем, думаю это при завершении процесса все равно происходит.
в DDK еще пару действий рекомендуют выполнить... но это сам посмотришь)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
GerontDev1
Гость
« Ответ #4 : 03-04-2008 13:52 » 

Способа большое! Исправил, заработало!!  Класс!

Принципе для учебной задачи после работы хоть в черный экран выпадай...
Но все-таки удаление, что вроде этого сдал:
//--------------------- Код --------------------------------------------------
try
{
 MmUnmapLockedPages(device_extension->_pUserVoid, device_extension->_pMdl_buf);
}
 __except(EXCEPTION_EXECUTE_HANDLER)
{
  KdPrint(( "__except \n"));
}
 IoFreeMdl(device_extension->_pMdl_buf);
 ExFreePool(device_extension->_pbuf);
//--------------------- end ----------------------------------
 Скромно так...
Записан
Ochkarik
Модератор

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

« Ответ #5 : 04-04-2008 07:40 » 

))) да, для учебной задачки неплохо))
удачи)
Записан

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

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines