阅读:1156回复:6
我这段代码错了吗?特急
我在filemon中编写如下代码,这是关于驱动和应用层共享内存的:
case IOCTL_FILEMON_VERSION: SystemVirtualAddress = AllocatePool(NonPagedPool, 1024); Mdl = IoAllocateMdl(SystemVirtualAddress, 1024, FALSE, FALSE, NULL); if(Mdl) { MmBuildMdlForNonPagedPool(Mdl);// 将分配的内存映射到用户进程地址空间,并返回地址。 UserVirtualAddress= MmMapLockedPages(Mdl, UserMode); (PVOID) InputBuffer = UserVirtualAddress; //*(PVOID*) InputBuffer = UserVirtualAddress; ........... } 这段代码老是让计算机重启。 我调试了一下,好像是MmMapLockedPages()有错误,不知道为什么? 我调试了两天,都没有搞出来。 请各位帮我查一下。 [编辑 - 12/10/04 by aasa2] [编辑 - 12/10/04 by aasa2] |
|
|
沙发#
发布于:2004-12-10 15:00
应该这样吧: *(PULONG )InputBuffer = UserVirtualAddress ; 我感觉你这儿有问题 |
|
板凳#
发布于:2004-12-10 15:09
有道理!! |
|
|
地板#
发布于:2004-12-10 15:39
应该这样吧!
*(PVOID*) InputBuffer = UserVirtualAddress; 但是,我这样写,就会重启。 PVOID InputBuffer = UserVirtualAddress; 好像应用层不能获得数据。 好奇怪! 大家清看看我的定义: PVOID SystemVirtualAddress, UserVirtualAddress; InputBuffer = Irp->AssociatedIrp.SystemBuffer; 到底是什么原因呢? |
|
|
地下室#
发布于:2004-12-10 16:54
你是不是要在内核分配共享内存,然后把共享内存的地址返回用户空间?
如果是,那么就应该用OutputBuffer来存放返回的地址,而不是InputBuffer。 不知道我说得对不。^_^ |
|
|
5楼#
发布于:2004-12-10 19:20
*(PVOID*) InputBuffer = UserVirtualAddress;
重启?在什么时候? 如果是2K的话,用MmMapLockedPagesSpecifyCache |
|
6楼#
发布于:2004-12-10 22:09
*((PVOID *)(Irp->AssociatedIrp.SystemBuffer)) = UserVirtualAddress;
还有就是应该在DRIVERENTRY里分配内存,而不要在DEVICEIOCONTROL里分配. DRIVERENTRY里 SystemVirtualAddress = ExAllocatePool(NonPagedPool, 1024); Mdl = IoAllocateMdl(SystemVirtualAddress, 1024, FALSE, FALSE, NULL); MmBuildMdlForNonPagedPool(Mdl); 在DISPTACH里 case IOCTL_FILEMON_VERSION: try { //UserVirtualAddress = MmMapLockedPages(Mdl, UserMode); UserVirtualAddress = MmMapLockedPagesSpecifyCache(Mdl, UserMode,MmCached,NULL,FALSE,NormalPagePriority ); *((PVOID *)(Irp->AssociatedIrp.SystemBuffer)) = UserVirtualAddress; } except(EXCEPTION_EXECUTE_HANDLER){} |
|
|