当前位置: 代码迷 >> WinCE >> wince6.0 下怎么编写能使直接访问硬件的软件
  详细解决方案

wince6.0 下怎么编写能使直接访问硬件的软件

热度:388   发布时间:2016-04-28 13:53:30.0
wince6.0 下如何编写能使直接访问硬件的软件?
wince6.0 下如何编写能使直接访问硬件的软件?
以前在wince5.0 下使用MmMapIoSpace就可以很容易做到了。

但是wince6.0 下的应用程序和驱动已经不在同一个空间了。

如何做到?

有时候写一个应用程序去直接操纵硬件对调试驱动非常有帮助,

在wince6.0 下有些人也写了这类型软件,比如sunrain_hjb的wince6.0寄存器读写软件,但是没有源码,不知道如何做到的。
我想调试一些复杂的驱动的时候,写一个比较完整的,或者专门针对这个驱动的。

有人说使用可以用setkmode去让ap临时进入kernel模式,然后在对内存进行操作,对这个不是很理解。
请达人出来指点一下。


------解决方案--------------------
IOCTRL---MmMapIoSpace
------解决方案--------------------
unsigned int *gpio_base;

PHYSICAL_ADDRESS PortAddress = {0x56000060, 0};
gpio_base =(unsigned int *)MmMapIoSpace( PortAddress, 0x04,FALSE ); // 获得内存
*gpio_base = 0x0585ff87; // 直接访问硬件
MmUnmapIoSpace(gpio_base,0x04);//释放内存

------解决方案--------------------
要看你是写应用、写用户态驱动还是内核态驱动。应用和用户态驱动一样,都无法如ce5的方式访问。
下面是我写过的一段内容,参考一下吧:

有些函数在用户态是必须注意使用的,如VirtualCopy和类似的MmMapIoSpace。用户态程序不允许使用VirtualCopy,但是用户态能通过转接服务来实现这功能。转接服务能代替用户态驱动来调用VirtualCopy,但是前提是转接服务要知道这些地址是可以访问的。在驱动的注册表入口,键值IOBase和IOLen来指出地址的位置和大小。当驱动使用VirtualCopy来,转接服务会检查这些键值,确保驱动能正常访问这些物理地址。下面是串口驱动的例子:
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Serial]
"IoBase"=dword:02F8
"IoLen"=dword:8 
如果只有一块地址需要访问,使用dword类型。如果是多块地址,那么使用multi_sz类型。
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Serial]
"IoBase"=multi_sz:"2f8","3f6"
"IoLen"=multi_sz:"8","2"
由于这些地址只能被有特权的应用程序访问,那么需要确保这些地址不能被非特权程序访问。

用户态驱动不能调用以下函数:
1、 VM虚拟内存函数:VirtualCopy[Ex], LockPages[Ex], CreateStaticMapping
2、 中断函数:InterruptInitialize, InterruptDone, LoadIntChainHandler
3、 不能直接使用IISR,需要通过转接服务来做GIISR。
4、 OAL层的IOCTL不能直接使用。

禁止从用户态驱动回调任何进程。你不能在总线驱动中回调一个内核态的client驱动。如果一个总线驱动放到用户态运行,只能把总线上的client驱动也放到用户态中。那么这个总线上所有的client驱动,都必须和总线驱动放到同一个udevice进程中。

有些OEM厂商可能会把一些OAL IOCTL和函数,通过编写特有的转接服务,让内核态驱动提供给用户态使用。值得注意的是,通过内核态驱动来公开这些功能,实际上是公开了微软特意封装的内容,最好不要这样使用。

------解决方案--------------------
应用程序通过createfile打开驱动,然后通过deviceiocontrol发指令给驱动,让驱动完成任务后将所需的参数再回传给应用。这种方式,CE5和CE6应该都是通用的吧!!这也是应用直接操作驱动从而操作硬件啊!
------解决方案--------------------
UPX 3.03压缩的,解压之后用IDA打开,辅助Resource Hacker。一目了然。
googleman,我恐怕你要失望了。这个软件仍然是用驱动的,这个软件把驱动作为资源打包到PE里面去了。
首先,注意以下特征:

.data:00028490 aMemdrv unicode 0, <MEMDRV>,0 ; DATA XREF: .text:off_11A2Co
.data:0002849E ALIGN 0x10
.data:000284A0 aOpenDrvfileErr DCW 0xD ; DATA XREF: .text:off_11A30o
.data:000284A0 DCW 0xA
.data:000284A0 unicode 0, <Open drvfile Error %d>,0
.data:000284D0 aWindowsMemraw_ unicode 0, <\windows\memraw.dll>,0
.data:000284D0 ; DATA XREF: .text:off_11A34o
.data:000284F8 aMem1 unicode 0, <MEM1:>,0 ; DATA XREF: .text:off_11E28o
.data:00028504 aOrder unicode 0, <Order>,0 ; DATA XREF: .text:off_11E2Co
.data:00028510 aDll unicode 0, <Dll>,0 ; DATA XREF: .text:off_11E30o
.data:00028518 aMemraw_dll unicode 0, <MEMRaw.dll>,0 ; DATA XREF: .text:off_11E34o
.data:0002852E ALIGN 0x10
.data:00028530 aPrefix unicode 0, <Prefix>,0 ; DATA XREF: .text:off_11E38o
.data:0002853E ALIGN 0x10
.data:00028540 aMem unicode 0, <MEM>,0 ; DATA XREF: .text:off_11E3Co
.data:00028548 aIndex unicode 0, <Index>,0 ; DATA XREF: .text:off_11E40o
.data:00028554 aDriversMemdrv unicode 0, <Drivers\MEMDrv>,0 ; DATA XREF: .text:off_11E48o
.data:00028572 ALIGN 8
  相关解决方案