Пишу драйвер приема информации (Numega DriverWorks C++ framework).
Такая вот задачка возникла:
Есть буфер num блоков по bsize и user_ptr на него:
ptr = new (NonPagedPool) BYTE[bsize*num]; // bsize кратно PAGE_SIZE
mdl = new (NonPagedPool) KMemory(ptr, bsize*num);
user_ptr = mdl->MapToUserSpace(); // в контексте user-проги
Есть еще отдельный блок размером bsize,
отображенный только в system space:
reserved = new (NonPagedPool) BYTE[bsize];
Пусть k — номер "плохого" (для драйвера;-) блока из ptr:
bad = ptr + k*bsize;
Как сделать, чтобы блок reserved стал отображаться туда,
куда отображается блок bad?
Точнее, как отобразить блок reserved в адресные пространствах драйвера и user-проги
туда, куда отображался блок bad, и снять отображения блока bad
(или отобразить его в системные виртуальные адреса блока reserved)
(при условии, что я в контексте проги)?
Пытался смотреть DDK-функции MmXxx, пока туго... Плохо, что описания MDL толком нет...