19644|82

72

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

wince6.0 下如何编写能使直接访问硬件的软件? [复制链接]

wince6.0 下如何编写能使直接访问硬件的软件?
以前在wince5.0 下使用MmMapIoSpace就可以很容易做到了。

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

如何做到?

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

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

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

最新回复

正要写个获取电池电压的程序,本来打算采用virtualcopy\virtualalloc\virtualFree实现,看来在ce6.0下要重新设计了。 牛人就是牛人啊!希望以后多共享一些学习心得,给我等后辈啊!  详情 回复 发表于 2010-5-12 20:23
点赞 关注
 

回复
举报

66

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
IOCTRL---MmMapIoSpace
此帖出自WindowsCE论坛
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
哇, 300 分

快回

写只 driver, 在 XXX_IoControl 加入一些 Code, 用 ActivateDeviecEx 将其载入 Kernel space.

Application 可以透过 DeviceIoControl 与该 driver 沟通, 由该 driver 去呼叫 MmMapIoSpace 并读值後传回即可.

Paul, Chao @ Techware
此帖出自WindowsCE论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

4
 
引用 2 楼 paul_chao 的回复:
哇, 300 分

快回

写只 driver, 在 XXX_IoControl 加入一些 Code, 用 ActivateDeviecEx 将其载入 Kernel space.

Application 可以透过 DeviceIoControl 与该 driver 沟通, 由该 driver 去呼叫 MmMapIoSpace 并读值後传回即可.

Paul, Chao @ Techware


哈哈,Paul, Chao 老兄,看来这300分你拿不到了。

因为我要求应用程序直接访问硬件,不能使用驱动的。

如果使用驱动,俺们早就做了。
此帖出自WindowsCE论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

5
 
快;来啊。千万不要让我无满意结贴啊。
此帖出自WindowsCE论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

6
 
我觉得你们都搞错了。
别人做出来了!只是没有源码!
看这个链接,你看看神人的牛技术吧。
http://www.cnblogs.com/we-hjb/archive/2009/03/08/1406257.html各位请看这个牛人写的。我正用着,不知道他怎么搞出来的。
此帖出自WindowsCE论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(中级)

7
 
unsigned int *gpio_base;

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

回复

56

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用 6 楼 xajhuang 的回复:
unsigned int *gpio_base;

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


这个在wince5.0下可行,到了wince6.0 就不行了。哈哈
此帖出自WindowsCE论坛
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 6 楼 xajhuang 的回复:
unsigned int *gpio_base;

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


会提示分配内存失败在wince6.0 下,wince5.0 就正常的。
此帖出自WindowsCE论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

10
 
看来得动点手脚了。
此帖出自WindowsCE论坛
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

11
 
要看你是写应用、写用户态驱动还是内核态驱动。应用和用户态驱动一样,都无法如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和函数,通过编写特有的转接服务,让内核态驱动提供给用户态使用。值得注意的是,通过内核态驱动来公开这些功能,实际上是公开了微软特意封装的内容,最好不要这样使用。
此帖出自WindowsCE论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

12
 
引用 5 楼 gooogleman 的回复:
我觉得你们都搞错了。
别人做出来了!只是没有源码!
看这个链接,你看看神人的牛技术吧。
http://www.cnblogs.com/we-hjb/archive/2009/03/08/1406257.html各位请看这个牛人写的。我正用着,不知道他怎么搞出来的。


晕,sunrain_hjb是如何做到的呢?我使用IDA反汇编也没有看到有什么特别的。

楼上几位都没有认真看这个sunrain_hjb做的工具,只是照着教条或者固有经验说。但是却确实sunrain_hjb牛人就做出来这个东西放在网上了,并且我在wince6.0上用的很正常
此帖出自WindowsCE论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

13
 
setkmodeThis function switches between kernel and user modes.

This function is no longer supported as of CE 6.0.
此帖出自WindowsCE论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

14
 
都不是楼上说的。

sunrain_hjb牛人使用了非同凡响的方法。刚才在朋友的论坛里面讨论,破解一番,发现了

看过注册表了,的确是加载了一个驱动,CE6就这么容易的破了。汗!
Active下面多了一个驱动:
Name: "MEM1"
Key:"Drivers\MEMDrv"

在MEMDrv下面:
Dll:"MEMRaw.dll"
Prefix:"MEM"
Index:"00000001" ...
Walle 发表于 2009-6-17 17:34
这样看来应该使用应用再重新加载了一个驱动到内核,然后应用和这个驱动通信即可!
汗,sunrain_hjb真太厉害了,佩服!

我等还在怀疑的时候,你老人家已经在玩的很爽了。
此帖出自WindowsCE论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

15
 
引用 3 楼 gooogleman 的回复:
引用 2 楼 paul_chao 的回复:
哇, 300 分

快回

写只 driver, 在 XXX_IoControl 加入一些 Code, 用 ActivateDeviecEx 将其载入 Kernel space.

Application 可以透过 DeviceIoControl 与该 driver 沟通, 由该 driver 去呼叫 MmMapIoSpace 并读值後传回即可.

Paul, Chao @ Techware


哈哈,Paul, Chao 老兄,看来这300分你拿不到了。

因为我要求应用程序直接访问硬件,不能使用驱动的。

如果使用驱动,俺们早就做了。


这不早说了吗? 我也是想了好久, 一直找不出更好的方法. 还是各位先进另有捷径, 大家一起来讨论看看

只是他一个 MemMgr.exe, 不知是如何把 MEMRaw.dll 给搞进系统的, 下载来玩玩看

Paul, Chao @ Techware
此帖出自WindowsCE论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

16
 
还真的是执行後, \Windows 多了一个 MEMRaw.dll, 要怎麽把 .dll 档包进 .exe 档呢?? 直接将 raw data (like as bmp2c) 存入 .exe 的 static variable 中, 再用 WriteFile 写入 \Windows 中吗?? 相当有趣的方法.

之前这个工具我的作法是写成 .cpl 的格式, 另外再写一个 .dll 的档案, 下次有空再改版时也用这方法来包进去成一个档案.

Paul, Chao @ Techware
此帖出自WindowsCE论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

17
 
呵呵,来晚了,确实如上面分析的,
是应用加载了一个驱动,通过驱动访问物理内存的。:P
做在一起,主要是考虑使用方便,不过,只支持ARM平台了,
在CE6.0的模拟器中测试没有问题。
此帖出自WindowsCE论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

18
 
引用 2 楼 paul_chao 的回复:
哇, 300 分

快回

写只 driver, 在 XXX_IoControl 加入一些 Code, 用 ActivateDeviecEx 将其载入 Kernel space.

Application 可以透过 DeviceIoControl 与该 driver 沟通, 由该 driver 去呼叫 MmMapIoSpace 并读值後传回即可.

Paul, Chao @ Techware


事实就是这样的,楼主可以给paul_chao分了。^_^
此帖出自WindowsCE论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

19
 
原来还留了一手!
此帖出自WindowsCE论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

20
 
引用 2 楼 paul_chao 的回复:
哇, 300 分

快回

写只 driver, 在 XXX_IoControl 加入一些 Code, 用 ActivateDeviecEx 将其载入 Kernel space.

Application 可以透过 DeviceIoControl 与该 driver 沟通, 由该 driver 去呼叫 MmMapIoSpace 并读值後传回即可.

Paul, Chao @ Techware


给分,给分。!哈哈。
此帖出自WindowsCE论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表