WDM驱动针对Win8前后系统的兼容性问题

引用注明>> 【作者:张佩】【原文:www.yiiyee.cn/blog

最近我写了一个WDM驱动的demo工程,选择target OS是Win8,在VS2012上编译通过后,安装在Win8系统上能正常运行。换了一台Win7系统,安装驱动的过程中即遇到蓝屏。后来发现问题不在安装上,蓝屏乃发生在驱动加载的时候。

因为驱动特别简单,我先排除代码出错的可能。为了比较,我接下来又创建了一个KMDF框架的驱动demo工程,测试过程如法炮制,却没有碰到任何问题

我立刻想到的是,WDK 8.0对WDM框架可能做了兼容性方面的修改。到底怎么回事呢?一起来看看吧。

继续阅读“WDM驱动针对Win8前后系统的兼容性问题”

1,156 total views, 1 views today

Large Pool 错误

引用注明>> 【作者:张佩】【原文:www.yiiyee.cn/blog

我前几个月曾经分析了一个BAD_POOL_CALLER的问题(链接),今天收到的这个dump文件,系统是Win7 X64,最后发现问题和前者非常相似,但二者的分析过程却截然不同。

引子

打开dump文件后,首先进行自动分析。蓝屏号是0x4E。

************************************************************
*                                                          *
*                        Bugcheck Analysis                 *
*                                                          *
************************************************************

PFN_LIST_CORRUPT (4e)
Typically caused by drivers passing bad memory descriptor lists (ie: calling
MmUnlockPages twice with the same list, etc).  If a kernel debugger is
available get the stack trace.
Arguments:
Arg1: 000000000000009a, 
Arg2: 000000000014e26c
Arg3: 0000000000000006
Arg4: 0000000000000002
 继续阅读“Large Pool 错误”

505 total views, 1 views today

虫趣:抓一个Intel显卡驱动的臭虫

引用注明>> 【作者:张佩】【原文:www.yiiyee.cn/blog

同事给我发过来一个dump文件,说是在做S4压力测试的时候挂掉的。蓝屏号0x9F。因为前几天刚好解决了一个0x9F的蓝屏,怀疑是不是类似问题?拿过来一分析,风牛马不相及。可见同样是简称LYF,有可能是指刘亦菲,也有可能是罗玉凤。同样是0x9F的蓝屏,有可能5分钟定位错误,也有可能半天都找不到问题所在。 继续阅读“虫趣:抓一个Intel显卡驱动的臭虫”

1,453 total views, no views today

虫趣:FAST_MUTEX死锁

拿到一个dump文件后,经过简单分析,是设备驱动在处理电源IRP时,超时未完成导致的。这是一个典型的0x9F BSOD错误:

DRIVER_POWER_STATE_FAILURE (9f)
A driver has failed to complete a power IRP within a specific time (usually 10 minutes).
Arguments:
Arg1: 0000000000000003, A device object has been blocking an Irp for too long a time
Arg2: fffffa800182aa90, Physical Device Object of the stack
Arg3: fffff800139e9930, nt!TRIAGE_9F_POWER on Win7, otherwise the Functional Device Object of the stack
Arg4: fffffa8002437e10, The blocked IRP

继续阅读“虫趣:FAST_MUTEX死锁”

619 total views, 1 views today

几首诗

开心网是前年的事了,我曾经通过它的日记功能,发表过一些文章。此后,两三年里面,再没有上去过。今天忽然想起一件事,记得在日记里的,便又登陆上去看,庆幸用户名和密码都记得。记忆简直断片了,原来我在上面写过三十几篇日记呢。

我从上小学开始,喜欢古诗。偶尔还写一些。我写的东西,不能用好、坏论。就好比学生要学造句,我不过用文言文造句罢了。这样的造句,我持续了近二十年。家里曾有最早的一本11岁时候的结集,存了十几首。

这样的造句,最近也已不能够了。但三年前,还是可以的。开心网很少再去了,把那几首诗,记在这里(有几首和编程有关)。 继续阅读“几首诗”

151 total views, no views today

Windows系统时钟间隔

引用注明>> 【作者:张佩】【原文:www.yiiyee.cn/blog

下载:[download id=”5″]

系统时钟间隔是个很少被关心到的系统标量,它反映了系统产生时钟中断的频率,间隔越小频率越高,反之亦然。每当时钟中断产生,系统相关的中断函数将会处理这个中断。时钟中断处理函数会更新系统时间,检查内核调试信息等。

1. 时钟间隔

系统时钟间隔和另一个极重要的系统标量关联在一起:线程调度时限。按照Windows系统的设计,线程调度时限被分为普通程序后台服务两种类型。前者运行2个时钟间隔,后者运行12个时钟间隔,用户可以在系统属性中手动更改时限类型。

