через память. реально. размещаешь драйвером 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) в пользовательский режим (на верх), при попытки записи он выдает исключение, и по содержанию не то что я записывал..
Что может быть не верно?
кстати, где учитесь? в последнее время наплыв дипломников и народа с курсовыми)
Пермский Гос.Тех.Уне.