Windows 驱动开发基础(六)NT驱动的基本结构

Windows 驱动开发基础系列,转载请标明出处:http://blog.csdn.net/ikerpeng/article/details/38821919

NT类型的驱动即不是即插即用的驱动,主要包括3部分:DriverEntry函数,CreateDevice函数,DriverUnload函数.其实还有IRP派遣函数,但是这里先不做介绍。

接下来详细的说明一下。

系统启动的时候,就创建了系统进程;驱动加载的时候,系统启动一个新的线程,创建一个驱动对象。而当系统线程调用DriverEntry函数的时候,就实现了对驱动对象的初始化。

1. DriverEntry

extern “C”NTSTATUS DriverEntry(  IN PDRIVER_OBJECT pDriver_Object,

IN PUNICODE_STRING pRegistryPath );

pDriver_Object:指向这个驱动对象。

pRegistryPath:指向设备服务键的键名字符串的指针。该字符串的内容一般为\REGISTRY\MACHINE\SYSTEM\ControlSet\Services\[服务名]。

其中:IN 是参数的修饰词,代表是 参数时输入,同理,OUT表示存催的输出,两个可以同时用。

返回值是一个32位的LONG,也就是NTSTATUS型的数据。

2. CreateDevice

是通过IoCreateDevice创建的,形式如下:

NTSTATUS

IoCreateDevice(

IN PDRIVER_OBJECT  DriverObject,

IN ULONG  DeviceExtensionSize, //指定设备扩展的大小

IN PUNICODE_STRING  DeviceName  OPTIONAL,//设备对象的名字

IN DEVICE_TYPE  DeviceType,

IN ULONG  DeviceCharacteristics,//设置设备对象的特征

IN BOOLEAN  Exclusive,//设置设备对象是否在内核模式下使用,一般为TRUE

OUT PDEVICE_OBJECT  *DeviceObject //指向新创建的设备对象。

);

需要指出的是,即便是给出了设备的名称也只能是被内核模式下其他驱动所识别,要用用户模式下面的应用程序识别就需要使用:符号链接的方法。也就是起一个别名的方式,就好像我们给硬盘取名叫“C盘”,就可以被其他的应用程序识别了。

这个函数是:

NTSTATUS

IoCreateSymbolicLink(

IN PUNICODE_STRING  SymbolicLinkName,//别名(的地址)

IN PUNICODE_STRING  DeviceName            //这个设备

);

在内核模式下,符号链接就是以”\??\”开头的(或者“\DosDevice\”开头的)。如C盘就是“\??\C:”。而在用户模式下则是以“\\.\”开头的,如C盘就是“\\.\C:”

3.
DriverUnload

一般负责删除掉DriverEntry里面创建的设备对象。同时也会删掉创建的符号链接。具体的函数如下:

VOID

IoDeleteDevice(

IN PDEVICE_OBJECT  DeviceObject

);

NTSTATUS

IoDeleteSymbolicLink(

IN PUNICODE_STRING  SymbolicLinkName

);

时间: 2024-11-08 11:57:41

Windows 驱动开发基础(六)NT驱动的基本结构的相关文章

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

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

Windows 驱动开发基础(九)内核函数

Windows 驱动开发基础系列,转载请标明出处:http://blog.csdn.net/ikerpeng/article/details/38849861 这里主要介绍3类Windows的内核函数:字符串处理函数,文件操作函数, 注册表读写函数.(这些函数都是运行时函数,所以都有Rtl字样) 1 字符串处理函数 首先驱动程序中,常用的字符串包括4种:CHAR (打印的时候注意小写%s), WCHAR(打印的时候注意大写%S), ANSI_STRING, UNICODE_STRING.后面两种

Windows驱动程序开发基础(四)驱动的编译调试和安装

Windows驱动程序开发基础,转载标明出处:http://blog.csdn.net/ikerpeng/article/details/38793995 下面说一下开发出来驱动程序以后如何编译.一般有以下几种方式: 1. 建立Makefile文件,用nmake工具进行编译和链接: 2. 建立Makefile,sources, dirs文件,用build工具编译. 3. 用集成开发环境进行编译链接. 我采用的是第三种方式,通过VS2010+wdk配置Windows驱动程序开发环境.地址:   h

