http://blog.csdn.net/fredzeng/archive/2007/04/04/1551898.aspx

在CE4.2/5.0里面滚打多年的兄弟应该经常用这个函数吧。这个函数方便驱动和应用程序范围任何的物理地址,包括物理内存啊,设备控制器的寄存器啊,甚至GPIO也可以在AP里面随便拉上拉下。

这个函数虽然方便,但是并不安全,你想你好不容易把一个功能完善的image给build出来了,结果碰到了一个写AP的"高手",把你的寄存器和共享内存中的数据修改得一塌糊涂,最后报出bug来说你驱动的你会不会晕倒!

还好从CE6.0开始我们可以安枕无忧了,因为AP再也不能调用VirtualCopy函数来直接访问物理地址了,但因此带来了一些应用上的不便。

VirtualCopy 的限制来源于CE6.0之后kernel的巨大变革,在CE5.0之前的Windows CE操作系统中,kenrel就仅仅是kern.exe(nk.exe),这个exe其实是OAL、KITL和Kernel三个的合体,nk.exe是运行于内核模式(kernel mode),也就具有了访问特殊地址的权限,然后除此之外的代码默认都是运行于用户模式(user mode),所以它们的驱动和AP都是等级的,都在用户模式运行,要运行在kernel模式也可以,调用一个API SetKmode()就行了。因为驱动是肯定要访问物理地址的,所以CE5.0以前的OS都是运行用户模式的程式访问物理地址的,然后又为了方便做从物理地址到虚拟地址的映射,就提供了一系列的帮助函数,virtualcopy就是最常用的函数之一。

CE6.0 开始,kernel模式变得比较正规,类似于台式机上的windows系统了,驱动和ap的权限是严格区分的,大部分的驱动程序运行在kernel模式,它们可以用virtualcopy读写物理地址对应的物理设备,但用户模式的AP将从此没有直接访问物理地址的权限,virtualcopy每次调用都会失败返回。

在这里还要注意的是,其实并不是用户模式就不能使用virtualcopy,virtualcopy只是不能在用户模式的AP中使用,但是却还可以在用户模式的驱动使用,但是在用户模式的驱动中使用也有条件,那就是必须在对应的注册表中设置可以访问的内存地址的范围才行。

在某些场合,一些特殊功能的AP确实需要访问物理地址的,比如设置保存物理内存指定位置的全局变量,开发读写GPIO的测试工具等等。在这种情况下一种简单的方法是实现一个最简单的跑在kernel模式的流驱动,提供一个deviceiocontrol的接口来帮助AP申请对应于物理内存地址的虚拟内存地址。

除了virtualcopy之外,CE6下还有很多API是AP和user模式的驱动不能调用的,给大家参考一下,大家要把CE50下的AP移植到6.0下一定要注意找到替代

Virtual Memory APIs
CeVirtualSharedAlloc
LockPages
LockPagesEx
UnlockPages
UnlockPagesEx
VirtualAllocCopyEx
VirtualCopyEx
VirtualSetAttributes
CreateStaticMapping
NKDeleteStaticMapping
VirtualCopy

File System APIs
ReadRegistryFromOEM
SetStoreQueueBase
WriteRegistryToOEM

Power APIs
PowerOffSystem (很多测试AP用到)

Miscellaneous APIs
SetOOMEvent

转载于:https://www.cnblogs.com/harber/archive/2007/12/09/988156.html

