在线笔记
全部博文(596)
分类: Windows平台
2014-09-30 11:49:16
http://my.oschina.net/xtxb/blog/58012
微软XPDM驱动模型中,显示驱动分为两个部分:display driver和miniport driver。display driver主要负责渲染,miniport driver主要负责与硬件交互及资源管理(内存等)。桌面云显示协议中,需要通过服务端将显示指令remote到客户端,display driver(内核态)和服务端(用户态)需要通过共享内存的方式来传递信息,本文简要描述可能的共享内存方案。
大体上来说,可能的方案有:内存映射文件、MDL、section内存。RDP、Citrix thinwire都用到了section内存机制(RDP用的是未公开接口的函数engmapsection)。本文将简要描述section内存机制。
首先是miniport driver调用ZwCreateSection得到一大块内存,之后调用MmMapViewInSystemSpace(中间过程将调用ObReferenceObjectByHandle)将内存映射到内核空间,之后display driver通过调用EngDeviceIoControl得到该内存在内核空间的地址。对应的内存释放函数为(MmUnmapViewInSystemSpace、ObDereferenceObject、ZwClose)。
需要指出的是,需要在注册表中设置以下选项,才能申请到较大的section内存块,否则将可能导致蓝屏。[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management]
"SystemViewSize"=dword:00000100(大小设置成256M)。
接着miniport driver调用ZwMapViewOfSection将内存映射到服务端进程所在的用户地址空间(中间过程有ObOpenObjectByPointer,对应析构过程为ZwClose、ZwUnmapViewOfSection)。
这样服务端和display driver就可以通过Section内存传递信息了。
实际上,内存映射文件机制更简单些,然而,本人找不出任何方法能够让其映射大块内存(如64M)。如果你知道方法,请务必说一声哦!
MDL还未研究过,以后熟悉了再说。