分配内存
1.保证分配内存失败不会导致crash:进行失败处理和重试,以及保存已被分配的内存指针
2.使用tagged 内存分配来更好的debug和防止内存泄露
使用spin locks
1.在使用spin lock时不要访问paged代码和数据
使用PAGED_CODE()宏
2.尽可能短时间保持spin lock
3.小心地获取和释放spin lock:获取前先释放
4.按获取的逆顺序释放多重锁
5.使用Driver Verifier探测dead lock
管理Page fault
1.内存正确分配:合理选择paged/nonpaged pool
2.运行Driver Verifier并打开IRQL Checking:找paging相关错误
访问用户模式内存
1.不要信任任何来自用户模式的内容:长度检测,恶意检测,传入参数的复制(防止被修改)
2.不要简单的对用户模式指针解引用:probe&lock with DDI routines;使用try,catch。
阻塞线程
1.小心线程阻塞
验证驱动
1.运行Driver Verifier和KMDF Verifier:paged access error
2.使用PREfast和SDV检查代码
使用宏
1.使用VERIFY_IS_IRQL_PASSIVE_LEVEL()宏保证例程都运行在PASSIVE_LEVEL中。
2.使用PAGED_CODE()保证代码运行在PASSIVE_LEVEL之下。
3.使用UNREFERENCED_PARAMETER对所有不用的参数进行标记:Ntddk.h
1.保证分配内存失败不会导致crash:进行失败处理和重试,以及保存已被分配的内存指针
2.使用tagged 内存分配来更好的debug和防止内存泄露
使用spin locks
1.在使用spin lock时不要访问paged代码和数据
使用PAGED_CODE()宏
2.尽可能短时间保持spin lock
3.小心地获取和释放spin lock:获取前先释放
4.按获取的逆顺序释放多重锁
5.使用Driver Verifier探测dead lock
管理Page fault
1.内存正确分配:合理选择paged/nonpaged pool
2.运行Driver Verifier并打开IRQL Checking:找paging相关错误
访问用户模式内存
1.不要信任任何来自用户模式的内容:长度检测,恶意检测,传入参数的复制(防止被修改)
2.不要简单的对用户模式指针解引用:probe&lock with DDI routines;使用try,catch。
阻塞线程
1.小心线程阻塞
验证驱动
1.运行Driver Verifier和KMDF Verifier:paged access error
2.使用PREfast和SDV检查代码
使用宏
1.使用VERIFY_IS_IRQL_PASSIVE_LEVEL()宏保证例程都运行在PASSIVE_LEVEL中。
2.使用PAGED_CODE()保证代码运行在PASSIVE_LEVEL之下。
3.使用UNREFERENCED_PARAMETER对所有不用的参数进行标记:Ntddk.h