网络内核调试的春天

今天试了两个虚拟机,virtualbox和vmware player,看能不能支持网络调试。结果非常满意,两个虚拟机软件默认配置的虚拟网卡,都能用于建立网络内核调试连接,我三下两除二地,就把内核调试给建立了。vmware中的网卡设备是82574L Gigabit NIC,设备ID是8086/10D3。VirtualBox中的网卡设备是Pro/1000 MT(即颇为经典的E1000系列),设备ID是8086/100E。检查Windows网络内核调试所支持的NIC列表,发现这两块网卡,都在被支持的列表中。链接:Supported NIC for network kernel debug。

不同的虚拟机软件配置其虚拟网卡的方式不尽相同,我比较喜欢VirtualBox,它直接提供了一个可选列表框让用户选择,默认是Pro/1000 MT。VMWare Player则没有类似的接口,但我查看了网上的一些资料,用户也可以通过直接修改配置文件的方式,配置虚拟网卡的类型。 继续阅读“网络内核调试的春天”

3,703 total views, no views today

全局观Windows BCD

引用注明>> 【作者:张佩】【原文:http://www.yiiyee.cn/Blog/
v1.0
BCD Objects
  • 引入BCD

系统启动是一件困难的事情,面对困难,在实现的时候尽量简单化,是个保守而易用的原则。所以Windows系统最初的启动配置文件是一个文本格式的文件(boot.ini),系统启动管理器通过解析文本内容,提取启动参数。

启动配置数据(Boot Configuration Data,简称BCD)是在Vista的时候引入的新机制,目的是希望把启动弄得复杂一点——不不,抱歉我说反了,目的是用一个综合而安全的方案,满足日渐复杂的启动需求。更进一步说,BCD的引入是希望把现存和可能的多种启动方式,和系统启动过程的扩展和配置需求,集成在统一的接口中进行管理和使用。这个统一的配置接口能够覆盖各种需求,包括不同的启动方式,支持休眠与唤醒,实现系统的回退安装,支持启动初期的硬件检测等。

人们对BCD的态度褒贬不一。从肯定的方面看,当一个事物的复杂性增加时,换用更灵活的手段对它重新管理和呈现,是发展的必然。就好比从蜗居换入广厦,室内装修和布置方案,自然是可以大作改观的。从批评的一方看,很多开发者认为,BCD以元数据的方式保存配置信息,数据本身不具有可读性,同时BCD的结构设计得相当复杂,对于学习和使用都缺乏亲和性。他们一致的看法是,虽然boot.ini简陋,但BCD却过于激进,更受青睐的方式是grub方式的配置文件,grub是一种在Linux系统上被广泛使用的启动管理器,其配置文件是文本文件格式的,可直接使用文本编辑器进行编辑和查看,同时还达到了功能完备的目的。

纷争虽然存在,但学习是唯一手段。作为既成的事实,BCD在Windows系统上的重要性业已根深蒂固,如此重要的系统基础设施,已经没有推翻重来的可能性。

继续阅读“全局观Windows BCD”

9,009 total views, 2 views today

我后十年的技术路

过去一年我是比较地迷茫的,这种迷茫是源于我对过去十年工作的反思,一种无意义的反思。

过去十年,我的主要工作是在Windows系统环境下编写内核驱动,我几乎涉及过80%的驱动类型,并在后四年里专门做图形显示驱动。另一项主要的工作内容是软件调试,在AMD工作时,我每个礼拜要至少完成3个debug任务;我每年都会遇到一两个特别奇怪而紧急的问题,最后通过艰深困苦的汇编调试,证明是微软的代码bug。

时间促使我反思,在长久的埋头苦作后,我灵光一现地抬起头来,发现自己做的所有工作,好像都只是皮毛和外表。我做不到以三言两语来描述通常要长篇大论描述的问题,因为我尚被无数的细节所羁绊,远未能抵达其核心。事物的真实面貌并没有被真实展现,我看到的只是包装过的模样,尚不了解它的骨肉和肌理。 继续阅读“我后十年的技术路”

46,234 total views, 1 views today

GPU异步V-Sync技术方案

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

2014年中,我在公司内部提交了一个名为“异步Timing”(又名“异步V-Sync”)创新方案,用于解决GPU使用V-Sync同步所导致的问题。但十分可惜的是,Intel的创新审核委员没有通过我的方案,只礼貌性地回了一封感谢邮件。这件事情本来尘埃落定,我已不作多想。但最近很多IT新闻介绍了AMD在今年CES上所展示的一项FreeSync技术,惊喜颇多。我发现AMD的FreeSyn技术所要解决的问题和采取的策略,与我的“异步Timing”的设计方案十分相似。我写作此文,向大家介绍V-Sync的基本概念和产生的问题,以及异步Timing方案的细节。

