Chinaunix首页 | 论坛 | 博客
  • 博客访问: 381054
  • 博文数量: 793
  • 博客积分: 2500
  • 博客等级: 少校
  • 技术积分: 8660
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-17 23:02
文章分类

全部博文(793)

文章存档

2010年(793)

我的朋友

分类:

2010-10-21 16:36:49

  在wince的bsp中的oal部分,会有一个ioctl.c或者oemioctl.c文件,里面主要定义了一个叫oemiocontrol(..)的函数。可以说oemiocontrol是一个很有用的wince内核输入/输出函数。   在wince5.0中,应用程序和驱动程序可以通过调用kerneliocontrol(..)函数来访问wince内核,导致调用oemiocontrol函数,这样应用程序和驱动程序就可以访问到oal中的资源了。但在wince6.0中,提供了更好的安全性,应用程序能够访问oemiocontrol中的case受到了限制,只有下面的这些case是可以让应用程序访问的: ioctl_hal_get_cache_info ioctl_hal_get_device_info ioctl_hal_get_deviceid ioctl_hal_get_uuid ioctl_processor_information   如果用户在应用程序中试图访问其他的case,肯定会返回失败的。在wince6.0中,驱动程序还像以前一样,可以访问oemiocontrol中的任何case。也许有人会问,那么我们如何让应用程序也访问到一些case呢??   办法还是有的,可以看一下wince600publiccommonoakoalioctloalioctl.c,这个文件中定义了应用程序可以访问的case,把你的应用程序要访问的case加到这个文件中的iocontrol(..)函数中就可以了。当然,你需要重新编译public目录。   在wince5.0中,oemiocontrol函数被定义在bsp中的oal部分,上面已经提到,应该是ioctl.c或者oemioctl.c,但是在wince6.0中,这个函数的定义被移到了wince600platformcommonsrccommonioctlioctl.c中了,这里面的oemiocontrol函数和以前也有了变化,该函数会查一个表:g_oalioctltable[">。该表实际上是一个结构数组,定义了oemiocontrol中所有的case,已经针对这个case的处理函数,还包括一个针对每个case的flag,该flag表示是否使用临界区保护。具体定义如下: typedef struct {  uint32 code;  uint32 flags;  bool (*pfnhandler) (uint32, void*, uint32, void*, uint32, uint32*); } oal_ioctl_handler, *poal_ioctl_handler;   所以,在wince6.0的bsp中,我们只需要实现g_oalioctltable[">就可以了。例如:    const oal_ioctl_handler g_oalioctltable[">={ { ioctl_hal_postinit,                        0, oalioctlhalpostinit     }, { ioctl_hal_get_hive_clean_flag,         0, oalioctlhalgethivecleanflag }, { ioctl_hal_get_hwentropy,               0, oalioctlhalgethwentropy   }, { ioctl_hal_get_image_signed_state,     0, oalioctlhalgetimagesignedstate }, { ioctl_hal_query_format_partition,     0, oalioctlhalqueryformatpartition }, { 0,                                           0, null} };   在oemiocontrol函数中,我们不光要实现oemiocontrol中的case,有一些全局的oal变量我们也需要定义:   g_oalioctlclockspeed this global variable contains information about the processor clock speed. g_oalioctlinstructionset this global variable contains the processor instruction set identifier. g_oalioctlplatformoem this global variable contains information about the hardware platform oem. g_oalioctlplatformtype this global variable contains information about the hardware platform type. g_oalioctlprocessorcore this global variable contains information about the processor core. g_oalioctlprocessorname this global variable contains information about the processor name. g_oalioctlprocessorvendor this global variable contains information about the processor vendor.   其实都是一些硬件及平台的相关信息,定义一下就可以了。   有时根据具体需要,我们还希望在oemiocontrol函数中添加自己定义的case,这个比较简单,只要定义个case,然后在这个case下写你的实现代码就可以了,驱动程序通过kerneliocontrol调用同样的case就可以调用到你在oemiocontrol中定义的case了。关于case值得定义,一般都在2048到4096之间会比较安全,我记得在wince6.0下,看微软的代码好像256以上就可以了,具体没有试过,要是保险的话,还是用2048以上的值吧。 如果喜欢wince bsp中oal层中的oemiocontrol介绍 - wince请收藏或告诉您的好朋友.
阅读(192) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~