本站首页    管理页面    写新日志    退出


«July 2025»
12345
6789101112
13141516171819
20212223242526
2728293031


公告

☆★☆★☆★☆★☆★☆
生活的点点记录,以及一些体会...........

喜欢是淡淡的爱,爱是深深的喜欢.

时间会见证一切.......................

欢迎大家指出错误,共同进步..........

期待中..............................

☆★☆★☆★☆★☆★☆


我的分类(专题)

日志更新

最新评论

留言板

链接

世纪音频

 

 


Blog信息
blog名称:
日志总数:162
评论数量:312
留言数量:0
访问次数:939705
建立时间:2005年5月17日




[wince study]WinCE BSP中OAL层中的OEMIoControl介绍
文章收藏

oceanblue 发表于 2008/5/8 9:05:51

在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_INFOIOCTL_HAL_GET_DEVICE_INFOIOCTL_HAL_GET_DEVICEIDIOCTL_HAL_GET_UUIDIOCTL_PROCESSOR_INFORMATION 如果用户在应用程序中试图访问其他的case,肯定会返回失败的。在WinCE6.0中,驱动程序还像以前一样,可以访问OEMIoControl中的任何case。也许有人会问,那么我们如何让应用程序也访问到一些case呢?? 办法还是有的,可以看一下\WINCE600\public\common\oak\oalioctl\oalioctl.c,这个文件中定义了应用程序可以访问的case,把你的应用程序要访问的case加到这个文件中的IOControl(..)函数中就可以了。当然,你需要重新编译\public目录。 在WinCE5.0中,OEMIoControl函数被定义在BSP中的OAL部分,上面已经提到,应该是ioctl.c或者oemioctl.c,但是在WinCE6.0中,这个函数的定义被移到了\WINCE600\platform\common\src\common\ioctl\ioctl.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以上的值吧。


阅读全文(1562) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.125 second(s), page refreshed 144756372 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号