在计算机图形显示系统中,这几个概念是相互关联的:Timing(时序),V-Sync(垂直同步),Refresh Rate(刷新率)。它们是从同一个地方衍生出的概念:Timing Controller(时序控制器,简称T-Con)经过配置后产生连续的Timing时序,Timing时序决定了何时会产生一个V-Sync中断;显示器每收到一个V-Sync中断,便开始一次显示刷新;显示器每秒刷新的次数就对应了它的Refresh Rate(刷新率)。 继续阅读“GPU异步V-Sync技术方案”

9,424 total views, 1 views today

Windows安全软件的思考

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

最近以来,我重新翻阅了几本Windows系统下的安全类书籍,同时上网查阅资料,很意外地发现,很多几年前流行的牛叉技术,虽然还在书本和网页上历历在目,但实际上多数已不能在新系统中使用了。我由此也发生了一些个人的思考,虽然多年不接触安全技术,但思考的能力还在。

分析安全问题的来源

总是因为存在安全隐患,才有了攻击动作的发生而因为有了大量的攻击,才继而产生了安全防护的需求。所以一定要研究安全隐患的来源。总体上分类,安全问题可以划分为本地和分布式两种,所以安全攻击的方法也可以分为本地攻击和分布式网络攻击。

先看存在于本地机器上的安全隐患,也就是在一台安装了Windows系统的PC机内部的安全隐患,把它分成下面两类:

第一类,是OS架构本身存在的结构性的设计缺陷或不周到,从而导致了被后门软件利用,并据此发动的针对本地资源的攻击。这些不周到主要体现在OS为一系列的Hook技术提供了便利。存在于Windows系统上的Hook技术,从1990年代以来就一直很热门。概言之,它包括静态修改二进制文件和执行时动态修改运行逻辑这两种方法。 继续阅读“Windows安全软件的思考”

3,370 total views, no views today

多了一个“星号”

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

国庆假期我看WDK 8.1中的sample项目,遇一极有趣问题,和基本的指针使用有关,特缀文于此。请看下面是WDK8.1 msplot项目中的一段代码(经我简化过),三行而已,作一个减法运算。注释中的例值,其期望结果应是0x10,但意外得到一个溢出后的大值:

/* struct _PLOTGPC                      */
/* {                                    */
/*  //...                               */
/*  LPVOID pData;                       */ 
/* };                                   */

LPBYTE *pByte = pPlotGPC->pData; // pByte:0x0040fa30
pByte -= (ULONG_PTR)pPlotGPC;    // pPlotGPC:0x0040fa20
pPlotGPC->pData = pByte;         // 结果:0xff3d11b0

继续阅读“多了一个“星号””

5,305 total views, 1 views today

假货泛滥是淘宝的毒瘤

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

我前段时间装修房子,好几个月都没有更新博客。但手里却已经积攒了十多个可供写作的dump文件。现在终于用空了,再次面对word文档敲击键盘时,我却并不急于去分析任何一个dump文件,而要来谈谈淘宝网。有一件发生在眼前的事情,勾起我的一些思考,使我要发挥一番。

买到假货

我前天在天猫上买了一根USB转串口线(商品link)。这是一种很简单的线材,把电脑上的USB口转成串口输出,或把外部串口转成USB输入。串口这种古老的接口,在上世纪曾广泛使用,但进入新世纪后就逐渐被USB接口代替而几乎销声匿迹。如果不是因为一些很传统的需求,现在已很少有它的用武之地。仅在一些特殊的应用领域,串口仍被某些设备所使用,比如老式的打印机、Modem以及串口调试等。现在的常用方式是把USB口转成串口并连接串口外设,这需要通过一根内含转换器的线缆来实现,也就是我买的这根线。

我在购买时特地只选了天猫店铺。这种线缆实现很容易,所以价格不贵,30元以内。我选择了一家地址显示为苏州的店铺,希望早点寄到。快递隔天即送到了,我对此很满意。包装不是密封的,我取出线缆,把USB口连接到电脑上并安装驱动,进行测试。我本以为这么一根简单而廉价的线缆,奸商们必不太愿意对它大费周章吧。但我却想错了。我晦气临头,发现自己买到了假货。 继续阅读“假货泛滥是淘宝的毒瘤”

5,878 total views, 1 views today

Win32K里的死循环

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

这是我到新公司后上手的第一个issue。一线工程师找到我,说有一个urgent issue有没有兴趣看一看。当时他已经组织了一个team的人帮助他,我便成了其中一员。

问题确实很紧急,已经影响了产线的生产。当时正临清明假期,导致很多人都岌岌可危地面临清明加班的可能。其实这个问题已经报出来好几个月,但一线工程师一直以绥靖政策对待,以各种方式把问题发生率降低到客户接受的水平。绥靖政策长时间以来是有效的,但最近却突然失效,发生率飙升到了20%。一线工程师才真的着急了。

问题定性

