
windows驱动开发
文章平均质量分 54
mofabang
这个作者很懒,什么都没留下…
展开
-
windbg命令熟悉
windbg命令分标准命令、元命令和扩展命令。标准命令提供基本功能,不区分大小写。比如dt、lm、g、bl、bc、p等。提供标准命令没有提供的功能,也内建在调试引擎中,以.开头。如.sympath .reload等。 扩展命令用于扩展某一方面的调试功能,实现在动态加载的扩展模块中,以!开头。如!analyze等。 使用;作为分隔符,可以在同一行输入多条命令。一次可以执行多转载 2015-11-09 15:10:59 · 767 阅读 · 0 评论 -
学习windows驱动(内存对象)
内存对象有METHOD_BUFFERD、METHOD_DIRECT和METHOD_NEITHER三种。METHOD_NEITHER方式缓冲区在WDF里处理时比较复杂。 METHOD_NEITHER的IO请求不是来自用户程序,来自内存模块,获取缓冲区方式跟其它两种一样。特别的是如果IO请求来自用户程序,则缓冲区是在用户空间申请的,在内核使用用户缓冲,有许多限制,它要与指定的进程上下文相关才有效。这时原创 2015-10-29 14:11:49 · 1587 阅读 · 0 评论 -
学习windows驱动(PNP和电源模型)
WDF为PNP、电源、电源策略三者定义了许多的状态值。 分WDF_DEVICE_PNP_STATE、WDF_DEVICE_POWER_STATE和WDF_DEVICE_POLICY_STATE,三个状态枚举量加起来超过270个。WDF对电源和PNP的设计方式是,进行最基本的处理,框架向程序提供回调接口,如果程序注册了某个回调,则框架在对应的状态变化时调用此回调,否则就使用默认的处理方式。可以找时间原创 2015-10-29 16:38:07 · 1452 阅读 · 0 评论 -
学习windows驱动(WDF USB设备驱动开发)
学习WDF USB驱动开发, 那么怎么进行WDF USB设备驱动开发呢? 我们需要懂什么? 需要做什么呢? 根据《竹林蹊径 深入浅出Windows驱动开发》第4章 WDF USB设备驱动开发里介绍的目录可以初见端倪,需要了解USB设备硬件结构,USB软件结构,内核开发, 数据I/O操作,设备控制,用户程序。USB设备硬件结构。 USB是Universal Serial Bus(通用串行总原创 2015-10-29 18:01:04 · 6025 阅读 · 0 评论 -
学习windows驱动(框架和IO请求)
框架处理IO请求的过程是怎样子的? 应用程序调用Kernel32的接口函数ReadFile读。ReadFile调用Ntdll.dll里的NtReadFile函数,进入内核调用内核服务NtReadFile,IO管理器接管读操作处理。IO管理器为读请求构造IRP_MJ_READ类型的IRP。IO管理器找到由WDF框架创建的设备对象(DEVICE_OBJECT),将IRP发送到它的读分发函数(Dis原创 2015-10-29 14:56:09 · 1776 阅读 · 0 评论 -
学习windows驱动(队列)
WDF驱动里的队列类型种类有如下定义:typedef enum _WDF_IO_QUEUE_DISPATCH_TYPE { WdfIoQueueDispatchInvalid = 0, WdfIoQueueDispatchSequential, WdfIoQueueDispatchParallel, WdfIoQueueDispatchManual, WdfI原创 2015-10-29 15:35:30 · 1568 阅读 · 0 评论 -
学习windows驱动(创建IO请求)
现在框架只把5种IRP请求封装层WDFREQUEST对象,实际上可以把任何IRP请求封装成WDFREQUEST对象。WDF驱动程序除了使用框架通过事件回调传递的WDFREQUEST对象外,还可以自己新建任何类型的WDFrequest对象。有两种方法创建WDFREQUEST对象。 第一种是创建空对象,在调用格式化函数,将对象格式化成指定类型的命令,现在框架只提供4种格式化函数,这种方法只能创建4种W原创 2015-10-29 16:19:19 · 1069 阅读 · 0 评论 -
学习windows驱动(温习3)
今天没有下雨,虽然漫天的阴云,但经过昨天一天雨的洗涤,空气显得分外干净清澈。连马路都干净的锃光瓦亮的。虽然早晨六点多醒来,但没有立马起床。 而是打开手机上会儿网,似乎手机网络已经成为许多人的身体的一部分,无论走到哪里,无论是什么样的人,在走路的行人,或是坐在一旁休息的人,大人、小孩子,你都可以看得到他们都手持着一个现代的电子显示设备,把玩着各种电子设备。他们完全忘我的融入到了另一个电子世界里。原创 2015-10-30 10:11:18 · 153 阅读 · 0 评论 -
学习windows驱动(32位与64位兼容)
32位和64位Windows驱动有什么不同? 怎么兼容32位和64位Windows驱动?在编程的时候,32位系统跟64位系统数据类型是有些不一样的。在64位环境下,指针、句柄是64位的。 Windows为64位环境提供了一些指针类型的数据类型。固定精度的数据类型 类型 定义DWORD32 32位无符号整数DWORD64 64位无符号整数INT32 32位有符号整数INT64原创 2015-10-30 14:30:51 · 8984 阅读 · 0 评论 -
线程
【等待线程】 KeWaitForSingleObject例程把线程放到等待状态直到调度对象被设置成型号状态,或者可选的直到等待超时。Syntax:NTSTATUS KeWaitForSingleObject( _In_ PVOID Object, _In_ KWAIT_REASON WaitReason, _In_ KPROCESSOR原创 2015-11-17 14:26:50 · 191 阅读 · 0 评论 -
学习windwos驱动(IO模型)
IO管理器将IO请求封装成IRP结构体发往内核驱动。 WDF能够判断成IRP请求是直接在框架内部处理,还是调用WDF驱动注册过的事件回调,交回驱动处理。如果调用事件回调,就必须将IRP封装成框架请求,也就是WDFREQUEST对象。 一般情况,WDF驱动不直接操作IRP。IO目标对象叫做WDFIOTARGET。 WDFIOTARGET封装了DEVICE_OBJECT,它跟WDFDEVICE对象原创 2015-10-28 13:28:24 · 752 阅读 · 0 评论 -
学习windows驱动(内存对象)
IRP里的用户缓冲区有:METHOD_BUFFERED、METHOD_DIRECT、METHOD_NEITHER三类。 对于METHOD_BUFFERED和METHOD_DIRECT两种缓冲类型的IO请求,使用下面的方法获取对应的内存指针。 获取输入缓冲区对应的内存对象:_Must_inspect_result__IRQL_requires_max_(DISPATCH_LEVEL)NTSTA原创 2015-10-28 17:57:59 · 1251 阅读 · 0 评论 -
学习windows驱动(设备对象设备栈)
IO相关的操作是围绕设备对象进行的。设备对象分下几类:1、功能设备对象(FDO): 功能驱动为设备创建一个FDO,在设备栈里它位于物理设备(PDO)的上层。2、物理设备对象(PDO): 总线驱动创建PDO,逻辑上代表物理设备本身,功能设备对象(FDO)代表系统对这个PDO做的处理。FDO为什么会被总线驱动创建?是因为FDO代表的物理设备连接到此总线设备上,总线驱动起了承担总线设备的功能驱动作用。3.原创 2015-10-28 10:50:48 · 2325 阅读 · 0 评论 -
跟我一起学习windows驱动编程(引用计数、上下文空间)
引用计数内核管理器为每个全局对象维护一个引用计数。 内核对象有一个对象头结构体_object_header。 _object_header里变量PointerCount和HandleCount,就是引用计数。 内核程序可以通过对象指针直接使用内核对象, 用户程序通过获取的有效HANDLE间接使用内核对象。WDF框架对象不是全局对象,因此,对象管理器不管理WDF框架对象。 通过句柄方式引用W原创 2015-10-27 14:47:42 · 1233 阅读 · 0 评论 -
跟我一起学习windows驱动(PME接口)
WDF编程接口类似PME(Property/Method/Event)接口模型。 属性描述对象特性,通过Get或Retrieve获得属性,通过Set或者Assign设置属性。就像WdfDeviceGetDevicePnpState、WdfDeviceGetDevicePowerState和WdfDeviceSetDeviceState,都是设备对象的属性方法。 除了属性接口,WDF其它接口函数是原创 2015-10-27 16:36:03 · 1372 阅读 · 0 评论 -
学习windows驱动(对象同步)
对象是一种会被争抢的共享资源,因此就要为它设置同步机制。框架对象内部包含了同步锁机制。 可以通过WdfObjectAcquireLock 和WdfObjectReleaseLock实现手动同步。简单方面的做法是采用自动同步机制。采用自动同步,先是确定同步范围,有两种可选同步范围: 设备同步(WdfSynchronizationScopeDevice)、队列同步(WdfSynckronizatio原创 2015-10-27 17:40:04 · 845 阅读 · 0 评论 -
学习windows驱动(回顾1)
温故而知新。到现在为止,我们来回想一下已经接触了哪些windows驱动的知识点。 首先,windows驱动是什么? 驱动是一个软件,负责承上启下, 承上就是与用户程序打交道,提供接口给用户使用; 启下就是跟系统内核和硬件打交道,负责读写操作硬件。 那么,驱动是怎么实现的? 需要掌握哪些概念和知识呢? 万丈高楼平地起, 说明基础是很重要的, 因此,我们首先得从基础开始。在window原创 2015-10-28 09:50:12 · 783 阅读 · 0 评论 -
学习windows驱动(父子关系)
WDF对象模型使用了父子概念,存在父对象和子对象的关系。 父对象和子对象是具象的,面向对象编程语言里所说的父类和子类是抽象的。 父对象对子对象有控制权,父对象被销毁时,会先销毁子对象。 一个驱动对应一个驱动对象,驱动对象是WDF对象的根对象。 在WDF驱动里,所有WDF对象,要么是驱动对象的子对象,要么是子对象的子对象。驱动对象生命周期由框架维护。 WDF框架对象间的父子关系是树型结构,父原创 2015-10-27 17:16:14 · 493 阅读 · 0 评论 -
学习windows驱动(DDI接口)
DDI接口就是形式如WdfXXXX()的函数。 进行WDF驱动开发,就是基于WDF提供的WdfXXXX()函数, 程序员在符合WDF框架要求下,填充自己的代码,达到驱动自己的硬件的目的。原创 2015-10-27 16:48:25 · 2862 阅读 · 1 评论 -
学习windows驱动(驱动对象)
驱动对象是框架中第一个被创建的对象,最后一个被删除的对象。 当驱动对象不存在了以后,其它子对象也就不存在了。 当获得驱动对象,就可以遍历获得它的所有子对象。 可以通过WdfGetDriver函数获得驱动对象句柄。WDFDRIVER driver = WdfGetDriver();驱动对象代表加载到系统空间的驱动模块。相同驱动文件,不管同时作用于多少设备,驱动对象总是唯一的。 可以把全局变量原创 2015-10-28 09:02:32 · 1210 阅读 · 0 评论 -
学习windows驱动(缓冲区溢出)
在WDF里,IO请求对象使用了WDFMEMORY对象来表示输入/输出缓冲区。 WDFMEMORY内部维护了内存指针、内存区长度、有效长度(字符串长度)。 维护内存区生命期,框架负责申请释放自己的内存,驱动自己创建内存,由驱动自己负责释放。 可以使用偏移量offset来实现内存区任意部分的使用。实际可用的内存区长度是总长度减去偏移值。 内存对象怎么使用?要使用内存对象,首先要创建内存对象。原创 2015-10-28 17:39:40 · 2615 阅读 · 0 评论 -
学习windows驱动(温习2)
hello,今天的中环边界靠近徐汇区的天气不太好,下着雨。打着雨伞,背着双肩包,踩着单车,我就踏上了上班的路。一路上车流不息。虽然是雨天,骑自行车、电瓶车、摩托的人数依然不见有所减少。人们有的披雨披,有的打伞。照样行进在马路上。说到对象这个概念,它是一个具象的东西。以人类为例子,每个人都是一个人类对象,它有眼睛、鼻子、耳朵等属性,人能说话,看见东西,听见声音,走路等等,这些就是人有的方法。这样子就好原创 2015-10-29 11:03:02 · 664 阅读 · 0 评论 -
InterlockedCompareExchange例程
InterlockedCompareExchange 例程执行一个原子操作,用参数Comparand的值与参数Destination指针指向的值比较。Syntax:LONG InterlockedCompareExchange( _Inout_ LONG volatile * Destination, _In_ LONG Exchange, _In_ LONG Comparand );Par原创 2015-11-18 11:18:09 · 4745 阅读 · 0 评论