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

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

1.      问题描述

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

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

15,169 total views, 3 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调试命令详解”

45,804 total views, 14 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中查看计算机名”

7,566 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和电源特性概述”

5,939 total views, 1 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。 继续阅读“虫趣:不同模块对指定变量类型的定义不同”

4,760 total views, no 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)”

20,623 total views, 6 views today