
Windows驱动开发
文章平均质量分 75
zj510
这个作者很懒,什么都没留下…
展开
-
Windows驱动开发WDM (6)- 中断请求级别
Windows有两种中断请求(IRQ, INTERRUPT REQUEST),一种是外部中断,也就是硬件中断,另外一种是软件中断,比如常用的INT 3下个断点。现在的x86计算机基本都是用高级可编程控制器(Advanced Programmable Interrupt Controller, 简称APIC)来控制IRQ。正在运行的线程可以随时被中断打断,进入到中断处理程序。优先级高的中断可以打原创 2012-11-26 11:42:13 · 8692 阅读 · 0 评论 -
WDF驱动开发(2)- CONTEXT和IO QUEUE
WDF里面,大多数对象都支持自定义的数据,比如给设备对象创建一个context。对象上下文先自定义一个结构,比如typedef struct{ WDFQUEUE _DefaultQueue;}DEVICE_CONTEXT;里面放了一个对象WDFQUEUE. 然后给设备对象创建一个上下文内存块。在使用之前先要声明一下这个结构,相当于告诉框架,我们需要使用一个context。原创 2013-11-27 16:34:34 · 7923 阅读 · 0 评论 -
WDF驱动开发(4)- 内存IO, WDF和WDM对比
当驱动和调用者进行内存操作的时候,比如驱动读取写入调用者的内存。windows上面总共有3种方法:DO_BUFFERED_IO,DO_DIRECT_IO和其他。内核模式下操作调用者bufferWDM:各种方式有不同的使用方法,参考http://blog.youkuaiyun.com/zj510/article/details/8212032WDF: 统一使用WdfRequestRetrieveIn原创 2013-11-28 11:37:10 · 4840 阅读 · 0 评论 -
WDF驱动开发(3)- 用户模式程序和驱动的数据交互
当用户模式的程序调用驱动的时候,怎么传递数据呢?通常用户模式程序和驱动的数据交互有3种办法:buffer方式,direct方式和其他方式。可以看之前我写的WDM驱动模型:http://blog.youkuaiyun.com/zj510/article/details/8212032那么在WDF里面又如何操作呢?我们考虑给WDF驱动增加一个功能:将WRITE请求的数据写入设备对象上下文,然后当READ请原创 2013-11-28 11:05:26 · 12673 阅读 · 3 评论 -
Windows Minifilter驱动 - DriverEntry (3)
驱动里面的DriverEntry就相当于main()或者DllMain()函数,这是个入口点。当驱动被加载的时候,原创 2014-09-18 11:26:50 · 3281 阅读 · 0 评论 -
Windows Minifilter驱动 - 调式 (4)
写任何程序动态调试是非常重要的。驱动开发也不例外。通常现在写驱动的时候,都是在VM上跑的,调试手段基本也是本地windbg + 虚拟机。虚拟机配置我用的是win7,第一步,看下面。成功执行后,会提示:The entry was successfully copied to {xxxxxxxxxxxxxxxxxxx}第二步:输入bcdedit /dbgsettin原创 2014-09-18 18:25:52 · 2855 阅读 · 0 评论 -
IRP_PAGING_IO的一些说明
http://laokaddk.blog.51cto.com/368606/73746转载 2014-09-19 15:21:45 · 2425 阅读 · 0 评论 -
Windows Minifilter驱动 - 获取进程ID, 进程名字和线程ID (5)
在minifilter里面可能有好几种获取调用进程id,名字和线程的办法。我这里有一种:使用PsSetCreateProcessNotifyRoutine 和PsSetLoadImageNotifyRoutine这是两个API,我们可以借助它们获取进程信息。具体看:http://msdn.microsoft.com/en-us/library/windows/hardware/原创 2014-09-22 14:43:20 · 8611 阅读 · 3 评论 -
Windows Minifilter驱动 - 加载顺序 (2)
安装minifilter后,可以在注册表看到一些原创 2014-09-17 18:18:22 · 7005 阅读 · 0 评论 -
Windows MiniFilter驱动 - Sample(1)
VS2013里面有向导可以直接创建一个原创 2014-09-17 17:12:26 · 9856 阅读 · 7 评论 -
如何在Minifilter驱动的IRP中获取操作文件路径?
如何在IRP中获取操作的文件路径?文件路径普通办法如何获取FileMapping操作在IRP_MJ_WRITE等IRP中的文件路径呢?IRP_MJ_CREATE获取文件路径并保存IRP_MJ_WRITE中获取路径文件路径在minifilter中,主要处理的是各种IRP,做DLP也好,做加解密也好。文件路径总是绕不开的。比如在IRP_MJ_WRITE中,绝大多数情况都得知道当前这次操作的文件路径...原创 2018-12-20 09:00:26 · 4849 阅读 · 0 评论 -
Minifilter 拦截FileMapping IO事件
Minifilter 拦截FileMapping IO事件IO类型Minifilter拦截FileMapping拦截结论IO类型在Windows上一般常见的两种IO:普通IO, 如通过ReadFile,WriteFile等Windows API进行读写FileMapping,通过CreateFile打开一个文件,然后通过CreateFileMapping创建FileMapping对象,通...原创 2018-12-18 09:15:42 · 3163 阅读 · 0 评论 -
FileMapping写的内容什么时候会flush到磁盘?
FileMapping写的内容什么时候会flush到磁盘?FileMapping写文件什么时候写入磁盘?强迫操作系统写入磁盘FileMapping写文件这是个简单的file mapping 写文件例子:void TestIOFileMapping() { HANDLE hFile; hFile = CreateFile(L"testfilemapping.foo", ...原创 2018-12-18 14:50:00 · 1054 阅读 · 0 评论 -
WDF驱动开发(1)- 一个简单的WDF驱动(non-pnp)
最近因为工作关系,接触了一下WDF驱动开发。WDF驱动其实是微软公司提供的一套驱动开发的框架。有了这个框架之后,开发驱动会简单一些。WDF本身是从WDM基础上封装而成的。WDF里面封装了很多对象,如WDFDRIVER等。如果要学习使用WDF来开发驱动,个人感觉还是需要WDM的一些基础,不然很多东西挺难理解的。写了一个简单的WDF驱动(非pnp),基本步骤如下:创建framework 驱原创 2013-11-27 14:19:01 · 28886 阅读 · 4 评论 -
Windows驱动开发WDM (16)- 完成例程 (重新获得IRP控制权)
前一次(http://blog.youkuaiyun.com/zj510/article/details/8350184)学习了完成例程返回STATUS_SUCCESS的情况,也就是驱动调用IoCallDriver后不会再获得IRP。这次来看看再次获得IRP控制权的情况。 设置完成例程先看看设置完成例程那里的代码: IoCopyCurrentIrpStackLocationToNext(I原创 2012-12-21 12:16:49 · 2553 阅读 · 0 评论 -
Windows驱动开发WDM (15)- 完成例程
现在的驱动大多都是分层的,既然是分层驱动,那么调用下层驱动就无可避免。调用下层驱动可以分为同步和异步两种。1. 下层驱动同步完成irp,那么IoCallDriver返回的时候irp已经完成了。2. 下层驱动异步完成irp,那么IoCallDriver返回的时候irp还没有完成,irp的状态是pending。针对第二种情况,因为IoCallDriver直接返回了,那么过滤驱动怎么知道下层原创 2012-12-20 16:40:36 · 4324 阅读 · 0 评论 -
Windows驱动开发WDM (7)- 异步IRP
同步IRP是很简单的,比如caller调用DeviceIoControll,那么DeviceIoControll的IRP会发到相应的驱动,驱动把这个IRP完成,然后caller的DeviceIoControll才返回。同步的缺点很明显,比如驱动需要花10秒处理这个IRP,那么caller就得等待10秒钟,有时候这是个浪费。这是个很常见的问题,解决方案就是采用异步的方式。 异步IRPca原创 2012-11-26 18:38:26 · 4050 阅读 · 0 评论 -
Windows驱动开发WDM (8)- 内核同步对象
只要写过多线程应用的程序员都知道,多线程访问公共资源的时候需要同步。在用户模式下,经常使用事件,互斥,信号量等对象来控制公共资源的访问。内核模式下,也是有相应的事件,互斥,信号量等内核对象,还有自旋锁。如果不是用同步对象进行控制,那么当多线程访问的时候就会产生一些不可预测的问题了。 不使用同步对象看下面的代码:NTSTATUS Encoding(IN PDEVICE_OBJECT原创 2012-11-27 13:21:21 · 2562 阅读 · 0 评论 -
Windows驱动开发WDM (1) - 基本结构
陆陆续续做过一些驱动的开发,但是一直以来都没有系统的学习过。这次重新阅读《windows驱动开发技术详解》(张帆,史彩成等编著),写博客记录一下,用以加深自己对驱动的理解。 驱动对象(DRIVER_OBJECT)每个驱动程序会有唯一的驱动对象与之对应,并且这个驱动对象是在驱动加载的时候,被内核中的对象管理程序所创建的。驱动对象用DRIVER_OBJECT来表示,内核对一个驱动只加载原创 2012-11-21 14:13:33 · 15936 阅读 · 0 评论 -
Windows驱动开发WDM (4)- 缓冲区方式例子
将前面的例子扩展一下,这次让这个驱动模拟一个文件,支持读写和获取文件长度。 在驱动中创建一块存储,用来模拟保存文件数据首先给设备扩展增加2个内容:buffer和filelen。buffer模拟一个存储,filelen指文件长度。typedef struct _DEVICE_EXTENSION{ PDEVICE_OBJECT fdo; PDEVICE_OBJECT原创 2012-11-22 16:05:04 · 4629 阅读 · 1 评论 -
Windows驱动开发WDM (3)- 设备内存读写方式
驱动所创建的设备一般有3种方式:缓冲区方式,直接方式和其他方式(对应DO_BUFFERED_IO, DO_DIRECT_IO和0)。比如:fdo->Flags |= DO_BUFFERED_IODO_BUFFERED_IO指定当前设备以缓冲区方式工作。通常用户模式和内核模式交互的时候,用户模式会传一个buffer进来,注意:这个buffer是用户模式的虚拟地址。尽管驱动程序可以访问原创 2012-11-22 14:35:06 · 6802 阅读 · 0 评论 -
Windows驱动开发WDM (10)- StartIo取消例程
上一个文章讲了StartIo的基本用法(http://blog.youkuaiyun.com/zj510/article/details/8230071),其中调用IoStartPacket的时候传了一个取消例程进去。如:IoStartPacket(fdo, Irp, 0, HelloWDMOnCancelIRP);参考MSDN上的参数说明:第四个参数是一个Cancel routine(取消例原创 2012-12-13 10:14:17 · 3066 阅读 · 1 评论 -
Windows驱动开发WDM (2)- 一个简单的WDM驱动程序
这个例子是从《windows驱动开发技术详解》的光盘上copy的,我只是自己稍微改了一下。 入口函数DriverEntry#pragma INITCODE extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath){ KdPri原创 2012-11-21 17:54:20 · 10404 阅读 · 2 评论 -
Windows驱动开发WDM (5)- DeviceIoControl(直接方式交互"输出buffer")
除了ReadFile和WriteFile外,还有一个函数可以让用户模式程序访问内核模式驱动:DeviceIoControl。这是经常用的一个API, 原型如下:BOOL WINAPI DeviceIoControl( _In_ HANDLE hDevice,//已经打开的设备 _In_ DWORD dwIoControlCode,控制码 _In_op原创 2012-11-23 14:56:47 · 11414 阅读 · 0 评论 -
Windows驱动开发WDM (11)- 多个设备对象(同一个驱动)
通常在WDM驱动的AddDevice里面只会调用一次IoCreateDevice创建一个设备对象。其实我们也可以调用多次IoCreateDevice来创建多个设备对象。当驱动调用IoCreateDevice成功后,驱动对象DriverObject的DeviceObject指针会指向新创建的设备对象,这个设备对象的NextDevice=NULL。如果再调用一次IoCreateDevice,那么Dri原创 2012-12-14 15:31:24 · 7932 阅读 · 2 评论 -
Windows驱动开发WDM (12)- INF文件格式说明 (转)
INF 说明, 见:http://baike.baidu.com/view/497048.htm转载 2012-12-19 14:43:07 · 2958 阅读 · 0 评论 -
Windows驱动开发WDM (14)- 分层驱动(设备栈,I/O栈)
前面的文章介绍了一个简单的功能驱动和过滤驱动。它们都是用WDM模型写的驱动,在写WDM驱动的时候,我们经常会碰到PDO和FDO。PDO就是物理设备对象,FDO是功能设备对象。FDO是附在PDO上面的,当然FDO上面还可以有其他的FDO。这样就构成了一个栈,就是设备栈。所以说WDM驱动天生就是分层驱动程序,最起码它有PDO和FDO。其实WDM驱动就是从分层的NT驱动发展过来的。 设备栈(De原创 2012-12-20 11:19:21 · 6062 阅读 · 1 评论 -
Windows驱动开发WDM (13)- 过滤驱动
之前用的驱动例子是一个功能型驱动,只不过它操作的是一个虚拟设备。这个驱动创建的FDO(功能设备对象)是附在虚拟总线驱动创建的虚拟PDO之上的。这次来介绍一下不同于功能型驱动的过滤驱动。过滤驱动可以在功能型驱动的上面,称之为上层过滤驱动,或者高层,反正就这个意思。过滤驱动在功能型驱动下面,称之为下层过滤驱动。看示意图:从名字上就可以知道过滤驱动是干啥用的。就是起过滤作用。比如:1. 可以原创 2012-12-19 17:40:12 · 11358 阅读 · 2 评论 -
FileContext等的坑?
FileContext等的坑?问题场景具体问题解决方案问题在minifilter中,可以使用CtxGetFileContext,CtxCreateFileContext等函数保存context。以FileContext为例,新建的文件可以保存一个context进去,然后当这个文件被删除的时候,操作系统会调用minifilter的清理函数来删除相应的context。那么坑:如果海量创建文件...原创 2019-01-19 12:11:05 · 1451 阅读 · 0 评论