不同硬件平台定义有不同的最小、最大时钟间隔值。对于X86平台而言,最小时钟间隔是0.5ms,最大值大概是15.6001ms。在内部,时钟间隔以100ns为单位进行表述,所以0.5ms被表示为5000个100ns单位,15.6ms被表示为156001个100ns单位。 继续阅读“Windows系统时钟间隔”

1,526 total views, 5 views today

如何在Visual Studio项目中正确添加汇编代码

引用注明>> 【作者:张佩】【原文:www.yiiyee.cn/blog

1.      问题描述

在以往的编程经历中,本人最常使用的汇编代码是__asm {int 3}。它可以在我的代码中插入一个软件断点。如果没有一个连接到当前程序的调试器,则程序将停止在这行语句处无法继续执行。

上面的这种方式称为高级语言和汇编语言混编。当我用得正爽的时候,迎头碰到了64位平台这员猛将。它大手一张,挑出一张禁令通知单:在64位编程中,高级语言和汇编混编将再也不被支持!兄弟我不禁暗暗垂泪,因为当我固执而行的时候,若干恶心的编译错误赫然出现在我的面前: 继续阅读“如何在Visual Studio项目中正确添加汇编代码”

2,399 total views, 2 views today

Windbg调试命令详解

转载注明>> 作者:张佩】【原文http://www.yiiyee.cn/Blog

1. 概述

用户成功安装微软Windows调试工具集后,能够在安装目录下发现四个调试器程序,分别是:cdb.exe、ntsd.exe、kd.exe和Windbg.exe。其中cdb.exe和ntsd.exe只能调试用户程序,Kd.exe主要用于内核调试,有时候也用于用户态调试,上述三者的一个共同特点是,都只有控制台界面,以命令行形式工作。

Windbg.exe在用户态、内核态下都能够发挥调试功能,尤其重要的是,它不再是命令行格式而是采用了可视化的用户界面。所以绝大部分情况下,我们在谈及Windows调试工具的时候,都直接指向Windbg,而不大谈及前三者。

Windbg在用户态和内核态下,都支持两种调试模式,即“实时调试模式(Living)”和“事后调试模式(Postmortem)”。所谓实时模式,是被调试的目标对象(Target)当前正在运行当中,调试器可以实时分析、修改被调试目标的状态,如寄存器、内存、变量,调试exe可执行程序或双击双机实时调试都属于这种模式;所谓事后模式,是被调试的目标对象(Target)已经结束了,现在只是事后对它保留的快照进行分析,这个快照称为转储文件(Dump文件)。 继续阅读“Windbg调试命令详解”

6,213 total views, 5 views today

Windbg中查看计算机名

转载注明>> 【作者:张佩】【原文:http://www.yiiyee.cn/Blog

 引子

 使用Windbg调试目标对象的时候,用户发现到它的一个缺陷,就是不能自动识别目标设备的机器名。实际上Windbg总是标出了Machine Name的关键字,但却从来都没有显示。可以认为Windbg在这个地方有点小缺陷。见下面的例子:
0:000> vertarget
Windows 7 Version 7601 (Service Pack 1) MP (8 procs) Free x64
Product: WinNt, suite: SingleUserTS
kernel32.dll version: 6.1.7601.18015 (win7sp1_gdr.121129-1432)
Machine Name:
Debug session time: Thu Aug 22 10:11:04.000 2013 (UTC + 8:00)
System Uptime: 14 days 17:26:44.613
Process Uptime: 14 days 17:14:25.000
  Kernel time: 0 days 0:09:02.000
  User time: 0 days 0:42:36.000

继续阅读“Windbg中查看计算机名”

1,173 total views, no views today

Windows的PNP和电源特性概述

欢迎转载作者:张佩】【原文:http://www.yiiyee.cn/Blog/pnp/

这一节讲述一般设备的PNP和电源特性。

PNP特性

PNP是Plug And Play的简称,代表和外部设备插拔有关事件的处理。PNP是现代操作系统必须支持的基本特性,其目的是希望操作系统能够在软硬件支援下,在基本无需用户干预的情况下,即可很好地处理外部设备的接入和移除操作;当设备配置发生动态变更时,系统也能悄没生息地处理好,并一切正常地使用它们。

stocking-station

有些笔记本是当成工作站来用的,这样就需要很多外部接口。但一般的笔记本,局限于物理空间,不能够提供过多的外部接口,会使用接口坞来扩展(见左图例)。大的接口坞上通常有十几、数十个扩展接口,来满足工作站的接口要求。其实,一些移动设备,如手机、平板电脑,也使用接口坞的方式实现扩展,不过接口少一些。接口坞接入主机的时候,系统如果有PNP支援,就能够直接使用上面的接口了,不用重启系统,一般也不用手动安装设备驱动。 继续阅读“Windows的PNP和电源特性概述”

