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

版主Asmsys和兄弟们,我碰到郁闷的问题了,大家进啊?

楼主#
更多 发布于:2004-05-09 09:18
我通过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的作用是不是用来在内存系统空间到用户空间之间转换的时候使用的.
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2004-05-09 12:28
你的pTemp是什么?注意要一个 PVOID *
darkread
驱动牛犊
驱动牛犊
  • 注册日期2003-01-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-05-09 16:47
一定要一个PVOID吗?
如果我嗜一个PUCHAR pTemp
在用得时候转换行不啊
就是嘉一个(PVOID*)(&pTemp)

在C中如果没有指明应该都是32bit得长指针吧?
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-05-10 08:54
这是通用的方法呀,我都用了N次了,你多贴点代码出来看看。
shark77777
驱动牛犊
驱动牛犊
  • 注册日期2004-04-15
  • 最后登录2004-08-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-05-27 15:53
难道DeviceIoControl不是通过IRP进行数据传输的吗?在传入的IRP中不是有Parameters.DeviceIoControl.IoControlCode表示CTL_CODE,Irp->AssociatedIrp.SystemBuffer为Input的数据,Parameters.DeviceIoControl.InputBufferLength表示该数据的长度???还需要再次分配空间吗?
游客

返回顶部