精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
服务方向
联系方式
锐英源承接关于本文的任何培训、开发和技术服务需求,欢迎联系QQ396806883,微信ryysoft。
近期驱动开发培训学员学习顺利进行中,在和学员交流中,学员认真学员,对于驱动开发语法上关于数据安全细节上进行了总结,这里分享给大家。
驱动运行在操作系统的关键部位,如果驱动出问题,整个操作系统的调度都不能进行,轻则蓝屏,重则丢数据,所以对驱动代码质量要求很高,进而给开发带来了复杂度。这些复杂度有如下体现:
三成员模式
typedef struct _UNICODE_STRING {
USHORT Length; // 字符串的长度(字节数)
USHORT MaximumLength; // 字符串缓冲区的长度(字节数)
PWSTR Buffer; // 字符串缓冲区
} UNICODE_STRING, *PUNICODE_STRING;。
这是安全的描述,但记住它本身并没有字符串。因为第三个成员是指针,不是数组。
字符串的数据安全一方面是用更多的成员来约束长度的使用,另外是指定用宏和新函数来处理字符串,换掉用C库函数的习惯,这样对保证字符串的安全有了前提,不过最终还是要看开发人员的执行。
内存的分配和释放用了特殊的函数代替了C库函数。
内存标记有点象应用层的预分配内存堆来对内存使用进行归类。
最厉害的还是LIST_ENTRY,用专用内存链表来约束开发人员使用内存,LIST_ENTRY可以理解为一个小的GC库,开发人员注册内存到库里,驱动某个功能执行完,把本功能库里的内存全释放,这样就防止了随意申请偶然泄露问题,但是开发人员要理解这样的苦心,用对用好。
在应用层面讲句柄,学员还不好理解,但是在驱动开发层面OBJECT_ATTRIBUTES能统一管理文件和注册表句柄,就会明白句柄的概念。句柄是操作系统层面管理特殊对象的指针,比如文件是特殊对象,句柄个数有限,句柄打开不关闭,就有泄漏,句柄多了,程序就崩溃了。