在实际开发过程中,经常希望能在应用程序中直接读写设备的物理空间。以前在做WinCE6.0下的MEMMgr时通过秘密加载一个内核态驱动实现了这个需求。但这种方式有一个明显的缺陷,每次读写都必须经由它才能完成。如果只是读取GPIO,那问题不算大。如果想通过这种方式实现视频播放的加速就比较困难了。估计非但不能加速,反而会变得更慢。

早先曾与ZL仔细的讨论过这个问题,他当时在WinCE6.0上移植TCPMP,发现播放视频不太流畅,于是想通过直接写显存进行加速。目的很明确,在应用中申请一段虚拟空间,通过某种方法将其映射到显存上,视频解码过程中直接往映射过的虚拟空间上写。这种方法与使用GAPI有一点类似。

实现这个需求,需要用到函数VirtualCopyEx()。看看帮助中关于它的说明,This function dynamically maps a virtual address to a physical address by creating a new page-table entry.This function is callable in kernel mode and in user mode, when the source and destination process handles are the active process.This function is similar to VirtualCopy, except VirtualCopyEx requires handles to the source and destination process.

据此基本可以确定,我们的确可以在应用中申请一段虚拟空间,然后通过这个函数将其映射到某段物理空间上。其中目标进程是我们的应用,而源进程是NK.exe。为了实现在NK.exe中执行VirtualCopyEx(),可以加载一个内核态的驱动。更为方便的方法是移植一个OALIOCTL,并在IOControl()中添加一个case。这样,应用程序在做内存映射时就无需打开某个流驱动,直接调用KernelIoControl()即可。

OALIOCTL中添加的关键代码如下。

 1 typedef struct {
 2     void*    pvDestMem;
 3     DWORD    dwPhysAddr;
 4     DWORD    dwSize;
 5 } VIRTUAL_COPY_EX_DATA;
 6 
 7 #define IOCTL_VIRTUAL_COPY_EX CTL_CODE (FILE_DEVICE_UNKNOWN,3333,METHOD_BUFFERED,FILE_ANY_ACCESS)
 8 
 9 
10 case IOCTL_VIRTUAL_COPY_EX:
11 {
12     VIRTUAL_COPY_EX_DATA *p = (VIRTUAL_COPY_EX_DATA*)pInBuf;
13     HANDLE hDst = (HANDLE)GetDirectCallerProcessId();
14     HANDLE hSrc = (HANDLE)GetCurrentProcessId();
15     fRet = VirtualCopyEx(hDst,p->pvDestMem,hSrc,(LPVOID)p->dwPhysAddr,p->dwSize,
16      PAGE_READWRITE|PAGE_PHYSICAL|PAGE_NOCACHE);
17 }break;

应用程序中进行内存映射的关键代码如下。

 1 volatile LPVOID GetVirtual(DWORD dwPhyBaseAddress, DWORD dwSize)
 2 {
 3     volatile LPVOID pVirtual;
 4     VIRTUAL_COPY_EX_DATA vced;
 5     
 6     if(dwPhyBaseAddress&0xFFF)
 7     {
 8         return NULL;
 9     }
10     vced.dwPhysAddr = dwPhyBaseAddress>>8;
11     pVirtual = VirtualAlloc(0,dwSize,MEM_RESERVE,PAGE_NOACCESS);
12     vced.pvDestMem = pVirtual;
13     vced.dwSize = dwSize;
14     KernelIoControl(IOCTL_VIRTUAL_COPY_EX,&vced, sizeof(vced), NULL, NULL, NULL);
15     return pVirtual;
16 }
17 
18 // WinCE6.0模拟器中应用程序直接写屏
19 PBYTE pLCDBuf = (PBYTE)GetVirtual(0x33f00000,0x100000);
20 memset(pLCDBuf,0,0x100000);
21 

这种方法在WinCE6.0的模拟器中测试了一下,能达到预期的效果。

