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 *= (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的模拟器中测试了一下,能达到预期的效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/435982.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开博之文

逛园子很久了,读而不写非礼也。分享技术,交流经验,体味人生,本博主旨,此为09年的开年大事。转载于:https://www.cnblogs.com/imstand/archive/2009/01/11/1373712.html

【转】Dicom格式文件解析器!!!!!!!

转自:https://www.cnblogs.com/assassinx/archive/2013/01/09/dicomViewer.html Dicom全称是医学数字图像与通讯,这里讲的暂不涉及通讯的问题 只讲*.dcm 也就是diocm格式文件的读取,读取本身是没啥难度的 无非就是字节码数据流处理。只不过确…

android 设置view最大高度,android-在RecyclerView上设置最大高度

我有一个对话框片段,其中包含线性布局,其中涉及RecyclerView上方的titleText,在最底部,recyclerView下方有一个按钮.由于recyclerView根据适配器设置的项目数展开或折叠,因此按钮有时会被截断并且不再显示在屏幕上,因为recyclerView仅覆盖整个屏幕.我的问题是,有没有一种方法可…

【转贴】利用 Javascript 获取 URL 参数(适合IE、FF)

.  ... .../test.html?str123456如何用Javascript接收类似上面的url参数呢?这个问题网上有很多答案,看了看,主要有两种,一个是利用字符串的截取,另一种是利用正则表达式。[正则式&#xff3d…

【WinCE】流设备驱动简介及GPIO驱动的实现

流设备驱动实际上就是导出标准的流接口函数的驱动,这是文档上面的定义。在WinCE中,所有的流设备都导出流设备接口,这样WinCE中的Device Manager可以加载和管理这些流设备驱动。 流设备驱动的架构如图: 首先我声明一下,…

android contentprovider api,Content Provider Basics

一个内容提供者访问数据的中央资源库。提供者是应用程序的一部分,提供自己的操作数据的UI。然而,内容提供者主要是被其他应用程序引用,通过提供者客户对象访问提供者。提供者和提供者客户端为数据提供一个一致的,标准的接口&#…

【转】医学影像调窗技术!!!!

转自:https://www.cnblogs.com/assassinx/p/3139505.html 在年初的时候做过一个dicom格式文件解析,当时只是提了下。看着跟别人的显示出来也差不多 其实是我想太简单了。整理了下思路 这里提供正确的调窗代码。 医学影像 说得挺高科技的 其实在这个过程…

开始-运行 下常用快捷命令

在“开始”菜单上单击“运行“,输入 1. eventvwr.msc /s 打开事件查看器 (可查看系统日志) 2.gpedit.msc 打开组策略 示例:在Windows Server 2003中关闭系统事件跟踪程序: 单击“开始→运行”,输入gped…

解决6410 WINCE6 应用层调用SetSystemPowerState api关机无效的问题

6410平台下的wince6系统,在应用层中使用SetSystemPowerState api函数关机发现无效。 应用层调用如下: [cpp]view plaincopy SetSystemPowerState(NULL, POWER_STATE_OFF, POWER_FORCE); 注:该调用需要引用pm.h头文件,该头文件在…

【转】理解字节序 大端字节序和小端字节序

转自:https://www.cnblogs.com/gremount/p/8830707.html 以下内容参考了 http://www.ruanyifeng.com/blog/2016/11/byte-order.html https://blog.csdn.net/yishengzhiai005/article/details/39672529 1. 计算机硬件有两种储存数据的方式:大端字节序…

Web-DispatcherServletUrlPatterns

Web-DispatcherServletUrlPatterns 在MANIFEST.MF文件中指定了Web-DispatcherServletUrlPatterns时千万要注意它的规则,首先它必须是符合servlet的url-pattern的,其规则如下: 在web.xml文件中,以下语法用于定义映射: …

WCHAR char CString等常用类型互转

1、CString to WCHAR*: [cpp]view plaincopy WCHAR *wch (WCHAR*)str.GetBuffer(str.GetLength()); str为CString类型。 2、WCHRA* to char*: [cpp]view plaincopy memset(buf, 0, bufInLen); // WCHRA to char WideCharToMultiByte( CP_ACP, 0, wch, -1, buf,…

html文件自动批阅器怎么设计,作业作业提交与批改系统HTML界面.doc

作业作业提交与批改系统HTML界面作业1-作业提交与批改系统HTML界面请根据以下需求部分功能或全部全部功能HTML界面代码;注意HTML代码附在本文后面一、作业提交与批改系统系统功能图基本功能1.学生注册2.学生、教师、管理员密码找回功能3&…

【转】Photoshop保存格式介绍大全

01 PSD格式 PSD格式:PSD是Photoshop默认的文件格式,他可以保留文档中的所有图层、蒙蔽、通道、路径、未栅格化的文字、图层样式等。通常情况下,我们都是将文件保存为PSD格式,以后可以对其修改。PSD是除大型文档格式(PS…

创建windows服务,定时监控网站应用程序池

最近网站总是报"Timer_Connection"错误,导致该网站所使用的应用程序池由于错误过多停止运行,网站也就出现了service unvaliable,无法访问,在网上查了很多资料,结果很让人无奈,这个问题已经困扰我了很久,一直没有得到解决,后来同事发来一篇文章让我有了新的解决方法,虽…

UNICODE十六进制数组转成中英文

UNICODE十六进制的数组转成中英文 实现char*转换成中英文,每两个char合成一个wchar_t: [cpp]view plaincopy // UNICODE十六进制数组转成中英文 // hex array to wchar_t* // wchs NULL, wchsLen as output(the size of wchs will be used) // er…

html+选择弹出选项卡,javascript – Chrome扩展程序:从弹出窗口获取当前选项卡

我正在撰写Chrome扩展程序,在其中一部分,当弹出页面上的按钮被点击时,我需要获取当前选项卡的标题和URL。我之前已经和Chrome的消息传递系统一起工作了,并且经过许多努力,已经设法让它在许多场合工作。不过&#xff0c…

【转】Qtcreator中常用快捷键和小技巧

转自:https://blog.csdn.net/imxiangzi/article/details/48863855 https://blog.csdn.net/jh1513/article/details/52346802 快捷键及对应含义 下载地址:http://download.csdn.net/detail/jh1513/9615209 快捷键 功能 Esc 切换到代码编辑状态 F1 …

添加蜂窝注册表及永久存储

1、 添加 Hive-based Registry 在 Platform Builder 的“ Catalog ”窗口中,单击打开 Catalog->Core OS->Windows ce devices->File Systems and Data Store->Registry Storage(Choose 1)->Hive-based-based Registry 节点,选中 Hive-b…

interface abstract与virtual

interface用来声明接口 1.只提供一些方法规约,不提供方法主体 如 public interface IPerson { void getName();//不包含方法主体 } 2.方法不能用public abstract等修饰,无字段变量,无构造函数。 3.方法可包含参数 如 public interface IP…