Передача данных User mode <-> Kernel mode
От: Мечтатель  
Дата: 19.09.05 11:19
Оценка:
Здравствуйте.

Не подскажите, можно ли передавать из программы драйверу и наоборот. большие объемы инфы.
примерно 50-70 мб. за один запрос.
(не частями !!!)
Re: Передача данных User mode <-> Kernel mode
От: gear nuke  
Дата: 19.09.05 12:52
Оценка:
Здравствуйте, Мечтатель, Вы писали:

М>Не подскажите, можно ли передавать из программы драйверу и наоборот. большие объемы инфы.

М>примерно 50-70 мб. за один запрос.
М>(не частями !!!)

How To Share Memory Between User Mode and Kernel Mode
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
Re: Передача данных User mode <-> Kernel mode
От: onyx2 Украина  
Дата: 19.09.05 14:46
Оценка:
Здравствуйте, Мечтатель, Вы писали:

М>Здравствуйте.


М>Не подскажите, можно ли передавать из программы драйверу и наоборот. большие объемы инфы.

М>примерно 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 pointer
    return (PVOID) ((ULONG)PAGE_ALIGN(pAddress) + MmGetMdlByteOffset(mdl));
}



После использования данных приложением надо указатель размепить.
Это была передача данных из kernel mod'a в user mod.

Если надо наоборот (user to kernel), то пусть приложение с помощью IOCTL передает драйверу указатель на данные.
Драйвер фиксирует страницы в памяти и работает с ними (в общем ф-ция будет похожая).
www.cubik.biz
Re: Передача данных User mode <-> Kernel mode
От: htfv Беларусь  
Дата: 19.09.05 15:44
Оценка:
Здравствуйте, Мечтатель, Вы писали:

М>Здравствуйте.


М>Не подскажите, можно ли передавать из программы драйверу и наоборот. большие объемы инфы.

М>примерно 50-70 мб. за один запрос.
М>(не частями !!!)

Можно воспользоваться функцией DeviceIoControl (IRP_MJ_DEVICE_CONTROL в KM), если все правильно сделать. Во-первых, IOCTL-код должен быть определен с METHOD_NEITHER. В этом случае указатель на входной буфер содержится в IrpSp->Parameters.DeviceIoControl.Type3InputBuffer, а на выходной — в Irp->UserBuffer.

Во-вторых, это накладывает некоторые ограничения: для работы с указателями необходимо находиться в контексте вызывающего потока, IRQL=PASSIVE_LEVEL, и д.р. Или создавать MDL, но для таких объемов памяти это может оказаться дорогостоящей операцией.

В виду того, что при использовании данного метода нет необходимости создавать какие-либо маппинги и проч. метод являтся, пожалуй, самым быстрым.

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/kmarch/hh/kmarch/IRPs_92d91ed0-20c7-4494-9bf4-9af7026e1a9a.xml.asp
http://www.osronline.com/article.cfm?id=94
Re: Передача данных User mode <-> Kernel mode
От: Valery A. Boronin Россия linkedin.com/in/boronin
Дата: 20.09.05 00:48
Оценка:
Здравствуйте, Мечтатель, Вы писали:

М>Не подскажите, можно ли передавать из программы драйверу и наоборот. большие объемы инфы.

М>примерно 50-70 мб. за один запрос.
М>(не частями !!!)
можно

Re: доступ к памяти пользовательского режима в режиме ядра
Автор: Valery A. Boronin
Дата: 01.06.05
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
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.
Re[2]: Передача данных User mode <-> Kernel mode
От: dorador Россия  
Дата: 20.09.05 08:21
Оценка:
Здравствуйте, onyx2, Вы писали:

O>    mdl = IoAllocateMdl(pAddrToMap, Size, FALSE, FALSE, NULL);

Кстати, столкнулся с тем, что под WinXP IoAllocateMdl не может разместить больше 64Мбайт и попробовал использовать MmCreateMdl, которая в DDK помечена как устаревшая, но у меня работает и под Win98/2000/XP.

И еще, передаю в user mode непосредственно pAddress, не используя
((ULONG)PAGE_ALIGN(pAddress) + MmGetMdlByteOffset(mdl))
тоже все корректно работает

Правда, не знаю чем вы размещаете память
я размещаю HalAllocateCommonBuffer (тоже устаревшая, и тоже работает )
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.