wdk驱动开发的特点

本文介绍WDK开发的一些特点。与应用层开发的差异性,不能混为一谈。

一、函数的调用点

在内核编程中,一个函数往往有多个调用点,而应用层中一个函数一般只在main里面有调用点。内核函数调用点一般在:

1、入口函数DriverEnty和DriverUnload中

2、各种分发函数(普通分发和快速IO分发)

3、请求处理完成后会被系统调用的回调函数。

(回调函数参考http://www.zhihu.com/question/19801131  或者 http://blog.csdn.net/callmeback/article/details/4242260)

一个形象的例子:

你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件。
4、其他回调函数(NDIS驱动程序的特征函数)

二、函数的多线程安全性
1、运行在多线程的函数必须是安全的,单线程的环境运行,不需要多线程安全。
2、函数的调用源运行在单线程,函数也会运行在单线程中。
3、函数调用源如果在多线程下,或者并发调用下,如果调用路径没有强制多线程序列成单线程,则函数可能在多线程中。
4、如果在调用路径上,有序列化成单线程,则函数可能运行在单线程下。

三、判断函数是否多线程安全
1、完全不用全局变量,静态变量或者其他全局性的资源
2、使用互斥体、自旋锁等同步手段将多线程序列化成单线程

四、PE格式
内核模块编译出来的PE格式的sys文件是有不同的节.
INIT:初始化完成后就从内存中撤掉,不占用内存空间
PAGE:分页内存,当内存不足时候,这段代码可以以文件形式交换到硬盘上,以节约内存空间
PAGELK:默认存放在不可分页的内存空间中,一直存在内存空间

五、代码中断级
Disptch高于 Passive级别
具有复杂功能的内核API都在Passive运行,如果当前代码是运行在Dispatch级别,但是必须要调用一个Passive级别的API,是不可以随意降低当先线程的中断级的。
Windows的代码都会按照一定规范运行在应该的中断级上,随意降低会影响系统的稳定性。
针对这种情况,一般用一个专门的线程去处理Passive级别的代码。

六、代码调试
在入口函数写入如下代码,这样可以让代码在调试状态下强行中断下来。以便后面F9的断点设置,否则F9断点在WDBG下是很不方便的。
#if DBG
     __asm
{
int 3;
}
#endif

posted @ 2016-03-19 14:56  geons  阅读(244)  评论(0编辑  收藏  举报