WinCE6.0中应用程序如何直接访问物…

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

      在实际开发过程中,经常希望能在应用程序中直接读写设备的物理空间。以前在做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的模拟器中测试了一下,能达到预期的效果。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
wince6.0模拟器是一个车载式PC模拟器,英文全称为:windows embedded ce6.0,主要是使用在3D地图及软件模拟方面,像车载凯立德导航就可以完全的在wince6.0模拟器使用。另外它集成了GPS模拟器(Virace GPS),可以非常轻松方便的去调试程序,且还有三种分辨率功用户选择,分别为:Skin_400x234、Skin_640X480、Skin_800X480,有需要的用户,可以来下载wince6.0模拟器在您的车上使用哦! wince6.0模拟器 使用方法 1、下载好软件压缩包,节气解压好,双击运行里面的“先运行我进行注册.bat”,随后它就会提示注册成功。 2、然后就可以双击“Skin_400x234.bat”、“Skin_640X480.bat”、“Skin_800X480.BAT”三个的其一个,这三个本质上是一样的,只要分辨率的大小不同。 3、点击“文件”-“配置”-“常规”-“共享文件夹”。 4、点击"...",弹出选择文件夹,选择“凯立德地图文件夹”点击“确定”。 6、点击wince6.0模拟器界面“我的设备”图标。 7、双击“SDMMC”(SDMMC就相当于你导航里面的一个SD卡或者说是导航仪的内置卡) 8、打开后,你就可以看到凯立德导航3D地图了。大功告成! 9、不知道大家发现没有,屏幕没有完全显示,被遮挡了一栏。遮盖怎么办呢?这也好办,没有我一箭穿心解决不了的。点击“开始”。 10、接下来点击“设置”“任务栏和开始菜单”,勾选“自动隐藏”“OK”。 怎样连接网络教程 1、打开VisualStudio 2008—>工具-->设备仿真器管理器-->选择安装的SDK(如图一)右键-->连接 2、配置模拟器文件-->配置-->网络-->勾选“启用NE2000 PCMCIA 网络适配器并绑定到(N)”在下拉框选择“连接的网卡”或者PC正在使用的网卡(如图二)-->确定 3、配置Windows Mobile 设备心(Windows 7系统),XP系统是Microsott ActiveSync,配置都一样。 移动设备设置-->连接设置—>勾选所有的选择框-->允许连接到以下任一端口选择“DMA”—>这台计算已连接到选择“自动”(这个地方要注意下有时候重新打开软件时这个配置可能没保存,所有需要重复选择“自动”、“单位网络”、“Internet”来测试是否能上网) 4、设备仿真器管理器-->选择连接的SDK右键-->插入底座(如图四) 配置完成在PC的计算就能看到这个设备了 测试 在wince6.0模拟器打开IE输入网址就能上网了 注意现在还不能上网的话请在设备心的配置“这台计算已连接到”选择任意的选择项来测试 常见问题 一、wince6.0模拟器怎么打开地图? 答:xp用户需先安装Windows Installer 4.5和.NET Framework 2.0 SP2 已经安装过因为注册列表已注入WINDOWS,有些版本限制了重复安装,只有重做系统。 bluestacks app player版本不一,最新版最新版 BlueStacks App Player 0.7.7.813_RELXP/Win7版 100.1 M 这个模拟器对系统和电脑配置要求都很挑剔,有时安装成功未必可以运行应用,能否成功还是要看电脑配置 二、wince6.0模拟器怎么在vs上调试? 答:环境配置:启动Jenkins? 1、安装jdk 从略,建议1.6或以上版本,配置好环境变量。 2、安装tomcat 从略,安装完调试下tomcat是否正常。 3、安装ant 下载zip包,解压后配置好环境变量。 4、安装jenkins 下载war包,命名为Jenkins,拷贝到tomcat 一个独立的部署系统需要包括的内容是非常丰富的(绝对不仅仅是Jenkins部署插件要做的那些事情)。部署系统需要连接项目涉及的人、环境、制品库以及构建环境等,只不过这种连接的目的是打通从制品到最终服务的整个流程 。 三、wince模拟器怎么修改分辨率 答:点右键-编辑-修改最后一句cd C:\Program Files\Microsoft Device Emulator\1.0 DeviceEmulator.exe CE50_ARM_CHS.bin /memsize 128 /s TMP.dess /video 320x300x16 3.5的是320x300x16 4.3的是480x300x16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值