Windows驱动开发基础(五)驱动程序的数据结构

Windows驱动开发基础:驱动程序的数据结构.转载请标明出处:http://blog.csdn.net/ikerpeng/article/details/38794405 I/O管理器定义了一些数据结构,这些很重要. 1. 驱动对象(DRIVER_OBJECT) 通过一个typedef 定义的以一个struct: <span style="font-family:Microsoft YaHei;">typedef struct { PDEVICE_OBJECT Devic

Android深度探索(卷1)HAL与驱动开发 第六章 第一个Linux驱动程序:统计单词个数

Android深度探索(卷1)HAL与驱动开发 第六章 第一个Linux驱动程序:统计单词个数 统计单词个数的功能是封装在Linux驱动中的. Linux驱动的工作和访问方式是Linux亮点之一,同时受到了业界大防范好评.Linux系统将每一个驱动都映射成一个文件.这些文件称为设备文件或者驱动文件,都保存在 /dev 目录中.这种设计理念使得与Linux驱动进行交互就像与普通文件进行交互一样容易.当然,也比访问Linux API 更容易.由于大多数Linux驱动都有与其对应的设备文件,因此与Li

Linux驱动开发之 六 (那些必须要了解的硬件知识 之 仪器篇)

Linux驱动开发之 六 (那些必须要了解的硬件知识 之 仪器篇) 一.前言 在之前的文章中,老谢已经分享了不少关于嵌入式系统开发过程中必须要了解的硬件知识.作为这一小节的结束(哎呀,终于要结束了),老谢还想和大家聊聊"仪器".本文中老谢不聊仪器的具体使用方法.原理等.只想聊点轻松的,老谢结合自己的实际工作,以图文结合的方式,简单聊聊工作中使用到的仪器. 实话实说,前几篇文章基本无技术含量,包括本文.老谢坚持写这几篇的用意是: Linux驱动开发,必须以此为基础: 通过写博客的方式,让

Windows 驱动开发 - 基础1

原来的驱动开发都是WDM(Windows Driver Model)的,那时微软推出DDK(Driver Developer Kit)工具. 现在微软进行了升级由WDF(Windows Driver Foundation)来替代WDM,同时推出WDK(Windows Driver Kit)工具. 安装WDK要求的最低系统为Win XP SP3以上. 推荐使用的IDE:VS2010 一.WDM与WDF的区别 (1) 前者使用面向过程,后者可使用面向对象. (2) 前者可开发总线筛选驱动程序; 后者

Linux设备驱动开发基础

1.驱动概述和开发环境搭建 1.1驱动设备的作用 对设备驱动最通俗的解释就是"驱动硬件设备行动".驱动与底层硬件直接打交道,按照硬件设备的具体工作方式,读写设备的寄存器,完成设备的轮训.中断处理.DMA通信,进行物理内存向虚拟内存的映射等,最终让通信设备能收发数据,让显示设备能显示文字和画面,让存储设备能记录文件和数据. 由此可见,设备驱动充当了硬件和应用软件之间的纽带,他使得应用软件只需要调用系统软件的应用编程接口(API)就可让硬件去完成要求的工作.在系统中没有操作系统的情况下,工

安卓移植和驱动开发第六章心得体会

第六章 第一个LINUX驱动程序:统计单词个数 统计单词数的word_count 驱动是本书实现的第一个完整的Linux 驱动.虽然word_count 驱动的功能并不复杂,但足以让以前从来接触过Linux 驱动的开发人员了解Linux 驱动的完整开发过程.本章不仅仅是介绍一个示例,还介绍了如何使用不同的方法测试Linux 驱动.这些方法主要以平台来区分.当然,要编写 Linux 驱动程序还需要更高级的功能. 如向打印机驱动写入数据时, 对于打印机 驱动来说,需要接收这些被写入的数据,并将它们通