Здравствуйте, Мечтатель, Вы писали:
М>Не подскажите, можно ли передавать из программы драйверу и наоборот. большие объемы инфы. М>примерно 50-70 мб. за один запрос. М>(не частями !!!)
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Здравствуйте, Мечтатель, Вы писали:
М>Здравствуйте.
М>Не подскажите, можно ли передавать из программы драйверу и наоборот. большие объемы инфы. М>примерно 50-70 мб. за один запрос. М>(не частями !!!)
Вот тебе ф-ция, к-я возвращает указатель валидный для использования в user-mode,
ну а передать данный указатель приложению можешь с помощью какого-нибудь IOCTL.
//////////////////////////////////////////////////////////////////////////
//mapping kernel address memory to user space
PVOID MapMemoryAddress(IN PVOID pAddrToMap, ULONG Size, OUT PMDL* ppMdl)
{
PVOID pAddress = 0;
PMDL mdl = 0;
if (!pAddrToMap || !Size || !ppMdl) return NULL; //invalid parameters
mdl = IoAllocateMdl(pAddrToMap, Size, FALSE, FALSE, NULL);
if (NULL == mdl) return NULL;
MmBuildMdlForNonPagedPool(mdl);
pAddress = MmMapLockedPages(mdl, UserMode);
if( NULL == pAddress ) {
IoFreeMdl(mdl);
return NULL;
}
*ppMdl = mdl; // Save the MDL pointerreturn (PVOID) ((ULONG)PAGE_ALIGN(pAddress) + MmGetMdlByteOffset(mdl));
}
После использования данных приложением надо указатель размепить.
Это была передача данных из kernel mod'a в user mod.
Если надо наоборот (user to kernel), то пусть приложение с помощью IOCTL передает драйверу указатель на данные.
Драйвер фиксирует страницы в памяти и работает с ними (в общем ф-ция будет похожая).
Здравствуйте, Мечтатель, Вы писали:
М>Здравствуйте.
М>Не подскажите, можно ли передавать из программы драйверу и наоборот. большие объемы инфы. М>примерно 50-70 мб. за один запрос. М>(не частями !!!)
Можно воспользоваться функцией DeviceIoControl (IRP_MJ_DEVICE_CONTROL в KM), если все правильно сделать. Во-первых, IOCTL-код должен быть определен с METHOD_NEITHER. В этом случае указатель на входной буфер содержится в IrpSp->Parameters.DeviceIoControl.Type3InputBuffer, а на выходной — в Irp->UserBuffer.
Во-вторых, это накладывает некоторые ограничения: для работы с указателями необходимо находиться в контексте вызывающего потока, IRQL=PASSIVE_LEVEL, и д.р. Или создавать MDL, но для таких объемов памяти это может оказаться дорогостоящей операцией.
В виду того, что при использовании данного метода нет необходимости создавать какие-либо маппинги и проч. метод являтся, пожалуй, самым быстрым.
Здравствуйте, Мечтатель, Вы писали:
М>Не подскажите, можно ли передавать из программы драйверу и наоборот. большие объемы инфы. М>примерно 50-70 мб. за один запрос. М>(не частями !!!)
можно
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Кстати, столкнулся с тем, что под WinXP IoAllocateMdl не может разместить больше 64Мбайт и попробовал использовать MmCreateMdl, которая в DDK помечена как устаревшая, но у меня работает и под Win98/2000/XP.
И еще, передаю в user mode непосредственно pAddress, не используя
((ULONG)PAGE_ALIGN(pAddress) + MmGetMdlByteOffset(mdl))
тоже все корректно работает
Правда, не знаю чем вы размещаете память
я размещаю HalAllocateCommonBuffer (тоже устаревшая, и тоже работает )