本文介绍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

wdk驱动开发的特点的更多相关文章

  1. WDK驱动开发点滴

    老程序员做新方向,老树发新芽,作为菜鸟的我,写点心得,用以记录并与同行交流 1对一些概念的理解: KMDF与UMDF.两者的框架,及使用VS生成的初始代码基本相同,只有所包含的头文件不同,链接的系统库 ...

  2. VS2013+WDK8.1 驱动开发环境配置

    Windows Driver Kit 是一种完全集成的驱动程序开发工具包,它包含 WinDDK 用于测试 Windows 驱动器的可靠性和稳定性,本次实验使用的是 WDK8.1 驱动开发工具包,该工具 ...

  3. 驱动开发 - WDK 调试及 SVN 环境搭建

    由于从公司辞职了,所以以前在公司里搭建的驱动开发环境也就 Game Over 了, 同样由于那环境是很久以前搭建的,自己也有很多记不清楚的地方了, 而且其中还是有很多需要注意的地方的,所以在这里顺便做 ...

  4. Windows驱动开发工具 WDK 学习笔记(1)

    目标:能够把电脑当作一个集成有高性能处理器的开发板用起来,当然,还自带了一个高级的操作系统Windows(必须的).总之,就是在一个带了操作系统的高性能开发板上的驱动程序开发. 性质:纯属业余爱好 1 ...

  5. VS2017搭建驱动开发环境WDK

    先安装VS2017,然后在安装WDK,WDK会自动关联到VS2017中,不用你任何操作,自动在新建项目中可以找到驱动开发. 如果以上安装完成后,在VS2017中新建项目中没有发现WDK,那么需要进行修 ...

  6. Windows驱动开发VS2012 DDK/WDK的环境配置

    [开发Windows驱动的配置是很必要的,下文将详细介绍VS2012如何配置驱动开发环境] [转载] 以下部分内容是转载博客:http://blog.csdn.net/huangxy10/articl ...

  7. 【hyddd驱动开发学习】DDK与WDK

    最近尝试去了解WINDOWS下的驱动开发,现在总结一下最近看到的资料. 1.首先,先从基础的东西说起,开发WINDOWS下的驱动程序,需要一个专门的开发包,如:开发JAVA程序,我们可能需要一个JDK ...

  8. 2013-6-2 [转载自CSDN]如何入门Windows系统下驱动开发

    [序言]很多人都对驱动开发有兴趣,但往往找不到正确的学习方式.当然这跟驱动开发的本土化资料少有关系.大多学的驱动开发资料都以英文为主,这样让很多驱动初学者很头疼.本人从事驱动开发时间不长也不短,大概 ...

  9. Windows内核安全与驱动开发

    这篇是计算机中Windows Mobile/Symbian类的优质预售推荐<Windows内核安全与驱动开发>. 编辑推荐 本书适合计算机安全软件从业人员.计算机相关专业院校学生以及有一定 ...

随机推荐

  1. ORACLE 11g 创建数据库时 Enterprise Manager配置失败的解决办法 无法打开ORACLE企业管理器(EM)的解决办法

    环境:win7 64位系统. 软件:oracle11g database ,oracle 10g client . 问题描述:在win7 64位系统下安装oracle11g,在创建数据库时,进度到85 ...

  2. 【SpringBoot】息队列介绍和SpringBoot2.x整合RockketMQ、ActiveMQ

    ========================13.消息队列介绍和SpringBoot2.x整合RockketMQ.ActiveMQ ======================= 1.JMS介绍和 ...

  3. glog学习(一):glog的编译及demo

    windows平台: 1.下载glog代码.下载地址:https://github.com/google/glog 2.使用cmake工具,获得对应的工程文件sln. 3.打开sln文件,生成对应的l ...

  4. nginx屏蔽某段IP、某个国家的IP

    nginx中可通过写入配置文件的方法来达到一定的过滤IP作用,可使用deny来写. deny的使用方法可用于前端服务器无防护设备的时候过滤一些异常IP,过滤的client ip会被禁止再次访问,起到一 ...

  5. python从含有汉字和数字的字符串中提取数字部分

    我遇到的问题是:我想要从字符串“1小时12分钟”中(其中两个数字是变化的)截取出1和12. 切片的方法比较简单,但不适合变化的字符串. filter(str.isdigit,"1小时12分钟 ...

  6. sso cas4.0改造历程--spring-webflow篇

    https://blog.csdn.net/sinat_20689109/article/details/54910642

  7. Matlab中调用VS编译的exe文件并传递变量 的方法

    经历::在网上找了很多方法,都没有实现在matlab中调用vs的exe文件并且能够传递变量参数,一些小细节花费了自己很多时间,比喻忽略了一些空格!  网上很多的方法都是纯粹复制别人的方法,自己都没有去 ...

  8. 虚拟空间,malloc

    一,内存空间分布图 所以,mmap其实和堆一样,实际上可以说他们都是动态内存分配,但是严格来说mmap区域并不属于堆区,反而和堆区会争用虚拟地址空间. 这里要提到一个很重要的概念,内存的延迟分配,只有 ...

  9. CSS之边框

    <!DOCTYPE html> <!--边框--> <html lang="en"> <head> <meta charset ...

  10. ORM的多表查询详述

    ORM的多表查询 ORM最核心与用的最多的地方就是跨表查询了.这里的"跨表查询"分为以下几种:基于对象的跨表查询.基于双下划线的跨表查询.聚合查询.F与Q查询以及分组查询. 下面就 ...