组一个team的人debug同一个问题,在我以前是未曾经历过的。初始的想法当然是认为人多力量大。但真正实施的时候,也可能遭遇人多嘴杂的窘况。 继续阅读“Win32K里的死循环”

7,648 total views, 1 views today

奇妙的系统性能问题(2)

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

这篇文件是对上一篇《奇妙的系统性能问题》的补充。我在经历那次性能陡降问题困扰的过程中,还碰到了一次BSOD。当蓝屏发生的时候,我甚至是兴奋的。因为在此之前,我一直都认为问题是系统或软件模块导致的。而蓝屏正好是分析的切入点。所以当分析了这个dump后,我立刻扭转了方向,判断认为:确实是磁盘坏了。

这个结论是正确的,但却不完备的。因为最后的结果是磁盘并没有坏,而是受到了外部环境的干扰。

这个dump文件弥足珍贵,因为正常情况下,这种伤硬盘的实验我们是不会主动去做的。所以这个dump文件完全得于碰巧,在此进行分析。 继续阅读“奇妙的系统性能问题(2)”

6,096 total views, no views today

奇妙的系统性能问题

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

在前一家公司时,我借了一台测试板用于开发和测试。这块板子在正常运行了一段时间后,忽然遇到持续性的系统性能问题。问题来得非常突然,是某一天早晨上班的时候突然发生的。像电影里面马师爷抱怨的那样,吃着火锅还唱着歌,就突然遇到劫道的了。都太突然了。

问题的特征非常明显,就是系统性能无限下降。登录到系统登录界面,往往要十几分钟。Win 8.1的Metro UI出来,又要若干分钟时间。所以常态下看到的界面,就是Metro UI上面一个个磁贴只有边框,图标内容则完全没画出来。 继续阅读“奇妙的系统性能问题”

5,148 total views, no views today

VS2012开发驱动小Tip之:更改KMDF版本以支持XP系统

我的印象中,我最早使用的KMDF版本是1.5,那是Vista出来的时候,时间大概2006年左右。KMDF的版本变更并不是很快,总是伴随着WDK的发布而更新的,而WDK版本的更新,一般又是和OS同步的。KMDF的主版本还是1,但次版本号总是以2递增:1.5(Vista)、1.7(Vista SP1)、1.9(Win7)、1.11(Win8)、1.13(Win8.1)

早期的KMDF版本保持了良好的向后兼容性,比如用最晚KMDF 1.9编译出来的驱动程序,可安装使用于XP系统*。但从下图(MSDN)可以看出,从KMDF 1.11开始,情况变化了。KMDF 1.11取消了对Vista以前系统的支持。而KMDF 1.13更绝,编译出来的驱动只能安装在Win8.1上。 继续阅读“VS2012开发驱动小Tip之:更改KMDF版本以支持XP系统”

13,986 total views, 2 views today

虫趣:当NV显卡驱动碰上Verifier

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

今天开电脑的时候,刚完成用户登陆,就遇到一个蓝屏。桌面还没有进去呢。趁着系统正处于抓取dump文件的过程中,赶紧拍了一张照,留作纪念。造成蓝屏的不是别人,乃是负责图形渲染和显示的显卡驱动:Nvidia显卡驱动。

我使用的系统:Win Blue x64。

0xc4

继续阅读“虫趣:当NV显卡驱动碰上Verifier”

6,412 total views, no views today

工具:IOCTL助手 V1.1

IOCTL

我在10年写《竹林》这本书时,写了一个分析IOCTL值的工具,一直想着可以把界面再改善一下,功能更完善一点。今天正好有一点时间,就做了这件事情。用户可以使用这个工具查看、定义IOCTL值。

下载:[download id=”7″]

继续阅读“工具:IOCTL助手 V1.1”

6,294 total views, 1 views today

VS2012趣事:时区和时间戳

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

前几天某个早晨,大概5点钟我就醒在床上,怎么也睡不着。想到手头还有一个驱动需要debug,就立刻发现了人生目标一样地爬了起来。匆匆洗漱完毕后,打开电脑,打开VS2012驱动项目。先把代码逻辑仔细的看过一遍,有了一点小发现,改了几行代码。按下F7开始编译。

编译结束后,很惊讶地发现“输出”试图中报了一个错误,是driver package工程报错。这里要说一下相关的背景,通过VS2012的工程向导创建的驱动项目(solution)总是包含两个工程(project):一个是驱动工程,所有的源代码都在此,编译后生成驱动文件(一般是.sys文件);一个是driver package工程,无源码,它的编译过程乃针对inf文件和sys文件进行处理,产生一个可安装的驱动包(driver package)。

头一次遇到package工程失败的情况,会是什么原因呢? 继续阅读“VS2012趣事:时区和时间戳”

534,315 total views, 25 views today

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

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

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

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

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

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

11,027 total views, no 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 错误”

10,069 total views, no views today