Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1570151
  • 博文数量: 596
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 173
  • 用 户 组: 普通用户
  • 注册时间: 2016-07-06 15:50
个人简介

在线笔记

文章分类

全部博文(596)

文章存档

2016年(1)

2015年(104)

2014年(228)

2013年(226)

2012年(26)

2011年(11)

分类: 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还未研究过,以后熟悉了再说。

阅读(1903) | 评论(0) | 转发(0) |
0

上一篇:常用工具集

下一篇:WDM WDF支持的操作系统

给主人留下些什么吧!~~