WinCE6.0中应用程序如何直接访问物理空间相关推荐

  1. win7安装wince6.0中遇到的问题 CDeviceSDKInstallShim Add/Remove failed. HR=0x8007005

    原文地址:http://blog.sina.com.cn/s/blog_5aea09bb0100m22m.html 以前用xp,安装wince6.0一切顺利,能够正常使用.最近换了一台新电脑,安装了w ...

  2. VMware Workstation 虚拟机中的 虚拟机通过NAT访问物理网络(NAT模式)

    这里写目录标题 3.5 虚拟机通过NAT访问物理网络 3.5.1 公网地址 3.5.2 私网地址 3.5.3 网络地址转换(NAT)技术 3.5.4 配置虚拟机使用NAT访问物理网络 3.5.5 通过 ...

  3. WINCE6.0在应用程序中调用控制面板的应用

    ********************************LoongEmbedded******************************** 作者:LoongEmbedded(kandi ...

  4. WinCE5.0中应用程序如何直接写屏

    以前曾利用GAPI实现应用程序直接操作显示驱动的FrameBuffer,以提高屏幕绘图和视频播放的效率.GAPI依赖于显示驱动,必须在显示驱动中添加相应的接口才能正常使用.如果平台是我们自己定制的,在 ...

  5. ASP.NET2.0中数据源控件之异步数据访问

    IAsyncResult 在第 1 部分和第 2 部分中, 建立了 WeatherDataSource 控件,该控件针对 weather.com(英文)所提供的 XML API 来运行,使用 WebR ...

  6. WINCE6.0隐藏文件夹和应用程序访问物理寄存器

    ********************************LoongEmbedded******************************** 作者:LoongEmbedded(kandi ...

  7. WINCE6.0系统调用

    ********************************LoongEmbedded******************************** 作者:LoongEmbedded(kandi ...

  8. WINCE6.0显示驱动模型介绍

    ********************************LoongEmbedded*****************作者:LoongEmbedded(kandi)时间:2011.06.4 类别 ...

  9. WINCE6.0+S3C2443下的usb function(功能)驱动

    ********************************LoongEmbedded************************ 作者:LoongEmbedded(kandi) 时间:201 ...

最新文章

  1. 如何部署自动驾驶系统
  2. 关系数据理论中的范式
  3. 京东618单日销售超10亿,B2C网购正成主流
  4. python装饰器与闭包_Python 装饰器和闭包
  5. 假设写一段代码引导PC开机这段代码是 ? Here is a tiny quot;OSquot; :-D
  6. UVA 10603 - Fill(dijkstra + 状态图)
  7. OpenCV学习笔记(三)——Mat,图像的新容器
  8. Java 中Timer和TimerTask 定时器和定时任务使用的例子
  9. leetcode597. 好友申请 I :总体通过率(SQL)
  10. 二级c语言需要记库函数不,【2017年必备】计算机等级二级C语言上机考试题库(熟记必过,不看后悔).doc...
  11. Jetty9 源码初解(2)——IO之Connection
  12. 你是多大年龄感觉自己开窍了,明白许多人世间的道理?
  13. Q3D之多视图(左视图,正视图等)
  14. CactiEZ-优化操作
  15. uniapp 复制剪贴板
  16. 请问王菲的<流年>歌词的含义
  17. 神经网络论文Enhancing deep neural networks via multiple kernel learning
  18. php 微信 防刷票,细数那些防止微信刷票的设置
  19. 【渝粤教育】电大中专跨境电子商务理论与实务 (5)作业 题库
  20. Excel表格数据导入到Oracle

热门文章

  1. 2021-5-18大搜车
  2. 1011 A+B 和 C (15分)
  3. (JAVA)基本数据类型 对象包装类
  4. 【算法设计与分析】05 有关函数的渐进的界的定理
  5. 【C语言进阶深度学习记录】二十一 # 和 ## 号操作符的使用与分析
  6. 《linux就该这么学》第六节,计划任务和用户身份管理!
  7. android程序获取WIFI的IP地址和MAC地址
  8. JavaScript中奇妙的replace
  9. 把东西从学校搬回来了
  10. Oralce 9.2.0.6 到 9.2.0.8 升级 小结