7.内存地址重建API函数和类
下面我们介绍内存地址重建API函数。
CeOpenCallerBuffer :验证访问权限并完成指针的内存地址重建。返回一个内存地址重建后的指针。分配资源。为了在指针处理结束后释放资源,必须调用CeCloseCallerBuffer函数。
CeCloseCallerBuffer:释放CeOpenCallerBuffer函数分配的所有资源。如有必要,可以向被传递的缓冲区进行回写。
CeAllocAsynchronousBuffer:使用CeOpenCallerBuffer函数或者由系统整理出一个缓冲区,以供异步访问之用。在返回发起调用的线程之前,必须同步调用这个函数。它会分配有关资源,为了在指针处理结束后释放资源,必须调用CeFreeAsynchronousBuffer函数。
CeFreeAsynchronousBuffer:会释放由函数CeAllocAsynchronousBuffer分配的所有资源。如有必要,可以向被传递的缓冲区进行回写。
CeFlushAsynchronousBuffer:会根据函数CeAllocAsynchronousBuffer对该缓冲区所做的修改而改变源缓冲区。
CeAllocDuplicateBuffer:为参数指针创建安全副本。
CeFreeDuplicateBuffer:释放由函数CeAllocDuplicateBuffer分配的所有资源。如有必要,可以向被传递的缓冲区进行回写。
除此之外,Windows Embedded CE 6.0还另外提供了一组C++类,用于内存地址重建,它们位于\PUBLIC\COMMON\OAK\INC\MARSHAL.HPP,下面对它们做相应说明。
AsynchronousBuffer_t:CeAllocAsynchronousBuffer函数和CeFreeAsynchronousBuffer函数的包装类,用于需要异步访问的内存地址重建后的指针。
DuplicatedBuffer_t:CeAllocDuplicateBuffer函数和CeFreeDuplicateBuffer函数的包装类,用于指针参数。
MarshalledBuffer_t:CeOpenCallerBuffer、CeCloseCallerBuffer、CeAllocAsynchronousBuffer和CeFreeAsynchronousBuffer函数的包装类,用于未重建内存地址的嵌入指针。
8.调试域
要想开发出可靠和稳定的驱动程序,必须在可能引起异常错误的可执行码中插入__try/__except/__finally块,特别是那些从外部接收数据的代码。
调试是驱动程序开发工作的一大项,幸运的是Windows Embedded CE开发工具提供了调试驱动程序所需的全部功能。Windows Embedded CE提供了两种调试驱动程序的方法,第一种标准的单步调试方式,它能够进入内核提供的代码;第二种是无间断的调试方式。注意,要使用标准内核调试工具,应该为特定的硬件平台实现KITL,并选择传输方法。
如果希望调试系统的所有部分,您应当构建一个Debug OS映像。如果希望调试整个驱动程序,那么只需构建一个包括内核程序调试工具KITL和调试版的带有辅助调试文件的驱动程序的Retail OS映像就足够了。如果希望调试整个驱动程序和部分系统的话,您应当在映像中包含前面所说的各种组件,以及带有辅助调试文件的系统部分。
调试域是一种改进型的printf调试技术,并且能在运行时配置输出,还能与Platfrom Builder集成使用。从最基础的角度而言,调试域向调试输出发送条件输出。按照这种方式,调试域可以在不需要中断执行的情况下提供驱动程序执行信息。
所有的系统码都可用于调试域,所以您不仅能够看到来自驱动程序调试域的输出,而且还能得到有关系统活动信息。这一功能有助于在驱动程序开发期间暴露并解决问题。
为了使用调试域,需要进行如下所示的工作:
·在驱动程序的头文件中包含dbgapi.h:#include
·为调试域定义掩码,例如:
#define ZONEMASK_INIT (0x00000001<<0)
//zone 1
#define ZONEMASK_ACTIONS (0x00000001<<1)
//zone 2
#define ZONEMASK_EXCEPTIONS (0x00000001<<2)
//zone 14
#define ZONEMASK_WARNING (0x00000001<<14)
//zone 15
#define ZONEMASK_ERRORS (0x00000001<<16)
定义用于条件式调试域输出的标志,例如:
#define ZONE_INIT DEBUGZONE (0)
//如果zone 1启用,则为true
#define ZONE_ACTIONS DEBUGZONE (1)
//如果zone 2启用,则为true
#define ZONE_EXCEPTIONS DEBUGZONE (2)
//如果zone 14启用,则为true
#define ZONE_WARNING DEBUGZONE (14)
//如果zone 15启用,则为true
#define ZONE_ERRORSDEBUGZONE (15)