WinCE EBOOT中的Optional函数和BootPart分析

来源:互联网 发布:linux 查看hba信息 编辑:程序博客网 时间:2024/05/08 03:09
 在WinCE的EBOOT中,有一些函数属于Optional的OEM函数,也就是可选择实现的。这些函数会在BLCOMMON模块中被调用,我们需要在EBOOT中实现它们,然后把实现的函数赋值给BLCOMMON中的相应的函数指针上面就可以了,这样BLCOMMON模块在调用这些Optional函数的时候,会首先检查他们是否为NULL,如果为NULL就不执行,如果不是NULL就运行这些函数。

      可以先看一下BLCOMMON模块的代码,在blcommon.c中有如下的定义:

PFN_OEMVERIFYMEMORY      g_pOEMVerifyMemory;
PFN_OEMREPORTERROR       g_pOEMReportError;
PFN_OEMCHECKSIGNATURE    g_pOEMCheckSignature;
PFN_OEMMULTIBINNOTIFY    g_pOEMMultiBINNotify;
      这4个Optional函数指针在EBOOT中一般会对应下面的函数:

BOOL OEMVerifyMemory(DWORD dwStartAddr, DWORD dwLength)
BOOL OEMReportError(DWORD dwReason, DWORD dwReserved)
BOOL OEMCheckSignature(DWORD dwImageStart, DWORD dwROMOffset, DWORD dwLaunchAddr, BOOL bDownloaded)
void OEMMultiBINNotify(const PMultiBINInfo pInfo)

      下面介绍一些这些OEM函数:

(1)BOOL OEMVerifyMemory(DWORD dwStartAddr, DWORD dwLength)

该函数主要用于对要被下载WinCE image的存储设备进行验证,它在BLCOMMON模块中的DownloadImage函数中被调用,用于下载前验证存储设备。dwStartAddr为被下载的image在存储器中的起始地址,dwLength为image的长度,成功返回TRUE。

(2)BOOL OEMReportError(DWORD dwReason, DWORD dwReserved)

该函数用于报告错误,用户可以通过串口打印的方式来实现。在BLCOMMON模块中,它会被HALT函数调用,而HALT函数会在BLCOMMON模块中的BootloaderMain函数出错时被调用来报告错误。dwReason为错误原因,dwReserved为预留。

(3)BOOL OEMCheckSignature(DWORD dwImageStart, DWORD dwROMOffset, DWORD dwLaunchAddr, BOOL bDownloaded)

该函数用于验证WinCE image中的署名并检查其有效性。它会被BLCOMMON模块中的DownloadImage中被调用,主要验证下载后的WinCE image。dwImageStart为被下载image的存储起始地址,dwROMOffset为config.bib文件中定义的ROMOFFSET的值,dwLaunchAddr为被加载的地址,bDownloaded为TURE表示是被下载的image文件。其实在BLCOMMON模块中已经提供了一个通用的署名检查函数CheckSignature(..)在signimage.c文件中,可以在该函数中调用这个函数来验证image的署名。

(4)void OEMMultiBINNotify(const PMultiBINInfo pInfo)

该函数用于告诉用户在下载多个bin文件的时候,每个文件的区域信息。它会被BLCOMMON模块的DownloadImage函数调用。Platform. Builder本身是支持一次下载多个Bin文件的,所以EBOOT下载的时候,可以通过该函数要下载的Bin文件数以及每个Bin文件的起始地址和长度,这些信息在pInfo中体现。

==============================================================================

      BootPart算是微软提供的一个用于分区的模块,可以在EBOOT中使用。在EBOOT中,BLCOMMON处于最上层,BootPart模块会被OEM函数来调用,而BootPart模块要操作存储设备需要Flash Driver的支持。

                                                        

这里要说的是Flash Driver是指WinCE下的Flash驱动,也就是FMD_xxx接口的驱动。Bootpart模块主要提供对Flash设备的分区功能。

(1)BOOL BP_Init (LPBYTE pMemory, DWORD dwSize, LPCTSTR lpActiveReg, PPCI_REG_INFO pRegIn, PPCI_REG_INFO pRegOut)

该函数可以说是BootPart模块的初始化函数,看看代码就知道他会调用FMD_Init来初始化Flash设备并初始化一块内存。pMemory指向一块内存来存放MBR信息,dwSize为内存的大小,lpActiveReg,pRegIn和pRegOut会被FMD_Init用到,一般可以设置为NULL。

(2)BOOL BP_LowLevelFormat(DWORD dwStartBlock, DWORD dwNumBlocks, DWORD dwFlags)

该函数用于低级格式化,它会格式化Flash设备中的Block,重新创建MBR并将MBR存到第一个Blockd的第一个扇区中。dwStartBlock为起始Block,dwNumBlocks为多少个Block,dwFlags为格式化标记位,表示采用何种格式化方式。

(3)PPARTENTRY BP_GetPartitionInfo (HANDLE hPartition)

该函数用于获得某个分区的信息。hPartition为某一个分区的句柄,返回相应的分区信息。

(4)HANDLE BP_OpenPartition(DWORD dwStartSector, DWORD dwNumSectors, DWORD dwPartType, BOOL fActive, DWORD dwCreationFlags)

该函数用于打开或者创建一个分区,可以通过该函数在Flash设备上面创建分区。dwStartSector为起始逻辑扇区,dwNumSectors为该分区中包含多少个扇区,dwPartType表示分区的类型,fActive为是否是激活分区,dwCreationFlags表示是创建分区还是打开分区,执行成功后返回该分区的句柄。

(5)BOOL BP_WriteData(HANDLE hPartition, LPBYTE pbBuffer, DWORD dwLength)

该函数负责向某一个分区写入数据,一般EBOOT可以通过这个函数将WinCE image写入分区中。hPartition为被创建的分区的句柄,pbBuffer为要写入数据的Buffer,dwLength为要写入数据的长度。

(6)BOOL BP_ReadData(HANDLE hPartition, LPBYTE pbBuffer, DWORD dwLength)

该函数负责从一个分区中读出数据,EBOOT可以通过这个函数将WinCE image读到RAM中。hPartition为被创建的分区的句柄,pbBuffer为要读出数据的Buffer,dwLength为要读出数据的长度。

(7)BOOL BP_SetDataPointer (HANDLE hPartition, DWORD dwAddress)

该函数用于设置某一个分区的数据指针,实际上数据指针是指在该分区中下一次被读或写的位置。一般会配合BP_ReadData(..)和BP_WriteData(..)两个函数来用。hPartition为被创建分区的句柄,dwAddress为数据指针的新位置。

 

参考原文:http://space.itpub.net/16912323/viewspace-504250

参考原文:http://space.itpub.net/16912323/viewspace-504249