Windows驱动开发-设备读写方式】的更多相关文章

设备读写方式共三种: 方式 Flag 特点 缓冲区方式读写 DO_BUFFERED_IO I/O管理器先创建一个与用户模式数据缓冲区大小相等的系统缓冲区.而你的驱动程序将使用这个系统缓冲区工作.I/O管理器负责在系统缓冲区和用户模式缓冲区之间复制数据. 直接方式读写 DO_DIRECT_IO I/O管理器锁定了包含用户模式缓冲区的物理内存页,并创建一个称为MDL(内存描述符表)的辅助数据结构来描述锁定页.因此你的驱动程序将使用MDL工作. Neither方式 0 I/O管理器仅简单地把用户模式的…
设备对象Device_Object记录通用设备信息,另外一些信息记录在设备扩展里,设备扩展由程序员自己定义,由程序员指定内容和大小,由I/O管理器创建,并保存在非分页内存中. 驱动程序中,尽量避免使用全局函数,因为全局函数往往导致函数的不可重入性, 重入性是指,在多线程程序中,多个函数并行运行,函数的运行结果不会根据函数的先后调用顺序而导致不同, 解决办法是,将全局变量以设备扩展的形式存储,并加以适当的同步保护措施, 除此之外,在设备扩展中,还会记录以下一些内容, 1,设备对象反向指针, 2,设…
最近在学习驱动编程方面的内容,在这将自己的一些心得分享出来,供大家参考,与大家共同进步,本人学习驱动主要是通过两本书--<独钓寒江 windows安全编程> 和 <windows驱动开发技术详解>. 驱动开发过程中,主要使用的C语言,虽说C中定义了许多数据类型,但是一般来说在编码上还是习惯与使用WDK的规范,虽说这个不是必须的,比如有这样一句 unsigned long ul = 0; 这个数据的大小根据不同的机器不同的编译器环境略有不同,这样代码就产生了不可控的行为,但是WDK上…
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驱动开发技术详解>.两本书分别从不同的角度介绍了驱动程序的制作方法. 在我理解,驱动程序可分为两类三种: 第一类:传统型驱动 传统型驱动的特点就是所有的IRP都需要自己去处理,自己实现针对不同IRP的派发函数.其可以分为以下两种: 1. Nt式驱动:此驱动通过注册系统服务来加载,并且不支持即插即用功能(即没有处理IRP_MJ_PNP这个IRP). 2. WDM驱动:此驱动不通过注册系统服务来加…
上篇<Windows 驱动开发 - 4>我们已经完毕了硬件准备. 可是我们还没有详细的数据操作,比如接收读写操作. 在WDF中进行此类操作前须要进行设备的IO控制,已保持数据的完整性. 我们知道进行WDF开发主要是尾随IRPs的"脚步". I/O Request Delivery Mechanism I/O request type UMDF delivery mechanism KMDF delivery mechanism Read Queue Queue Write…
因为工作原因,需要做一些与网卡有关的测试,其中涉及到了驱动这一块的知识,虽然程序可以运行,但是不搞清楚,心里总是不安,觉得没理解清楚.因此想看一下驱动开发.查了很多资料,看到有人推荐Windows驱动开发技术详解这本书,因此本篇文章也是基于这本书进行学习的.有些图片也是按照书上自己画的. Windows操作系统示意图 首先,需要下载相应的工具,将环境搭建起来,VS和WDK,由于我已经安装了VS2017,所以需要找对应版本的WDK(方法).如果想要查OS的版本,可以WIN+R输入winver就可以…
[作者] 猪头三 个人网站 :http://www.x86asm.com/ [序言] 很多人都对驱动开发有兴趣,但往往找不到正确的学习方式.当然这跟驱动开发的本土化资料少有关系.大多学的驱动开发资料都以英文为主,这样让很多驱动初学者很头疼.本人从事驱动开发时间不长也不短,大概也就3~4年时间.大多数人都认为会驱动开发的都是牛人,高手之类的.其实高手,牛人不是这样定义的.我们在学习驱动开发之前,一定要明白一个道理:术业有专攻,不要盲目跟风. [贡献者] 1> defddr 看雪学院 2> Stu…
在<Windows 驱动开发 - 5>我们所说的读写操作在本篇实现. 在WDF中实现此功能主要为:EvtIoRead和EvtIoWrite. 首先,在EvtDeviceAdd设置以上两个回调事件. ioQueueConfig.EvtIoRead = EvtIoRead; ioQueueConfig.EvtIoWrite = EvtIoWrite; 然后.在EvtDevicePrepareHardware中获取WDFUSBPIPE并測试他. pDeviceContext->BulkRead…
<Windows驱动开发技术详解 >331页, 在将IRP发送给底层驱动或其他驱动之前,可以对IRP设置一个完成例程,一旦底层驱动将IRP完成后,IRP完成例程立刻被处罚,通过设置完成例程可以方便地使程序员了解其他驱动对IRP进行的处理, 不管是调用自己的底层驱动或是调用其他驱动,都是使用内核函数IoCallDriver: 当IoCallDriver将IRP的控制权交给被调用驱动时,有两种情况: 1,主动调用的设备是同步完成这个IRP的,从IoCallDriver返回的时刻,代表此IRP已经完…
基于Windows驱动开发技术详解这本书 一.简单的INF文件剖析 INF文件是一个文本文件,由若干个节(Section)组成.每个节的名称用一个方括号指示,紧接着方括号后面的就是节内容.每一行就是一项内容,其形式都是类似SomeEntry=SomwValue.每个项的顺序是可以颠倒的,但系统分析INF文件的时候,是顺序解析的.INF中注释语句是用分号开头的. 二.WDM设备安装在注册表中的变化 WDM式驱动程序的安装会在三个方面修改注册表,分别是硬件子键(Hardware).类子键(Class…
=================================版权声明================================= 版权声明:原创文章 谢绝转载  请通过右侧公告中的“联系邮箱(wlsandwho@foxmail.com)”联系我 勿用于学术性引用. 勿用于商业出版.商业印刷.商业引用以及其他商业用途. 本文不定期修正完善. 本文链接:http://www.cnblogs.com/wlsandwho/p/8151607.html 耻辱墙:http://www.cnblo…
最后的一点开发工作:跟踪驱动. 一.驱动跟踪 1. 包括TMH头文件 #include "step5.tmh" 2. 初始化跟踪 在DriverEntry中初始化. WPP_INIT_TRACING( DriverObject, RegistryPath ); WDF_OBJECT_ATTRIBUTES_INIT(&attributes); attributes.EvtCleanupCallback = EvtDriverContextCleanup; (1) WPP跟踪初始化…
缓冲区方式读写操作 设置缓冲区读写方式:…
本节主要介绍驱动开发的一些基础知识. 1. 驱动程序的基本组成 1.1. 最经常见到的数据结构 a. DRIVER_OBJECT驱动对象 // WDK中对驱动对象的定义 // 每个驱动程序都会有一个唯一的驱动对象与之对应 // 它是在驱动加载时被内核对象管理程序创建的 typedef struct _DRIVER_OBJECT { CSHORT Type; CSHORT Size; // // The following links all of the devices created by a…
分层驱动程序概念 分层的目的是将功能复杂的驱动程序分解成多个简单的驱动程序.一般来说,他们是指两个或两个 以上的驱动程序,它们分别创建设备对象,并且形成一个由高到低的设备对象栈.IRP请求一般会被传送到设备栈的最顶层的设备对象,顶层的设备对象可以选择 直接结束IRP请求,也可以选择将IRP请求向下层的设备对象转发.如果是向下层设备对象转发IRP请求,当IRP请求结束时,IRP会顺着设备栈的反方 向原路返回.当得知下层驱动程序已经结束IRP请求时,本层设备对象可以选择继续将IRP向上返回,或者选择…
   1.  前言 因工作上项目的需要,笔者需要做驱动相关的开发,之前并没有接触过相关的知识,折腾一段时间下来,功能如需实现了,也积累了一些经验和看法,所以在此做番总结. 对于驱动开发的开发指引,微软官方文档网站已经提供了很详细的教程文档,并且在Github上提供了一系列典型的例程源码用于开发人员参考.开发人员在具备一定的驱动概念知识后,通过参考官方例程可以很容易实现拥有特定功能的驱动应用程序. Windows驱动程序入门: https://docs.microsoft.com/zh-cn/wi…
1. windows驱动分两类,NT式驱动和WDM驱动,后者支持即插即用: 2. DriverEntry是入口函数,传入参数:pDriverObject由IO管理器传入: 3. WDM驱动中,AddDevice创建设备对象,由PnP管理器调用:传入参数:(DriverObject, PhysicalDeviceObject),第一个参数是DriverEntry的传入参数,第二个参数由总线驱动创建的PDO: 4. IRP_MJ_PNP分很多子类,包括IRP_MN_START_DEVICE.IRP_…
一.NT式驱动的基本例程 1. 驱动入口函数——DriverEntry // 驱动程序的一般性定义 NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath); // DriverEntry的主要工作是对驱动程序进行初始化.它由系统进程System调用的. 驱动被加载的时候会创建一个驱动对象,查询此驱动程序对应的注册表项. DriverEntry被调用的时候会传进两个参数.他们分别…
目标:能够把电脑当作一个集成有高性能处理器的开发板用起来,当然,还自带了一个高级的操作系统Windows(必须的).总之,就是在一个带了操作系统的高性能开发板上的驱动程序开发. 性质:纯属业余爱好 1.昨天下载了WDK 7.1.0 Free版(From MS的正版,需要注册一个Windows Live ID,下载链接http://www.microsoft.com/downloads/en/confirmation.aspx?familyId=36a2630f-5d56-43b5-b996-76…
[开发Windows驱动的配置是很必要的,下文将详细介绍VS2012如何配置驱动开发环境] [转载] 以下部分内容是转载博客:http://blog.csdn.net/huangxy10/article/details/15284881 [下载] 微软官网下载WDK或者网上有DDK安装包,这是驱动开发的SDK.安装WDK是很简单的,这里不再赘述. [安装DDK/WDK] 安装完成后配置环境变量.根据你WDK安装的位置不同,变量值是不同的,这点需要注意,你需要根据你的实际情况更改. [配置VS20…
windows下的设备是以"\Device\[设备名]”形式命名的. 例如磁盘分区的C盘,D盘的设备名称就是 "\Device\HarddiskVolume2” "\Device\HarddiskVolume3”. 也可以不指定设备名称,那么I/O管理器会自动分配一个数字作为设备的名称.例如 "\Device\00000001" 设备名不容易记忆. 在驱动程序中,定义设备对象名称需要以L"\\device\\"开头, 定义符号链接的名称…
驱动对象 每个驱动程序会有唯一的驱动对象与之对应,并且这个驱动对象是在驱动加载的时候被内核中的对象管理程序所创建的.驱动对象用DRIVER_OBJECT数据结构表示,它作为驱动的一个实例被内核加载,并且内核对一个驱动只加载一个实例.确切的说,是由内核中的I/O管理器负责加载的.驱动程序需要在DriverEntry中初始化. 其结构如下: typedef struct _DRIVER_OBJECT { CSHORT Type; CSHORT Size; // // The following li…
本节介绍“手动”构造各个IRP,然后将IRP传递到相应驱动程序的派遣函数里. 获得设备指针 每个内核中的句柄都会和一个内核对象的指针联系起来.ZwCreateFile内核函数可以通过设备名打开设备句柄,这个设备句柄和一个文件对象的指针关联.IoGetDeviceObjectPointer内核函数可以通过设备名获得文件对象指针,而不是获得设备句柄.当调用IoGetDeviceObjectPointer内核函数后,设备对象的引用计数就会加1.当用完这个设备对象后,应该调用ObDereferenceO…
应用程序对设备的同步异步操作: 大部分IRP都是由应用程序的Win32 API函数发起的.这些Win32 API本身就支持同步和异步操作.例如,ReadFile.WriteFile和DeviceIoControl等,它们都有异步和同步两种操作方式.DeviceIoControl的同步操作如图所示:…
1.首先,先从基础的东西说起,开发WINDOWS下的驱动程序,需要一个专门的开发包,如:开发JAVA程序,我们可能需要一个JDK,开发WINDOWS应用程序,我们需要WINDOWS的SDK,现在开发WINDOWS下的驱动程序,我们需要一个DDK/WDK. 2.DDK(Driver Developer Kit)和WDK(Windows Driver Kit)的区别: 这个要说说驱动相关的一些历史: 1).95/98/ME下,驱动模型为:Vxd,相关资料可以看<编程高手箴言>的前几个章节,里面有很…
一.内存管理概念 1. 物理内存概念(Physical Memory Address)     PC上有三条总线,分别是数据总线.地址总线和控制总线.32位CPU的寻址能力为4GB(2的32次方)个字节.用户最多可以使用4GB的真实物理内存.PC中很多设备都提供了自己的设备内存.这部分内存会映射到PC的物理内存上,也就是读写这段物理地址,其实读写的是设备内存地址,而不是物理内存地址. 2. 虚拟内存概念     虽然可以寻址4GB的内存,但是PC中往往没有如此多的真实物理内存.操作系统和硬件(主…
驱动程序的主要功能是负责处理I/O请求,其中大部分I/O请求是在派遣函数中处理的.用户模式下所有对驱动程序的I/O请求,全部由操作系统转化为一个叫做IRP的数据结构,不同的IRP数据会被“派遣”到不同的派遣函数中. IRP与派遣函数 IRP的全称是输入输出请求包. 其部分结构如下: typedef struct DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT) _IRP { CSHORT Type; USHORT Size; // // Define the…
虚拟内存地址 Windows所有的程序(Ring0和Ring3层)可以操作的都是虚拟内存.有一部分单元会和物理内存对应起来,但并非一一对应,多个虚拟内存页可以映射同一个物理内存页.还有一部分单元会被映射成磁盘上的文件,并标记为脏的.读取这段虚拟内存的时候,系统会发出一个异常,此时会出发异常处理函数,异常处理函数会将这个页的磁盘文件读入内存,并将其标记为不脏.可以让那些经常不读写的内存页交换成文件,并设置为脏. Windows之所以如此设计,第一是虚拟的增加了内存的大小:第二是使不同进程的虚拟内存…