存档

2011年2月 的存档

微软驱动程序学习资料

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

觉得文章还不错?点击此处对作者进行[……]

继续阅读

PAGE_FAULT_IN_NONPAGED_AREA蓝屏问题

2011年2月26日 15 条评论

今天奇迹般的遇到了这个问题,蓝屏了无数次,代号为PAGE_FAULT_IN_NONPAGED_AREA。从名字来看像是在非分页内存中发生了缺页错误。
不是很明白,于是用WinDbg调试,在驱动卸载函数中调用IoDeleteSymbolicLink出了问题。IoDeleteSymbolicLink只有一个参数,于是原因可以锁定到这个符号链接上面。于是将鼠标移到UNICODE_STRING变量上,提示Buffer为“……memory read error at address 0x…&#[……]

继续阅读

IRP完成例程的一点疑问

2011年2月26日 没有评论

(对驱动的学习一直是断断续续,最近又重新开始看驱动,对完成例程和IRP以及IO堆栈有了新的认识,具体请看《IO_STACK_LOCATION与IRP的一点笔记》)
通常使用完成例程有三步:

  1. 调用IoCopyCurrentIrpStackLocationToNext()函数,把当前的IRP栈数据复制一份到下一层。
  2. 调用IoSetCompletionRoutine()函数,为IRP设置完成例程。
  3. 调用IoCallDriver()函数,把IRP传递到下一层驱动对象。

完成例程的返回值有STATUS[……]

继续阅读

PAGED_CODE()

2011年2月25日 2 条评论

PAGED_CODE这个宏可以确保调用线程运行在一个允许分页的足够低IRQL级别。
参数:无
返回值:无
注释:如果IRQL > APC_LEVEL,则PAGED_CODE()会对系统产生一个断言。
对这个宏的调用必须放在一个包含有可以使用分页内存的代码或者访问分页内存的代码的驱动例程的开始位置。
PAGED_CODE这个宏仅仅检测这个宏所在位置的IRQL级别。如果在这个宏之后提升IRQL级别,PAGED_CODE将无法检测出之后的IRQL级别。当IRQL被不适当的提升的时候驱动程序员必须[……]

继续阅读

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

ObReferenceObjectByHandle返回-1073741788

2011年2月23日 9 条评论

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

继续阅读

蓝屏MULTIPLE_IRP_COMPLETE_REQUESTS

2011年2月20日 没有评论

今天写了一会IRP的同步处理,结果就不停的蓝屏。用WinDbg调试尽然还停留在一个ExFreePool行上,其实错误久发生在上一行的IoCompleteRequest。从这个蓝屏代号来看,可以看出来是“有多个IRP完成请求”。可是我找了好久才发现原因,主要是WinDbg的错误提示,弄得我以为链表的哪里弄错了。
最后一行一行代码的看,问题还是找到了。先前的IRP本来是用IoMarkIrpPending进行了挂起操作,但是派遣函数仍然返回了STATUS_SUCCESS,结果在IRP_MJ_CLEAN[……]

继续阅读

DDK下的Sleep函数KeDelayExecutionThread

2011年2月19日 没有评论

非原创文章,本文摘自楚狂人《Windows驱动编程基础教程》
6.2 在线程中睡眠
许多读者一定使用过Sleep函数。这能使程序停下一段时间。许多需要连续、长期执行,但是又不希望占太多CPU使用率的任务,可以在中间加入睡眠。这样能使CPU使用率大大降低。即使睡眠的时间非常短(几十个毫秒)。
在驱动中也可以睡眠。使用到的内核函数的原型如下:

NTSTATUS
KeDelayExecutionThread(
IN KPROCESSOR_MODE WaitMode,
[……]

继续阅读

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

[转]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。
每次打开设备的一个句柄时,以及任何时候驱动程序试图附加[……]

继续阅读

error C2065: ‘CTL_CODE’ : undeclared identifier

2011年2月18日 1 条评论

今天写了一个简单的驱动程序和应用程序通信,在一个控制台应用程序中用DeviceIoControl,结果提示CTL_CODE没定义……
error C2065: ‘CTL_CODE’ : undeclared identifier
于是跑去MSDN找了一下DeviceIoControl,提示要Winbase.h,加上去还是不解决问题。于是又找到CTL_CODE提示要Windev.h,估计是WinCE的吧,没有这个头文件。最后只能找谷歌了,原来需要winioctl.h。
而且[……]

继续阅读

VS2005/VS2008下Win32应用程序发布

2011年2月16日 没有评论

VS2005或者VS2008(包括VS2008 SP1)下写的MFC程序如果在别的电脑上不能运行,那么在编译的时候选择MFC静态库就OK了,虽然程序会大不少。
但是如果是Win32 Application,那么即便是使用MFC静态库也不解决问题了(事实上,此时根本就不能编译通过)。其实要使Win32程序在其他电脑上能够运行,还是很简单的。
首先,你需要提供工程Release文件夹下的exe文件。以及Release文件夹下的manifest文件(注意VC2005开始工程有两个Release文件夹了[……]

继续阅读