win驱动
Eugene800
这个作者很懒,什么都没留下…
展开
-
Power IRPs处理注意点
<Programming the Microsoft Windows Driver Model>第8章8.1节提到处理Power Irp的注意点:"Power IRPs come to you in the context of a system thread that you must not block. There are several reasons why you ...原创 2020-03-08 23:23:26 · 374 阅读 · 0 评论 -
WDF对象上下文1
其实竹林蹊径中已经详述了WDF_DECLARE_CONTEXT_TYPE_WITH_NAME宏定义,写这篇博文的目的无非是为后文做个引子。toaster中如此使用该宏:typedef struct _FDO_DATA{ WDFWMIINSTANCE WmiDeviceArrivalEvent; BOOLEAN WmiPowerDeviceEnableRegiste...原创 2018-04-09 21:14:43 · 702 阅读 · 0 评论 -
Wdf框架之WdfObject状态机(3)-前篇
好久没写关于Wdf框架的博客了,因为有各种琐碎事缠身,得赶在RS4 RTM前把状态机(3)系列完成。WdfObject状态机(2)系列将注意力集中在驱动程序的继承层次上只存在单薄一层WdfDriver上;而这篇文章将要分析的情形将具备一定的普遍性:在代码上参考并修改了toaster\kmdf\func\simple。下图是默认KMDF对象层次结构 simple虽然没有包含图中所有元素,但它仍然...原创 2018-04-02 00:12:33 · 485 阅读 · 0 评论 -
Wdf框架之WdfObject状态机(2) 一文再补充
万万没想到<Wdf框架之WdfObject状态机(2) >的内容如此之多,2篇博客的篇幅还不够承载,需要第三篇来完成最后一击。本文将进入FxObject::DeleteWorkerAndUnlock的else分支,分析DrvDestroyCallback/DrvCleanupCallback的调用时机。 进入else分支后,首先遇到的函数是FxObject::Dispos...原创 2018-02-17 23:12:34 · 394 阅读 · 0 评论 -
Wdf框架之WdfObject状态机(2) 一文补充
本文是前一篇文章<Wdf框架之WdfObject状态机(2)>的补充。MS设计如此复杂的状态机的目的,是在状态发生改变时调用适当的回调函数,如:EvtCleanupCallback/EvtDestroyCallback,可是前一篇文章舍本逐末的关注了FxObject状态的变化,而忽略了这些回调函数的调用时机,遗漏部分就在此文中补充。源码也有所改动,先贴于此:typedef struct...原创 2018-02-17 17:07:55 · 635 阅读 · 0 评论 -
Wdf框架之WdfObject状态机(2)
前一篇博文<Wdf框架之WdfObject状态机(1)>提到调用WdfObjectCreate使框架对象被纳入对象状态机的管理之下。本篇我们看下框架对象的销毁过程,即如何结束它的生命周期,进而退出状态机。由于对象的销毁往往会引发着子对象的销毁,整个过程跟迷宫一样复杂,所以我们先在迷宫外了解一下穿越迷宫的捷径,暂时不深入探索----即假设程序中只创建一个Wdf驱动对象(空驱动,没...原创 2018-02-02 16:39:23 · 473 阅读 · 0 评论 -
Wdf框架之WdfObject状态机(1)
"WDF对象有共同的根....共同的头部(WDF_OBJECT)..WDF_OBJECT对象中包含了这样一些基本信息:对象类型(Type),对象长度(Len),引用计数,指向Parent对象和子对象列表的指针等"----引自<竹林蹊径-深入浅出Windows驱动开发> P57。诚如按作者所说,source insight(下文简称SI)给出的引用关系图反应出FxDriver类中...原创 2018-01-30 17:13:49 · 555 阅读 · 0 评论 -
wdf框架之WdfVersionBind函数分析(2)
接前篇,这篇一起来看下WdfVersionBind函数的第4个参数:WdfDriverGlobals。经过前面一番波折,WdfVersionBind总算找到了Wdf01000.sys!_WDF_LIBRARY_INFO结构。接下去,它要调用_WDF_LIBRARY_INFO!LibraryCommission函数,为WdfDriverGlobals分配空间并初始化。因为_WDF_LIBRARY原创 2017-12-27 20:13:02 · 1217 阅读 · 0 评论 -
wdf框架之WdfVersionBind函数分析(1)
最近学习了一下IDA的使用,正好拿WdfLdr.sys练个手。结合windbg的调试输出,逆向了其中的WdfVersionBind函数。我在文章的结尾部分给出了对应的idb文件的网盘链接(用CSDN上传资源的成功率太低了,我只能放弃了...)。以下是我逆向得到的WdfVersionBind函数实现的伪代码。整个函数中指针变量v5 v9对应的结构体未知,无法逆向出来,比较遗憾,不过应该不影响把握原创 2017-12-25 22:56:02 · 2911 阅读 · 0 评论 -
Wdf框架:FxDriverEntry----驱动程序的入口函数
在前面的文章中简单的提到过WdfVersionBind函数的作用,但是没有来得及分析这个函数的调用处。今天得空,借这篇文章写下WdfVersionBind函数的调用者:FxDriverEntry。 在写这篇文章前,我被WdfLdr.sys的名字误导,以为这个sys文件是内核的加载器,用于加载整个内核启动(Ldr是Loader的缩写)。所以,当时我很粗浅的认为这个驱动只在系统引导阶段才被调原创 2017-11-27 23:40:01 · 2020 阅读 · 0 评论 -
IoGetDeviceObjectPointer引起的引用计数改变
上周同事的驱动遇到HLK测试失败:HLK测试项检测到传感器设备驱动在响应IRP_MJ_PNP/IRP_MN_REMOVEDEVICE时,有句柄扔打开设备,于是我也帮着一起查找原因。这个驱动的架构如下设计:上层App负责通知驱动,驱动响应这个过程时,用IoGetDeviceObjectPointer获得并保持(IoGetDeviceObjectPointer后没有对返回的文件对象调用ObDe...原创 2018-04-30 16:24:21 · 1094 阅读 · 0 评论 -
WDF对象上下文2
上回讲到ToasterFdoGetData内部通过调用WdfObjectGetTypedContextWorker以获得自定义Context结构,当时由于篇幅所限,没有展开分析WdfObjectGetTypedContextWorker的实现。为了填补这个空白,乃有此文。其实<竹林蹊径>中提到过函数WdfObjectGetTypedContextWorker,只是作者成书之时限...原创 2018-04-11 23:34:45 · 519 阅读 · 0 评论 -
IO_REMOVE_LOCK(删除锁)
转自:IO_REMOVE_LOCK(删除锁)IO_REMOVE_LOCK(删除锁)的具体结构没有公开,WDK的文档中中查不到IO_REMOVE_LOCK。最开始看到IO_REMOVE_LOCK是在WDK的例子event中。下面是参考网上的一些资料之后的一点总结,错误的地方请指正。为什么要用IO_REMOVE_LOCK?WDM 驱动程序在处理设备删除 IRP 并释放驱动程序分配的内存后可能接收到附加...转载 2018-05-16 23:30:57 · 1050 阅读 · 0 评论 -
Driver Development for Windows 64-bit.
Abstract. Questions concerned with the release of drivers for 64-bit versions of Windows are considered in this article. Some typical problems and the ways of their solutions are listed in the article...转载 2018-08-05 14:51:59 · 379 阅读 · 0 评论 -
Call IoCompleteRequest while holding a spinlock
MS KB Q186775:《Tips for Windows NT Driver Developers -- Things to Avoid》一文(中译版)罗列了很多驱动开发过程中的注意点。微软仅仅提到了这些注意点,但是没有解释其背后的原因,只能结合网上的资料+自己分析其原因。我在osronline上看到有人针对item 20:"Never call IoCompleteRequest whil...原创 2018-08-05 14:49:00 · 261 阅读 · 0 评论 -
WDF队列分析(3)
《WDF队列分析(2)----IoQueue的创建》还留了一个结尾没完成,这篇接着往下分析。原创 2018-06-26 23:16:51 · 996 阅读 · 0 评论 -
设备栈中各个设备加载顺序
如题,这是前几天某同事问我的问题。他假设设备栈中有Pdo,Fdo,以及附属于Fdo的设备上下过滤驱动以及类上下过滤驱动,在这种情况下,OS会以怎样的顺序加载这些设备? 我第一反应是当然先加载Fdo,然后再加载过滤驱动。不过,出于谨慎,我决定还是先调试一下,然后再找资料核对一下。至于调试的对象,肯定还是万能的toast了~先准备好驱动文件夹,看名字就知道里面包含了类上下过滤驱动,设备上...原创 2018-06-19 22:00:08 · 425 阅读 · 0 评论 -
WDF队列分析(2)----IoQueue的创建
如果阅读了《WDF队列分析(1)--序幕》,可能你还记得在那篇文章的结尾部分提到过进入DispatchWorker函数后,框架根据IRP类型进入不同的Dispatch函数。当时我们的关注点其实集中在DriverObject上(派遣函数) FxPackage* GetDispatchPackage( __in UCHAR MajorFunction )...原创 2018-06-18 23:26:14 · 1228 阅读 · 0 评论 -
WDF队列分析(1)--序幕
WDF提供的队列IoQueue相当复杂,需要诺干篇幅才能写完。本篇先从队列创建入手。原创 2018-06-17 11:00:26 · 1133 阅读 · 0 评论 -
驱动中为啥少有异常处理的代码?
今天整理ppt,突然想到一个现象:在WRK以及winddk sample源码中很少见到异常处理相关的影子(指windows结构化异常处理SEH:__try/__exception,而不是C++标准提供的try/catch,kernel不支持C++异常)。按说,内核本身具有完整的异常处理机制,驱动作为内核的一部分,如果使用了异常处理块,必然受到异常处理机制的保护。 我首先想到的是在DI...原创 2018-06-13 23:39:15 · 563 阅读 · 0 评论 -
WDF框架系列:同步域,运行级别
本篇内容对应<竹林蹊径>3.4.7对象同步一节。作者对WDF同步域及运行级别的解释停留在纸面,然而,这两个概念却涉及到WDF设备\WDF队列的初始化,因此,不得不探究其背后的原理。...原创 2018-05-12 00:33:36 · 857 阅读 · 0 评论 -
Wdf框架中WdfDriverGlobals对象的创建
前面写过一篇,反响一般,不过这不会成为阻挡我继续写下去的绊脚石~本篇我们继续来分析Wdf框架。 WdfDriverGlobals对象的身影活跃在wdf框架的各个角落,几乎每个DDI接口内部都会使用它:_Must_inspect_result___drv_maxIRQL(PASSIVE_LEVEL)NTSTATUSWDFEXPORT(WdfDriverCreate)( P原创 2017-11-21 16:41:52 · 1630 阅读 · 0 评论 -
为可执行程序(sys/exe)生成公有调试符号
自Win10推出以来,Windows的更新频度变为每年2次(赶上隔壁Ubuntu的更新节奏了)。每次更新,MS都会提出一堆新要求。对于2018年RS4的更新,MS要求所有提交到WU(Windows Update)的驱动程序,除了要提供驱动包本身,还需要额外提供公有调试符号。哎,我只能默默的叹口气,然后照做了... 生成公有调试符号有2种形式:1.编译链接过程中生成;2.从私有调试符号文件原创 2017-12-04 17:08:40 · 1237 阅读 · 0 评论 -
搜索驱动程序分配的内存和查看KEVENT状态
上周调驱动,总觉得有个线程一直被阻塞在某个KEVENT上,最后费了很大劲才定位。由于代码是公司某个程序的一部分,不能拿出来演示,所以这里借用WinDDK\generate\event来模拟我定位的过程。当然,你可能会觉得这不就是定位有多线程同步引起的死锁吗,有什么难的?用调试器中断调试目标,然后回溯所有线程(类似windbg ~*kb命令)的调用栈不就行了。没错,对于应用程序而言,这样做十有八九已原创 2017-12-03 23:52:01 · 816 阅读 · 0 评论 -
取消Irp引起蓝屏(BugCheck:0x18)
昨天写一个简单的驱动,驱动的write例程会将IRP挂起放进自定义的队列中,然后在另一个线程中取消这些挂起的IRP:NTSTATUS SampleCharWriteAsync(PDEVICE_OBJECT devObj, PIRP irp){ KIRQL oldIrql; SampleCharDevContext* devCtx = (SampleCharDevContext*)devO原创 2017-02-22 17:30:32 · 2386 阅读 · 0 评论 -
内核下各种同步处理方法(自旋锁、信号灯、互斥体…)
转自:http://www.blogfshare.com/kernel-synchronization.html1.在支持多线程的操作系统下,有些函数会出现不可重入的现象。所谓“可重入”是指函数的执行结果不和执行顺序有关。反之如果执行结果和执行顺序有关,则称这个函数是“不可重入”的。 2.Windows将中断的概念进行了扩展,提出一个中断请求级(IRQL)的概念。其中规定了32转载 2017-02-08 10:11:38 · 1065 阅读 · 0 评论 -
驱动蓝屏0x50 PAGE_FAULT_IN_NONPAGED_AREA
想写个暴力搜索nt模块中未导出函数,结果一直蓝屏:原创 2017-01-12 10:55:03 · 9661 阅读 · 0 评论 -
windbg调试驱动自旋锁死锁
驱动程序中常用自旋锁来保护互斥资源,由于驱动常以异步的方式工作,很难保证原创 2017-01-14 22:32:54 · 1771 阅读 · 2 评论 -
用windbg为无效页面建立页面映射
前几天和同事扯淡,说调试驱动时访问无效内存会蓝屏,好麻烦,应该让windbg自动建立一个有效的页面,这样就不用蓝屏重启了。虽然说这是扯淡,但仔细想想貌似也不是不可能实现。 首先回顾一下OS解决内存缺页时简单步骤:1.搜索物理页面;2.修改虚拟地址对应的pte表的值;3.重新执行访存失败的指令。基于这样的思路,我也试了一下在windbg中手工建立内存映射(环境:win7 x32)1.在原创 2017-01-05 17:00:48 · 860 阅读 · 0 评论 -
多进程(线程)访问设备的一些疑惑
同事在看设备驱动同步时,问了我一个事:如果驱动程序创建了一个设备,在应用层是否允许多个进程同时打开这个设备;如果允许,这种方式应用层和驱动的通信方式是否会相互影响?我不是很确定,写了个测试代码并把结果记录下来。1.我们在DriverEntry/AddDevice中调用IoCreateDevice创建设备对象。这是IoCreateDevice的接口,倒数第二个参数用于设置设备是否支持独占式访问。原创 2017-01-05 14:26:47 · 3248 阅读 · 0 评论 -
windbg中通过文件句柄查找设备(!handle/!fileobj/!devobj命令)
有时,在驱动程序中会调用ZwCreateFile获得设备句柄,然后保存在设备扩展区域中供其他例程使用。由于驱动程序经常被动调用----执行的上下文可能不是同一个线程----会获得错误的句柄。那么是否存在某些调试命令供我们在开发阶段判断所用句柄正是某个设备的句柄?强大的windbg提供了!handle/!fileobj/!devobj这些扩展命令来实现这个目的(注意这些命令要正确设置调试符号的路径)原创 2016-12-18 15:36:40 · 2295 阅读 · 0 评论 -
调试遗漏IoStartNextPacket引起的阻塞
前面 driver verifier检测驱动死锁 一文中本想检测一下驱动中潜在的死锁来解决驱动无响应的bug,然而并没有实质性的进展。后来通过一系列的调试终于找到了根源所在,本文用于记录查找问题的过程。 下面是测试程序,主线程循环读驱动,子线程循环写驱动,由于是异步操作,每次读写结束后,线程都要调用WaitForSingleObject等待驱动完成IRP。可是由于驱动处理有误,Re原创 2016-12-13 11:12:16 · 674 阅读 · 0 评论 -
driver verifier检测驱动死锁
最近,在写字符驱动练手。读写相关的派遣函数以异步StartIo方式处理IRP,当应用层发出了几次ReadFile请求后,居然就无响应了。由于驱动是异步处理IO请求,因此,我猜测可能是驱动死锁了。本想借助windbg的!locks命令查看死锁,无奈,输出为空...绝望之余,想到可能可以用verifier工具检测驱动中潜在的死锁。 命令行下有2种方式激活verifier.exe的死锁检测功能原创 2016-12-12 17:28:03 · 4214 阅读 · 0 评论 -
驱动程序安装之设备协安装器
年前想把一个功能驱动和过滤驱动传到wu上,但是因为过滤驱动和第三方厂商驱动的hardwareid一样,直接传到wu上后用户一旦更新会有问题。一个同事提到一个解决方案:把过滤驱动的hardwareid改成一个无关紧要的id,然后为功能驱动的inf文件附加一个coinstaller,把他们一起传到wu上。当用户更新功能驱动时,通过coinstaller运行某个程序加载过滤驱动。 这样说可能还原创 2017-01-29 22:23:02 · 1738 阅读 · 0 评论 -
windows设备停用启动杂记
公司(OEM厂商)的电脑升级到win10 RS2 RTM后,发现有部分MS inbox驱动在电源事件后会出现黄标的现象(ErrorCode=43--QueryRemove失败)甚至driver lost。MS虽然承认是他们的issue,但是至少要到6月底才修复。于是,部门决定让我做个work around:出现黄标时Reset设备(其实就是停用-启用设备),并额外要求由于这个WA需要给产线使用,所原创 2017-05-21 00:19:10 · 2020 阅读 · 2 评论 -
VirtualKD加速windbg双机调试速度
原文的标题是:VirtualKD + VMWare实现单机内核调试。我觉得不是很妥当,毕竟双机调试是OS自己实现的,不依赖VirtualKD,所以就改成了这个标题。不过出于对作者的尊重,正文中我还是会使用他的标题。不过,不得不佩服作者的文笔真的不错,写的很清晰。VirtualKD + VMWare实现单机内核调试 VirtualKD + VMWare实现单机内核调试 By转载 2017-11-28 21:47:48 · 2523 阅读 · 0 评论 -
对<源码级调试WDF框架>一文进行补充
MS 曾在他的Github站点上提出过《源码级调试WDF框架》的方法,文中提到通过.srcfix命令使windbg源码服务器路径指向MS的源码服务器。这样当调试到wdf框架代码时,windbg会去源码服务器下载对应的源码并加载显示在源码窗口。我尝试过这种方法,然而结果并不像预计的那样:0: kd> .reload /f wdf01000.sys0: kd> !lmi wdf01000.s原创 2017-11-10 14:37:35 · 1072 阅读 · 0 评论 -
WDF基本对象和句柄定义
1 对象和句柄定义1.1 struct FX_OBJECT_INFO数组FxObjectsInfo:Fxobjectinfokm.cpp中定义了一个结构体FX_OBJECT_INFO数组FxObjectsInfo[],WDF自定义的对象,如WDFDRIVER、WDFDEVICE等都在该数组中登记对应的信息。 typedef struct _FX_O原创 2017-11-08 15:35:52 · 693 阅读 · 0 评论 -
内核驱动程序完整性校验的原理分析
转自:小刀志 在上一篇文章中提到了 Windows Vista 及之后版本的 Windows 操作系统在驱动程序加载完成后,驱动中调用的一些系统回调函数(如 ObRegisterCallbacks,可用来监控系统中对进线程句柄的操作,如打开进程、复制线程句柄等)等 API 中会通过 MmVerifyCallbackFunction 函数对该驱动程序进行完整性检查,检测未通过则会返转载 2017-08-31 21:42:32 · 5020 阅读 · 0 评论 -
进程创建通知回调通知例程的学习笔记
转自:小刀志在 Windows 操作系统中可以通过 PsSetCreateProcessNotifyRoutine 函数注册或移除一个进程创建通知回调例程。在 Vista 以及之后的版本中,微软加入 PsSetCreateProcessNotifyRoutineEx 新的函数来注册创建进程通知。通过判断系统版本来对应不同的操作系统调用不同的注册函数。而在 Vista 之前的系统转载 2017-08-31 21:16:42 · 2286 阅读 · 0 评论