wince6下访问物理内存

本文介绍了Wince 6.0中应用程序访问物理内存的变化及解决方案。由于内核模式与用户模式的改动,直接访问物理地址不再可行。文章探讨了通过加载部分代码到内核模式下完成地址映射的两种方法,并列举了一些替代函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Wince下面已经不能通过简单的VirtualAlloc+VirtualCopy在应用程序中访问物理内存了。

应用程序直接访问物理地址可以极大的方便硬件驱动开发.如直接访问LCD控制器,可以很直接的对各种参数进行微调,不必一次次的编译打包,下载运行.

 

wince6.0之前可以通过MmMapIoSpace将物理地址映射到程序空间.MmMapIoSpace内部实现就是常见的VirtualAlloc+VirtualCopy.

 

Wince6.0对内核模式也用户模式做了相当大的改动,具体如何还不是很明了,清楚的是用户态程序调用VirtualCopy物理地址时会返回失败,导致MmMapIoSpace返回0.

 

绕过去的思路就是加载部分代码到内核模式,在这部分代码中完成地址映射.有两种实现的方法,一个是通过ActivateDevice加载一个流接口驱动,有点繁琐,实现标准接口的驱动,修改注册表,再加载调用.另一个就是通过LoadKernelLibrary加载动态库到内核空间,然后通过KernelLibIoControl完成映射.

 

代码中几个关键的地方
1 上面我们提到是在内核空间完成映射,而不是在内核空间访问物理地址.因为wince6.0提供了VirtualAlloc+VirtualCopy的增强版:VirtualAllocEx+VirtualCopyEx,可以直接将物理地址映射到用户程序的地址空间.
2 LoadKernelLibrary没有相应的FreeKernelLibrary,我们可以在内核模式动态库中通过FreeLibrary或者FreeLibraryAndExitThread自身来实现

 

 

一些替代的函数:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值