存档

文章标签 ‘驱动’

[驱动学习笔记]LIST_ENTRY和DPC定时器

2012年1月7日 4 条评论

链表的使用
链表是驱动开发中经常遇到的一个数据结构,主要是双向循环链表;要使用链表,需要用到一个LIST_ENTRY的结构,其定义如下:

typedef struct _LIST_ENTRY {
struct _LIST_ENTRY *Flink; // 指向下一个节点
struct _LIST_ENTRY *Blink; // 指向前一个节点
} LIST_ENTRY, *PLIST_ENTRY;

在实际的编程中,我们需要自己定义链表的节[......]

继续阅读

IO_REMOVE_LOCK使用方法小结

2012年1月1日 没有评论

IO_REMOVE_LOCK(删除锁)的具体结构没有公开,WDK的文档中中查不到IO_REMOVE_LOCK。最开始看到IO_REMOVE_LOCK是在WDK的例子event中。下面是参考网上的一些资料之后的一点总结,错误的地方请指正。

为什么要用IO_REMOVE_LOCK?
WDM 驱动程序在处理设备删除 IRP 并释放驱动程序分配的内存后可能接收到附加的 IRP。在处理附加的 IRP 时试图引用已经释放的内存会导致系统崩溃。驱动程序能够接收已删除设备的 IRP,这有两个原因:
1. 在设备被删除后,另一个组件可以发送 I/O。
2. 在设备删除请求之前发送的 I/O 请求可能在目标驱动程序处理设备删除请求之后到达。[......]

IO_STACK_LOCATION与IRP的一点笔记

2011年12月24日 2 条评论

IO_STACK_LOCATION和IRP算是驱动中两个很基础的东西,为了理解这两个东西,找了一点资料。
1. IRP可以看成是Win32窗口程序中的消息(Message),DEVICE_OBJECT可以看成是Win32窗口程序中的窗口(Window)
2. 任何内核模式程序在创建一个IRP时,同时还创建了一个与之关联的IO_STACK_LOCATION结构数组:数组中的每个堆栈单元都对应一个将处理该IRP的驱动程序。
IRP的头部有一个当前IO_STACK_LOCATION的数组索引,同时也有[......]

继续阅读

驱动读写方式(缓冲区读写与直接读写)

2011年12月20日 没有评论

应用程序和驱动程序交互数据需要指定数据的交互方式,通过设置DEVICE_OBJECT的Flags成员来标志。有DO_BUFFERED_IO、DO_DIRECT_IO或者0
DO_BUFFERED_IO:一般用于比较简单且不追求效率情况下的解决方案,把应用层(Ring3层)中内存空间中的缓冲数据拷贝到内核空间。IRP的AssociatedIrp.SystemBuffer成员指向内核中的缓冲区。
DO_DIRECT_IO:把应用层的地址空间映射到内核空间,这需要在页表中增加一个映射。当然这不需要程[......]

继续阅读

IRQL科普

2011年12月19日 没有评论

IRQL是Interrupt ReQuest Level,中断请求级别。处理器在一个IRQL上执行线程代码。IRQL是帮助决定线程如何被中断的。在同一处理器上,线程只能被更高级别IRQL的线程能中断。每个处理器都有自己的中断IRQL。常见的IRQL级别有四个:Passive、APC、 Dispatch、DIRQL。
PASSIVE_LEVEL
IRQL最低级别,没有被屏蔽的中断,线程执行用户模式,可以访问分页内存。
APC_LEVEL
只有APC级别的中断被屏蔽,可以访问分页内存。当有APC发生[......]

继续阅读

分类: Windows驱动开发 标签: ,

VMWare搭建驱动双机调试环境

2011年12月7日 2 条评论

一、虚拟机设置
以XP为例,因为XP相对Vista/Win7要小巧玲珑许多,安装方便,占用的空间也少,而且配置更加简单。在“文件夹选项”中设置显示隐藏文件和显示系统文件,打开系统盘(比如C盘),找到Boot.ini,去掉这个文件的只读属性,用记事本打开Boot.ini,大概的内容如下
二、VMWare设置
关闭虚拟机,来到VMWare之后选择对应的虚拟机,对齐进行设置。选择“Commands”栏中的“Edit Virtual Machine Settings”,单击“Add”按钮增加一个串口,也就是Serial Port,单击下一步,选择“Output to named pipe”,之后进行相应的设置
三、Windbg设置
给Windbg创建一个快捷方式,设置一下这个快捷方式的属性:在快捷方式的目标后面增加一些命令,我这里是:”C:\Program Files\Debugging Tools for Windows (x86)\windbg.exe” -b -k com:port=\\.\pipe\com_1,baud=115200,pipe[......]

微软驱动程序学习资料

2011年2月27日 2 条评论

又发现一个学习驱动编程的好地方,对一些重要概念作了介绍。而且,这里还能找到单独的WDK开发文档,虽然安装WDK时也会提供文档,但是这里还提供了CHM版本的文档,很不错,60M左右,方便携带和学习。

微软驱动开发学习:http://msdn.microsoft.com/zh-cn/windows/hardware/gg581061

WDK文档下载:http://msdn.microsoft.com/zh-cn/windows/hardware/gg487458

ObReferenceObjectByHandle返回-1073741788

2011年2月23日 9 条评论

这几天依旧是在看张帆的《Windows驱动开发技术详解》一书,在写第11章的代码时,发现了一个小错误(事实上,本书存在很多很多的小错误,大部分都是印刷类的,这不得不让我怀疑编辑的水准。以往博文视点出的书基本上是看不到错误的。)
第300页中的第43行通过ObReferenceObjectByHandle来通过设备句柄来获取文件对象,运行的时候一直返回-1073741788。跟WDK文档中提到的返回值都对不上号。
网上一找,也基本职能找到“-1073741788, “{错误类型}\n请[......]

继续阅读

[转]DO_DEVICE_INITIALIZING 到底有什么用?

2011年2月18日 没有评论

本文转载自http://www.microsoft.com/china/whdc/driver/tips/DevInit.mspx
当设备驱动程序通过调用 IoCreateDevice 创建设备对象时,I/O 管理器在 DEVICE_OBJECT 结构的 Flags 字段中设置 DO_DEVICE_INITIALIZING。DO_DEVICE_INITIALIZING 的目的是防止其它组件在驱动程序完成初始化设备对象之前向设备发送 I/O。
每次打开设备的一个句柄时,以及任何时候驱动程序试图附加[......]

继续阅读

DbgPrint/KdPrint输出格式控制

2011年1月1日 2 条评论

在驱动编程学习中,往往需要通过DbgPrint或者KdPrint来输出调试信息,对于Check版本,KdPrint只是DbgPrint的一个宏定义,而对于Free版本,KdPrint将被优化掉。这些输出信息可以通过DebugView对内核的监控来看到。
KdPrint is identical to the DbgPrint routine in code that is compiled in a checked build environment. This routine has no[......]

继续阅读

分类: Windows驱动开发 标签: , ,