Разделяемая память
От: AlexCasual  
Дата: 13.06.12 11:42
Оценка:
Заезженная тема,но что-то туплю :


LONG  Size       = 0;
PVOID UserMemory = NULL;
PVOID Memory     = NULL;
PMDL  Mdl        = NULL;

__try
{
   Memory = ExAllocatePool(NonPagedPool,Size);
   if(Memory)
   {
      Mdl = IoAllocateMdl(Memory,Size,FALSE,FALSE,NULL);
      if(Mdl)
      {
    MmBuildMdlForNonPagedPool(Mdl);
            
    UserMemory = MmMapLockedPagesSpecifyCache(Mdl,UserMode,MmCached,NULL,FALSE,NormalPagePriority);
      }
   }
}
__except(EXCEPTION_EXECUTE_HANDLER){}


Затем я передаю UserMemory адрес в приложение.
Но по какому адресу мне в драйвере обращаются к выделенной памяти? — Memory? — происходит PAGE_FAULT,UserMemory — та же история....
Задача банальна — разделить память между приложением и драйвером,организовав в ней что-то на подобии очереди объектов...
Re: Разделяемая память
От: x64 Россия  
Дата: 13.06.12 12:04
Оценка:
AC>Заезженная тема,но что-то туплю:

Во-первых, откуда у тебя там #PF, если Memory выделяется из NP-пула, покажи дамп.
Во-вторых, MmMapLockedPagesSpecifyCache() нужно делать в контексте целевого процесса.
В-третьих, в драйвере обращаться надо, разумеется, по адресу, полученному от ExAllocatePool().

AC>Задача банальна — разделить память между приложением и драйвером,организовав в ней что-то на подобии очереди объектов...


А уверен, что именно разделяемая память тебе тут лучше всего подойдёт?
Может, тупо складировать информацию в буфер и затем выгребать её периодически?
А если надо сразу данные передавать, тогда есть inverted calls, — с буферами возиться не придётся.
Re: Разделяемая память
От: AlexCasual  
Дата: 14.06.12 11:42
Оценка:
x64,спасибо что откликнулся.С #PF проблему решил,там просто моя тупость была с обращениями к памяти.

AC>А уверен, что именно разделяемая память тебе тут лучше всего подойдёт?

Может, тупо складировать информацию в буфер и затем выгребать её периодически?
А если надо сразу данные передавать, тогда есть inverted calls, — с буферами возиться не придётся.

Мне необходимо достаточно резво реагировать в user-mode на события из драйвера,я думаю использовать очередь в разделяемой памяти,записывать из драйвера информацию в очередь и обрабатывать её в приложении.

inverted calls — а вот про это я не в курсе...
Re[2]: Разделяемая память
От: sobko  
Дата: 14.06.12 12:30
Оценка:
Здравствуйте, AlexCasual, Вы писали:

AC>inverted calls — а вот про это я не в курсе...


Для начала можно почитать http://www.osronline.com/article.cfm?id=94, потом поробовать поискать примеры с использованием safe queue (IoCsqInitialize). В файловых минифильтрах fltmgr имеет свою реализацию (FilterGetMessage)
Re[3]: Разделяемая память
От: AlexCasual  
Дата: 14.06.12 14:08
Оценка:
Здравствуйте, sobko, Вы писали:

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


AC>>inverted calls — а вот про это я не в курсе...


S>Для начала можно почитать http://www.osronline.com/article.cfm?id=94, потом поробовать поискать примеры с использованием safe queue (IoCsqInitialize). В файловых минифильтрах fltmgr имеет свою реализацию (FilterGetMessage)


Думаю мне не подходит отложенная обработка.Разделяемая очередь должна подойти...
Re[4]: Разделяемая память
От: kulinich  
Дата: 14.06.12 15:55
Оценка:
Здравствуйте, AlexCasual, Вы писали:

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


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


AC>>>inverted calls — а вот про это я не в курсе...


S>>Для начала можно почитать http://www.osronline.com/article.cfm?id=94, потом поробовать поискать примеры с использованием safe queue (IoCsqInitialize). В файловых минифильтрах fltmgr имеет свою реализацию (FilterGetMessage)


AC>Думаю мне не подходит отложенная обработка.Разделяемая очередь должна подойти...


Может вот эта статья поможет?
http://habrahabr.ru/post/144507/
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.