函数的多线程安全性在内核编程中比用户态应用程序的编程更常见。

调用源 运行环境 原因
driverEntry,DriverUnload 单线程 这两个函数由系统进程的单一线程调用,不会出现多线程同时调用 的情况
各种分发函数 多线程 分发函数有可能并发,也可能和DriverUnload并发
完成函数 多线程 完成函数随时可能被未知的线程调用
各种NDIS回调函数 多线程 同上

中断级

先简单理解passive级和Dispatch级两种,后者比前者级高,在实际编程中,许多具有比较复杂功能的内核API都要求必须在Passive级执行。

只有比较简单的函数能在Dispatch级执行。调用任何一个内核API之前,必须查看WDK文档,这个内核API的中断级要求。

调用源 一般的运行中断级
DriverEntry,DriverUnload Passive
分发函数 Passive
完成函数 Dispatch
NDIS回调函数 Dispatch

WDK中出现的特殊代码

1.参数说明宏,只是说用来说明参数的一些信息,一般都是空宏,最常见的是IN和OUT。定义如下

#define IN

#define OUT

2.指定函数位置的预编译指令

#pragma alloc_text(INIT,DriverEntry)

#pragma alloc_text(PAGE,NdisProtUnload)

这个宏仅仅用用来指定某个函数的可执行代码在编译出来后在sys文件中的位置。

PE的文件结构分成节,不同的节被加载到内在中之后处理情况不同,

INIT节的特点是被初始化完毕之后就被释放。也就不再占用内存空间了。函数DriverEntry可以在这个阶段执行一次,因此这个函数一般用#pragma alloc_text(INIT,DriverEntry)使之位于INIT节。

Page节的特点是位于可以分页交换的内存空间,这些空间在内存紧张时可以被交换到硬盘上以节省内存。

如果未用上述的预编译指令处理,则代码默认位于PAGELK节,加载后位于不可分页交换的内存空间。

需要注意的是,放在PAGE节的函数不可以在Dispatch级调用,因为这种函数的调用可能诱发缺页中断,但是缺页中断不能在Dispatch级完成。

WDK编程的一些特殊点的更多相关文章

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

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

  2. 《Windows内核安全与驱动开发》阅读笔记 -- 索引目录

    <Windows内核安全与驱动开发>阅读笔记 -- 索引目录 一.内核上机指导 二.内核编程环境及其特殊性 2.1 内核编程的环境 2.2 数据类型 2.3 重要的数据结构 2.4 函数调 ...

  3. windows内核编程之常用数据结构

    1.返回状态 绝大部分的内核api返回值都是一个返回状态,也就是一个错误代码.这个类型为NTSTATUS.我们自己写的函数也大部分这样做. NTSTATUS MyFunction() { NTSTAT ...

  4. (转)Windows驱动编程基础教程

    版权声明     本书是免费电子书. 作者保留一切权利.但在保证本书完整性(包括版权声明.前言.正文内容.后记.以及作者的信息),并不增删.改变其中任何文字内容的前提下,欢迎任何读者 以任何形式(包括 ...

  5. 如何搭建Visual Studio的内核编程开发环境

    最近正在看<寒江独钓——Windows内核安全编程>这本书,感觉这本书非常好,有兴趣的朋友可以买来看看,有关这本书的信息请参考:http://www.china-pub.com/19559 ...

  6. 《天书夜读:从汇编语言到windows内核编程》五 WDM驱动开发环境搭建

    (原书)所有内核空间共享,DriverEntery是内核程序入口,在内核程序被加载时,这个函数被调用,加载入的进程为system进程,xp下它的pid是4.内核程序的编写有一定的规则: 不能调用win ...

  7. 【整理】WDK 和 DDK异同

    WDK和DDK的作用 开发WINDOWS下的驱动程序,需要一个专门的开发包,如:开发JAVA程序,我们可能需要一个JDK,开发 WINDOWS应用程序,我们需要WINDOWS的SDK,现在开发WIND ...

  8. Windows SDK DDK WDK (Windows Driver Kit) 区别

    首先,先从基础的东西说起,开发WINDOWS下的驱动程序,需要一个专门的开发包,如:开发JAVA程序,我们可能需要一个JDK,开发WINDOWS应用程序,我们需要WINDOWS的SDK,现在开发WIN ...

  9. wdk驱动开发的特点

    本文介绍WDK开发的一些特点.与应用层开发的差异性,不能混为一谈. 一.函数的调用点 在内核编程中,一个函数往往有多个调用点,而应用层中一个函数一般只在main里面有调用点.内核函数调用点一般在: 1 ...

随机推荐

  1. web服务器之nginx与apache

    最近准备架设php的web服务器,以下内容可供参考. 1.nginx相对于apache的优点: 轻量级,同样起web 服务,比apache占用更少的内存及资源 抗并发,nginx 处理请求是异步非阻塞 ...

  2. C#递归题目代码

    一列数的规则如下: 1.1.2.3.5.8.13.21.34...... 求第30位数是多少, 用递归算法实现. 代码: public class MainClass { public static ...

  3. 母版页 VS shtml—ASP.NET细枝末节(3)

    这算是html的重用吧? 摘自: http://www.cnblogs.com/mcad/p/4352665.html 网页很多地方长得一样,也有不一样的地方. 把网页中一样的地方,提取出来,形成一个 ...

  4. 【jQuery基础学习】01 jQuery选择器

    关于CSS选择器 jQuery选择器涉及到CSS,CSS技术使得网页的结构与表现样式完全分离. 同样CSS也需要找到某个网页的结构才能改变其样式,这就是CSS选择器. 常用的CSS选择器如下: 标签选 ...

  5. How to create water Ripple effect using HTML5 canvas

    https://www.script-tutorials.com/how-to-create-water-drops-effect-using-html5-canvas/ https://www.sc ...

  6. EffectiveJava——复合优先于继承

    继承时实现代码重用的重要手段,但它并非永远是完成这项工作的最佳工具,不恰当的使用会导致程序变得很脆弱,当然,在同一个程序员的控制下,使用继承会变的非常安全.想到了很有名的一句话,你永远不知道你的用户是 ...

  7. 一个SpringMVC简单Demo中出现的错误

    最近在学springmvc 一个简答的Springmvc配置包括如下步骤: 1.在 web.xml 文件中配置 DispatcherServlet (该中央控制器相当于 MVC 模式中的 C),还可以 ...

  8. SQL Server的各种表

    以下表格简便易懂 请认真仔细斟酌! 字符串函数: 字符串函数用于对字符串数据进行处理,并返回一个字符串或者数字. 函数名 描述 例子 CHARINDEX 用来寻找一个指定的字符串在另一个字符串中的起始 ...

  9. Mysql之执行计划

    1.explain分析sql语句 例如: EXPLAIN )  ORDER BY bi.`publish_time`  返回结果: 而今天检查的不是这条sql,远比这条复杂,不过也能反映情况了. (1 ...

  10. mvc项目架构分享系列之架构搭建之Repository和Service

    项目架构搭建之Repository和Service的搭建 Contents 系列一[架构概览] 0.项目简介 1.项目解决方案分层方案 2.所用到的技术 3.项目引用关系 系列二[架构搭建初步] 4. ...