KernelIoControl函數5.0和6.0的區別

在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呢??

  辦法還是有的,可以看一下WINCE600/public/common/oak/oal/ioctl/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

以上的值吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章