darkread
驱动牛犊
驱动牛犊
  • 注册日期2003-01-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:965回复:0

各位.怎样在处理IRP_MJ_DEVICE_CONTROL的过程中申请一块内存啊?

楼主#
更多 发布于:2004-05-09 09:51
我在Passthru的框架下注册了设备名,可以使用DeviceIoControl了
但是
我通过DeviceIoControl,向passthru传输了一点数据
CTL_CODE是这样的!
#define IO_SET_FIRE_RULE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x931, METHOD_BUFFERED, FILE_ANY_ACCESS)
因为,传入的数据是来自用户的,所以我就在在处理这个请求的时候分配内存
开始我以为用NdisAllocateMemory(&pTemp,inSize,0,HighestAcceptableMax)就可以了,分配成功,但是这片内存不能写入数据,哪怕是pTemp[0] = 1 也不行,立刻重启
我也搞不清楚这里有什么玄机,所有我有改了一种方式
inSize = pIOstack->Parameters.DeviceIoControl.InputBufferLength;
pTemp = ExAllocatePool(NonPagedPool,inSize);//分配一块不分页的内存,gSystemVirtualAddress指向它
gFireRuleMDL = IoAllocateMdl(pTemp,inSize,FALSE,FALSE,NULL);//把这块内存和Mdl挂接起来
MmBuildMdlForNonPagedPool(gFireRuleMDL);//填充Mdl信息,使它能正确描述这块区域
问题还是存在,不写数据没问题,一写入数据就重启,各位在处理IRP_MJ_DEVICE_CONTROL的时候,分配内存是不是有所讲究的,为什么一写入数据就会重启,而我在DriverEntry的时候同样分配了内存,没有问题,我在PtReceive()中用NdisAllocateMemory也没有问题

此外我还想多问一句,这NdisAllocateMemory和ExAllocatePool有什么区别,MDL的作用是不是用来在内存系统空间到用户空间之间转换的时候使用的.
请各位指教,同时也是救命啊
游客

返回顶部