Windows 驱动入门(一)

本博客为Windows驱动开发的基础。转载标明出处:http://blog.csdn.net/ikerpeng/article/details/38776407

一个简单的Windows驱动程序一般包括:头文件(决定NT,WDM;定义宏。。。),入口函数(相当于main),创建设备例程(相当于函数的实现),驱动的卸载,默认派遣。

知识点:

1. 两种驱动:NT和WDM:前者不支持即插即用;头文件分别是:NTDDK.h, WDM.h ;

2.DriverEntry才是函数的入口,包括两个参数:pDriverObject(I/O管理器传过来的驱动对象),pRegistryPath(指向驱动负责的注册表);

3. 设备扩展结构体:负责补充定义设备的相关信息;

4.用#pragma INITCODE  将程序加载到INIT内存区域;INIT标志标明该程序成功加载后可以卸载;

5.加入extern“c”才能保证用C++写的时候不会出错;

6.驱动程序会注册一些回调函数供操作系统调用(都在pDriverObject里面),通过指针的方式将地址告诉操作系统;

7. CreateDevice(pDriverObject)是一个帮助函数,辅助DriverEntry创建一个设备对象;

构造一个Unicode字符串存储设备对象名称;

IoCreateDevice创建设备对象;

填写设备的扩展结构体;

创建符号链接;()

创建成功则返回,不成功则删除。

8.卸载驱动处理驱动被卸载时的情况:第一个设备对象的地址存储于DeviceObject域中,每一个设备对象中的NextDevice域记录着下一个设备对象的地址,这样形成一个链表,会用到:#pragma PAGEDCODE:

由驱动对象得到设备对象;

删除设备对象的符号链接;

遍历设备对象,并删除。

9. 默认派遣中指定了对设备对象的创建,关闭和读写的操作,和IRP的状态有关。

参考书目:

《 Windows 驱动开发技术详解 》

时间: 2024-11-06 11:44:58

Windows 驱动入门(一)的相关文章

Windows 驱动入门(二)代码结构

windows驱动程序基础.转载标明出处:http://blog.csdn.net/ikerpeng/article/details/38777641 windows驱动程序结构: 我想说的是windows驱动程序的结构和C++的程序结构是一样的,在你知道这一点以后你就会认为简单了很多. 首先在一个头文件中面做一些必要的预处理.然后定义会用到的设备扩展结构体(相当于Class):接下来就是函数的声明. 当这一切结束以后,我们就在.cpp文件中面实现这些函数.可是不一样的地方要说一下: 1.这里声

【转】Windows驱动开发如何入门

1.http://blog.csdn.net/charlessimonyi/article/details/50904854 (2016年03月16日 14:55:36) 2. 搞Windows驱动开发是一件痛苦的事情,特别是初学Windows驱动开发.有的人觉得Windows驱动开发就是把开发包WDK下载下来,然后只要掌握了C/C++语言,接下来无非就是类库调来调去,像调用MFC.QT之类的库那样,看着书和MSDN上的文档来就行了.等真正接触以后才发现根本不是那么一回事,痛苦源于以下几点: 痛

windows驱动开发推荐书籍

[作者] 猪头三 个人网站 :http://www.x86asm.com/ [序言] 很多人都对驱动开发有兴趣,但往往找不到正确的学习方式.当然这跟驱动开发的本土化资料少有关系.大多学的驱动开发资料都以英文为主,这样让很多驱动初学者很头疼.本人从事驱动开发时间不长也不短,大概也就3~4年时间.大多数人都认为会驱动开发的都是牛人,高手之类的.其实高手,牛人不是这样定义的.我们在学习驱动开发之前,一定要明白一个道理:术业有专攻,不要盲目跟风. [贡献者] 1> defddr 看雪学院 2> Stu

Windows驱动开发(一)

笔者学习驱动编程是从两本书入门的.它们分别是<寒江独钓--内核安全编程>和<Windows驱动开发技术详解>.两本书分别从不同的角度介绍了驱动程序的制作方法. 在我理解,驱动程序可分为两类三种: 第一类:传统型驱动 传统型驱动的特点就是所有的IRP都需要自己去处理,自己实现针对不同IRP的派发函数.其可以分为以下两种: 1. Nt式驱动:此驱动通过注册系统服务来加载,并且不支持即插即用功能(即没有处理IRP_MJ_PNP这个IRP). 2. WDM驱动:此驱动不通过注册系统服务来加

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

版权声明 本书是免费电子书. 作者保留一切权利.但在保证本书完整性(包括版权声明.前言.正文内容.后记.以及作者的信息),并不增删.改变其中任何文字内容的前提下,欢迎任何读者 以任何形式(包括各种格式的文档)复制和转载本书.同时不限制利用此书赢利的行为(如收费注册下载,或者出售光盘或打印版本).不满足此前提的任何转载. 复制.赢利行为则是侵犯版权的行为. 发现本书的错漏之处,请联系作者.请不要修改本文中任何内容,不经过作者的同意发布修改后的版本. 作者信息 作者网名楚狂人.真名谭文.在上海从事W

Windows驱动开发基础(八)内存管理

Windows驱动开发基础系列,转载请标明出处:http://blog.csdn.net/ikerpeng/article/details/38826159 就32位的计算机来说,他有4G的真实的物理内存.但是这样是不够的,于是引入了虚拟内存的概念.使得每一个进程都有4G的虚拟内存. 虚拟内存实际上就是采用了一种映射的方式.4G的内存实际上被分页.一般来说一个页的大小是4K.也是说它被分为了1M个页.在这么多的页里面,有一部分是对应于物理内存的(可以是多对一的):有一部分是对应于磁盘上的空间,但

Windows驱动开发(中间层)

Windows驱动开发 一.前言 依据<Windows内核安全与驱动开发>及MSDN等网络质料进行学习开发. 二.初步环境 1.下载安装WDK7.1.0(WinDDK\7600.16385.1) 地址:https://msdn.microsoft.com/en-us/windows/hardware/hh852365 2.下载InstDrv软件(用于安装.启动.停止.卸载驱动) 界面如下: 注:srvinstw.exe 也可以安装.卸载sys文件,但需要手动开启.关闭,即在cmd命令窗口下执行

Windows 驱动开发 - 7

在<Windows 驱动开发 - 5>我们所说的读写操作在本篇实现. 在WDF中实现此功能主要为:EvtIoRead和EvtIoWrite. 首先,在EvtDeviceAdd设置以上两个回调事件. ioQueueConfig.EvtIoRead = EvtIoRead; ioQueueConfig.EvtIoWrite = EvtIoWrite; 然后,在EvtDevicePrepareHardware中获取WDFUSBPIPE并测试他. pDeviceContext->BulkRead

Windows 驱动开发 - 8

最后的一点开发工作:跟踪驱动. 一.驱动跟踪 1. 包含TMH头文件 #include "step5.tmh" 2. 初始化跟踪 在DriverEntry中初始化. WPP_INIT_TRACING( DriverObject, RegistryPath ); WDF_OBJECT_ATTRIBUTES_INIT(&attributes); attributes.EvtCleanupCallback = EvtDriverContextCleanup; (1) WPP跟踪初始化