653 total views, no views today

虫趣:不同模块对指定变量类型的定义不同

欢迎转载 作者:张佩】【原文http://www.yiiyee.cn/Blog/dll-1/

引子

周末写了一个简单的程序(后文以Test.exe代指),通过Iphlpapi.dll提供的API函数GetAdaptersInfo,读取系统中的网卡信息,通过网卡名找到我想要的虚拟网卡后,将网卡信息结构体(IP_ADAPTER_INFO)保存到一个全局变量中。

逻辑很简单,写完之后测试也没有发现问题。后来开启Application Verifier并运用到Test.exe,竟然每次运行都发生崩溃。仔细看去,问题出在保存结构体到全局变量的语句上。看到这个错误后,本想凭借猜测把问题解决掉,试了三五分钟后,竟不能够。最后还只能上调试器,错误原来是不同模块对同一个变量类型(time_t)有不同的定义(默认定义的长度为8字节;而Iphlpapi模块出于和Win2K系统兼容的缘故,使用的长度为4字节)。

本文就讲一讲这个奇怪的Bug。 继续阅读“虫趣:不同模块对指定变量类型的定义不同”

397 total views, 1 views today

Windows显示驱动(WDDM)编程初步(2)

欢迎转载作者:张佩】【原文:http://www.yiiyee.cn/Blog/wddm2/

第二部分专门只讲VIDPN。这是后面内容的基础。WDDM框架用VIDPN这个概念,来描述它所要处理的显示关系。

1. VIDPN

VIDPN的全称是Video Present Network,这个因为词组不太好翻译(直译可以是:视频提交网络,但颇为难听),所以一般都直接讲它的英文。

VIDPN是WDDM引入的概念,用来描述通过显卡设备(Adapter)建立的若干个显示源(Source)和若干个目标接口(Target)之间的关系。系统按照VIDPN所定义的方式,将一个或多个显示源(Source)通过显卡设备,输出到这些目标接口(Target)上。
继续阅读“Windows显示驱动(WDDM)编程初步(2)”

1,849 total views, 3 views today

虫趣:别动系统的奶酪——内核保护错误(CRITICAL_STRUCTURE_CORRUPTION)

欢迎转载:作者:张佩】【原文:http://www.yiiyee.cn/Blog/0x109-1/

引子

下班的时候准备关掉调试机,却遇到蓝屏。本想直接拔电源,但蓝屏总是让我好奇,于是决定多待十分钟,看看这个蓝屏是怎么回事。主机的windbg调试器已经用DML标记出了自动分析命令!analyze –v。于是点进去: 继续阅读“虫趣:别动系统的奶酪——内核保护错误(CRITICAL_STRUCTURE_CORRUPTION)”

2,962 total views, 2 views today

虫趣:拯救Visual Studio 2012(错误: 0xC01E0009)

欢迎转载:作者:张佩】【原文:http://www.yiiyee.cn/Blog/vs-1/

引子

今天运行一款很流行的第三方驱动更新软件(名称省略)时,提示我的显卡驱动需要更新。打开设备管理器一看,发现当前使用的这一版显卡驱动还是2012年的。果然是够老的。果断选择下载并安装。安装结束后,我没有选择立刻重启系统,因为还有一大堆工作需要继续。

一切都很正常地进行着,直到我启动了Visual Studio 2012。Splash画面持续了5秒钟之后,弹出程序崩溃对话框,并开始收集错误,然后弹出新的对话框,问我是否向微软提交本次崩溃信息。选择拒绝后,程序直接关闭。试过几次,都是如此。 继续阅读“虫趣:拯救Visual Studio 2012(错误: 0xC01E0009)”

388 total views, 2 views today

Windows显示驱动(WDDM)编程初步(1)

欢迎转载作者:张佩】【原文:http://www.yiiyee.cn/Blog/wddm1/

WDDM Frame

Windows显示驱动从Vista开始,使用新的WDDM编程框架,称为Windows Display Driver  Model。也有一种最初的名称是LDDM,L代表Longhorn,但后来微软在所有产品线上都不再使用Longhorn代号,故而改成现在的名称。虽然在有些地方还能看到LDDM的说法,但应理解成旧文档的遗存,不应该做概念上的区分。

WDDM框架是一种典型的小端口(miniport)驱动框架。NT系统中的所有小端口框架,都是基于WDM框架来实现的,但小端口框架对外提供了更高级的接口,以简化编程的难度,并提高稳定性。如下图所示,中间的WDDM是系统提供的编程框架,我们基于这个框架,编写里面的小端口驱动,也就是显示驱动。 继续阅读“Windows显示驱动(WDDM)编程初步(1)”

3,750 total views, 1 views today