Sunday, May 5, 2013

Windows驱动编写注意事项

有些C语言运行时函数如strcpy可以用在驱动中(因为该函数不依赖Windows API实现),但是建议使用内核态的运行时函数。

C++可以实现操作符重载,所以重载的new操作符有可能用在驱动中,但是驱动开发不建议使用C++.

开发时尽量采用checked版本,这样可以用windbg进行源码级调试

makefile文件一般只包含一行(!INCLUDE $(NTMAKEENV)\makefile.def)即可,如果要修改请参考ms-help://MS.WDK.v10.7600.090618.01/DevTest_g/hh/DevTest_g/Build_Ref_31c38413-df20-4483-aa9c-16353d9d82fa.xml.htm或者在wdk中搜索MAKEFILE.INC然后链接过去

如果不明确规定,当前目录下所有源码都会被编译,否则可以编写dirs文件,下面是一个例子:
    DIRS= \
         1394 \
         audio \
         AVStream \
         biometrics
dirs文件和sources文件配合使用,详见ms-help://MS.WDK.v10.7600.090618.01/DevTest_g/hh/DevTest_g/Build_Ref_78947534-363a-4a43-bc39-5e26c9c05449.xml.htm或者在wdk中搜索TARGETNAME后链接过去

还有一个MAKEFILE.INC可选文件,在wdk中搜索MAKEFILE.INC可以获得帮助信息

由于DbgPrint无法在FreeBuild中使用,所以建议使用KdPrint,该宏定义如下:
#if DBG
#define KdPrint(_x_) DbgPrint _x_
#else
#define KdPrint(_x_)
#endif
所以KdPrint((_x_))会转成DbgPrint(_x_),如果用KdPrint(_x_)则会出错。

符号链接最好用"\?\"的形式,为了兼容以前的驱动,'\DosDevices\'的形式在逻辑是等效的,从应用程序中访问驱动用"\.\"的形式。

如果驱动需要频繁地分配和回收固定大小的内存,为了避免产生内存碎片,windows提供了Lookaside内存。

RtlCopyMemory用于源和目标内存不重合的情况,RtlMoveMemory用于二者有交叉的情况,二者的关系相当于memcpy和memmove





No comments:

Post a Comment