windows 驱动编程规范
原文:http://hi.baidu.com/kernelkit/blog/item/3e291d230d4d595b9922ed35.html 最近又在看恶心的代码,于是在地铁上想了想windows驱动编程的规范问题。整理了一下,如下,欢迎指正和补充。 1 驱动编程中,代码的规范性比技巧更重要。除非有苛刻的要求,否则少用晦涩的技巧。 2 永远要努力将复杂的问题简单化,不要让代码的逻辑不清晰使问题变得更复杂。代码只有自己能看懂那是垃圾,代码可以让更多的人更轻易看懂才叫真正的高 水平。 3 所有涉及到的技术要点要在正式编码之前单独测试,包括效率,兼容性,稳定性等。所以技术方案使用前要充分讨论,充分论证。 4 项目中涉及到的核心数据结构要提前规划好。涉及到通信的结构要具有可扩展性。 5 算法要符合实际应用,请先拿到可信的测试数据再决定采用何种算法。比如数据量小的时候可以使用list,数据量大了可能有必要使用hash将list进行散列。 数据量更大可能需要使用树,如果数据变化大需要使用伸展树。一次性初始化,后面都是查询操作应该使用平衡树。 6 永远使用最新的ddk版本,使用和OS对应的编译环境编译代码 7 驱动程序需要通过driver verifier测试 8 代码需要在oacr 下无警告 9 所有可以用API搞定的事情请使用API 10 所有对api的使用,请确保通读msdn对该api的描述。 11 所有接受参数的函数,请在函数入口检查参数合法性。所有使用到不可控参数的地方应该用SEH保护起来。 12 如果局部变量作为指针传递出去,请确保调用关系在同一堆栈中。因为局部变量具有挥发性。 13 仅在单个函数内使用的非挥发性变量,请使用static修饰符,避免使用过多的全局变量 14 对于传入传出型参数,请保证仅在函数返回成功的时候修改参数。 15 内核中一个线程的堆栈空间有限,要避免定义过长的局部变量。不使用递归函数。 16 函数尽可能的单出口,不要随地都是return。 17 避免使用goto 18 对于确定类型的指针请不要使用pvoid,因为传入了错误的指针编译器不会报警。 19 所有对指针的指针的使用,请尽量使用引用,除非你非常谨慎。因为传入一级指针编译器还是不会报警。 20 定义结构的时候需要考虑字节对齐的粒度问题。尤其当代码需要在32位和64为下同时使用的时候。 21 对指针做运算时,请注意运算的单位是指针所指数据结构的大小。 22 如果代码想同时适用32,64位平台。需要注意对指针的定义,可以使用PVOID,PULONG_PTR等自动适应的指针类型。 23 所以对buffer的操作,请时刻注意其边界。 24 所有对字符串的操作,请至少使用安全字符串函数。 25 [...]