VirtualCopy in WinCE6.0相关推荐

  1. WinCE6.0中应用程序如何直接访问物理空间

    在实际开发过程中,经常希望能在应用程序中直接读写设备的物理空间.以前在做WinCE6.0下的MEMMgr时通过秘密加载一个内核态驱动实现了这个需求.但这种方式有一个明显的缺陷,每次读写都必须经由它才能 ...

  2. WinCE6.0 修改开机Logo方法集锦(二)

       中秋假期已过,回来继续该博文主题.今天讲解第二种方法,将Logo图片的数据写入到Nand Flash中,在启动初始化LCD的时候,从固定的地址将数据读出并填充到显示缓存中.<?xml:na ...

  3. WINCE6.0组件选择说明

    WINCE6.0组件选择说明 图1 RAS/PPP组件前面的√标识表示我们手动选择,TAPI2.0前面的■标识表示选组件时根据依赖关系自动选择的,PPPoE前面的□标识组件没有选择.

  4. wince6.0 编译报错:error C2220: warning treated as error - no 'object' file generated的解决办法

    内容提要:wince6.0编译报错:"error C2220: warning treated as error - no 'object' file generated" 原因是 ...

  5. WIN7 64位系统搭建WINCE6.0系统遇到的问题

    WIN7 64位系统搭建WINCE6.0系统遇到的问题 安装顺序如下: 1.先装Visual Studio2005: 2.安装Visual Studio2005 Service Pack 1: 3.安 ...

  6. WINCE6.0远程桌面显示修改

    备注:用RDP表示远程桌面 WINCE6.0自带的远程桌面在我们显示屏分辨率为240*320上有一部分内容无法显示出来,所以就需要调整界面让这些内容可见. 1.      PB6.0不支持对远程桌面资 ...

  7. VS2005工程由Pocket PC 2003 SDK转为WINCE6.0 SDK的问题

    把VS2005工程有采用的Pocket PC 2003 SDK改为WINCE6.0 SDK,具体操作见链接 http://blog.csdn.net/loongembedded/article/det ...

  8. WINCE6.0系统调用

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

  9. 基于WINCE6.0下载multiple XIP镜像文件

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

最新文章

  1. 人工智能+能源:能源行业变革新趋势
  2. 【Java】5.2 方法详解
  3. 一维傅里叶变换后的复数怎样理解?
  4. 面试官:数据量大的情况下分页查询很慢,有什么优化方案?
  5. (1)定义一个抽象类Weapon,该抽象类有两个抽象方法attack(),move() 这两个方法分别表示武器的攻击方式和移动方式。 (2)定义3个类:Tank,Fl
  6. 用ado.net取数据库中table、column的信息
  7. spring boot 尚桂谷学习笔记07 嵌入式容器 ---Web
  8. linux蓝天模具风扇控制软件,ECView最新版下载-蓝天原厂风扇转速策略调节软件clevo ecview下载 v6.8 通用版-IT猫扑网...
  9. ubnt ER-4添加PON stick模块替换光猫实战
  10. win10中修改mac地址
  11. 非常不错的地区三级联动,js简单易懂。封装起来了
  12. 89c51汇编语言波形发生器,51单片机汇编语言实现波形发生器.docx
  13. 【视频分享】尚学堂---数据结构和算法
  14. java中case怎么用,Java中case使用示例,Javacase使用示例,switch([vari
  15. 死循环之----恐怖游轮
  16. 获取Google Advertising ID作为唯一识别码
  17. 桌面窗口管理器 GPU 3D 占用100% 的解决方法
  18. 【水果识别】柑橘质量检测及分级系统(带面板)【含GUI Matlab源码 1628期】
  19. java currency 默认_Java Currency.equals方法代码示例
  20. virtualbox 虚拟机 win7 激活后开机黑屏,只有横杠

热门文章

  1. Python with语句
  2. HDU 1043 Eight(双向BFS+康托展开)
  3. ZT:成熟是一种明亮而不刺眼的光辉
  4. C#基础—不完整类型(局部类型)
  5. html 页面视图中的资源文件(css/js/image)的路径问题。
  6. Windows7 设置 Java环境变量
  7. 线程池ThreadPool知识碎片和使用经验速记
  8. DataVeryLite和Nhibernate性能对比
  9. 完美解决百度地图MarkerClusterer 移动地图时,Marker 的Label 丢失的问题
  10. ewebeditor编辑器ASP/ASPX/PHP/JSP版本漏洞利用总结及解决方法