阅读:1392回复:4
版主Asmsys和兄弟们,我碰到郁闷的问题了,大家进啊?
我通过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的作用是不是用来在内存系统空间到用户空间之间转换的时候使用的. |
|
沙发#
发布于:2004-05-09 12:28
你的pTemp是什么?注意要一个 PVOID *
|
|
板凳#
发布于:2004-05-09 16:47
一定要一个PVOID吗?
如果我嗜一个PUCHAR pTemp 在用得时候转换行不啊 就是嘉一个(PVOID*)(&pTemp) 在C中如果没有指明应该都是32bit得长指针吧? |
|
地板#
发布于:2004-05-10 08:54
这是通用的方法呀,我都用了N次了,你多贴点代码出来看看。
|
|
地下室#
发布于:2004-05-27 15:53
难道DeviceIoControl不是通过IRP进行数据传输的吗?在传入的IRP中不是有Parameters.DeviceIoControl.IoControlCode表示CTL_CODE,Irp->AssociatedIrp.SystemBuffer为Input的数据,Parameters.DeviceIoControl.InputBufferLength表示该数据的长度???还需要再次分配空间吗?
|
|