我来我网
https://5come5.cn
 
您尚未 登录  注册 | 菠菜 | 软件站 | 音乐站 | 邮箱1 | 邮箱2 | 风格选择 | 更多 » 
 

本页主题: 有人做过驱动吗?win32下怎么样把核心内存映射到用户模式?? 显示签名 | 打印 | 加为IE收藏 | 收藏主题 | 上一主题 | 下一主题

coolboy





性别: 保密 状态: 该用户目前不在线
等级: 品行端正
发贴: 252
威望: 0
浮云: 1107
在线等级:
注册时间: 2005-10-02
最后登陆: 2016-04-25

5come5帮你背单词 [ soil /soil/ v. 弄脏,污损 n. 泥土,土壤;vt. 弄脏;vi. 变脏 ]


有人做过驱动吗?win32下怎么样把核心内存映射到用户模式??

如题,核心地址空间分配的内存,想和用户态的进程共享。
顶端 Posted: 2007-06-11 11:24 | [楼 主]
coolboy





性别: 保密 状态: 该用户目前不在线
等级: 品行端正
发贴: 252
威望: 0
浮云: 1107
在线等级:
注册时间: 2005-10-02
最后登陆: 2016-04-25

5come5帮你背单词 [ tangle /'tæŋgl/ v. (使)纠缠,(使)混乱 ]


Quote:
引用第2楼kingbird于2007-06-11 23:59发表的:
你说的是驱动共享内存与应用层的通信吧
很麻烦的,稍不注意就容易造成蓝屏的
主要是过程还是在应用层上的程序利用你所要调用的对象设备的名称创建句柄
再利用createiocontrol()实现内存的共享。

感谢回复,我现在的问题是,驱动没办法用标准的IOCTL同应用层通信,无法创建符号链接,无法用IRP(显示驱动,有点特殊,非WDM),而且数据量比较大,考虑到效率问题,我打算在内核分配内存,然后映射到用户地址空间,这样也省去了memcpy的过程。
顶端 Posted: 2007-06-12 10:20 | [1 楼]
coolboy





性别: 保密 状态: 该用户目前不在线
等级: 品行端正
发贴: 252
威望: 0
浮云: 1107
在线等级:
注册时间: 2005-10-02
最后登陆: 2016-04-25

5come5帮你背单词 [ alarm /ə'la:m/ n. 惊恐,报警,警报器;vt. 使…惊恐,向…报警 ]


Quote:
引用第3楼kaby于2007-06-12 00:07发表的:
1.印象中有现成函数,网上肯定有大把的源代码自己google,还有DDK。
2.记忆中应该用起来应该比较**:当时目的是内核区与用户区大规模的数据交换,经分析得出用SOCKET是而不是映射内存会比较靠谱。
全不记得了,以上[屏蔽]仅供参考。

晕,核心态能用SCOKET吗?好像不能吧。。。
顶端 Posted: 2007-06-12 10:23 | [2 楼]
coolboy





性别: 保密 状态: 该用户目前不在线
等级: 品行端正
发贴: 252
威望: 0
浮云: 1107
在线等级:
注册时间: 2005-10-02
最后登陆: 2016-04-25

5come5帮你背单词 [ idea /ai'diə/ n. 主意,想法,概念,思想,计划,建议 ]


问题已解决,贴点代码,希望对后来人有帮助。
   pKernelAddress = ExAllocatePoolWithTag(PagedPool, psm->length, _MemTag);
   if (pKernelAddress == NULL)
   {
       ........
       return    ERROR;
   }

   pMdl = IoAllocateMdl(pKernelAddress, length, FALSE, FALSE, NULL);
   if (pMdl == NULL)
   {
                            ........
       ExFreePool(psm->pKernelAddress);
       return    ERROR;
   }

   try
   {
       MmProbeAndLockPages(pMdl,KernelMode ,IoReadAccess);
   }
   except (EXCEPTION_EXECUTE_HANDLER)
   {
       ........
       IoFreeMdl(psm);
       ExFreePool(pKernelAddress);
       return    ERROR;
   }
   

   try
   {
       pUserAddress = MmMapLockedPagesSpecifyCache(pMdl, UserMode, MmNonCached, NULL, FALSE, NormalPagePriority);

   }
   except (EXCEPTION_EXECUTE_HANDLER)
   {
                            ........
       MmUnmapLockedPages(pKernelAddress,pMdl);
       IoFreeMdl(pMdl);
       ExFreePool(pKernelAddress);
       return ERROR;
   }

我用的仅仅是分页池内存,非分页池映射方法不大一样,懒得研究了,头都大了。
顶端 Posted: 2007-06-14 00:33 | [3 楼]
coolboy





性别: 保密 状态: 该用户目前不在线
等级: 品行端正
发贴: 252
威望: 0
浮云: 1107
在线等级:
注册时间: 2005-10-02
最后登陆: 2016-04-25

5come5帮你背单词 [ organize /'o:gənaiz/ n. 组织,安排,筹办 ]


Quote:
引用第8楼disneycheng于2007-06-13 23:17发表的:
考虑attach然后物理内存。嘿嘿。方法是有的呵呵。。。

怎样attach?说出来大家学习学习啊。
顶端 Posted: 2007-06-14 00:42 | [4 楼]
coolboy





性别: 保密 状态: 该用户目前不在线
等级: 品行端正
发贴: 252
威望: 0
浮云: 1107
在线等级:
注册时间: 2005-10-02
最后登陆: 2016-04-25

5come5帮你背单词 [ counterfoil // n. 存根 ]


Quote:
引用第15楼aaronnicholas于2007-06-21 17:13发表的:


你这种方法是有问题的,如果你把页面锁在物理内存中,当你的用户进程被意外终止,而被锁页面没有解锁,就会BSOD.

请达人帮忙,讲一下你提到的section map的方法,谢谢!!
顶端 Posted: 2007-06-21 21:05 | [5 楼]
我来我网·5come5 Forum » 程序员之家

Total 0.011762(s) query 6, Time now is:11-23 12:25, Gzip enabled
Powered by PHPWind v5.3, Localized by 5come5 Tech Team, 黔ICP备16009856号