第二十二篇:再写Windows驱动,再玩Windbg---NET

2011年到现在,就没再怎么搞过Windows驱动了.

最近, 由于项目需要, 试着改一改一个显卡驱动(KMDOD), 从实践上证明, 我在理论上对一个驱动的架构的正确与否.(USB Display = KMDOD + AVStream).

其中, KMDOD是完成显示的部分功能, 完成其中的VidPN(Video present network), 将驱动中原来的POST物理设备转变为USB物理设备.

而AVStream之所以这样提出, 完成是由于USB Video class的启发, 要不然, 没有AVStream的Filters, Pins, Dispatch tables, Automation tables, Nodes, Methods, Properties, Events怎么实现与DShow的交互?

基于以上的理论设计, 去实现真正的USB Display设备驱动, 前期的工作量评估也是这次再次玩Windows驱动的原因.

驱动代码改写这边, 就不多说了, 工作量方面, 从DisplayLink的交流空间中了解, 他们花了10-20个人, 1-2年的时间, 来完成一个USB Display驱动.

总得一点, 无论KMDOD这个WDDM miniport中的VidPN, USB, 还是 AVStream中的Filters, Pins, 要做起来, 都不像我当初想象的那么简单.

至少, 我目前在KMDOD的改造过程中, 碰到一系列的问题, 以后再表.

关于WinDbg调试:

WinDbg是很好的调试工具, 关于这一论断, 没有任何意见.

但我的观念还停留在COM 115200 bps的"鸟枪"上, 所以, 对WinDbg的"慢"反应, 总是非常不耐烦.

目前, 我的配置是, 主机Win7 Test Mode, build 7601, 从机Win8.1 Pro Build 9600.

我是直接从Win8 Pro Build 9200直接升级到9600的, 这个升级解决了 WDDM1.1 到 WDDM1.2的更新, 否则KMDOD是不能在WDDM1.1上运行的(注意了).

在更新后:

–NVIDIA Quadro NVS 285

–NVIDIA Geforce 210

–intel(r) q45/q43 expresschipset

只有第一块显卡不能使用KMDOD(原因等有时间再找, 反正也不是我做的产品), 另外两块, 都能正确安装且使用KMDOD的驱动.

使用COM口调试驱动:

1. 慢

2. 一大堆打印, 导致更"慢"

3. 要设置一个断点之类的操作, "慢"到后来, 让你不知道是TARGET死机了,还是说TARGET还在运行, 搞得你是要继续等呢, 还是强行重启呢?

4. 浪费时间, 一次次设置断点不成功, 最后, 代码没跟踪成功, 原因没找到,事情没办成.

所以, 不得不找别的办法来代替COM口的调试.

USB2.0

好多人没有用过USB2.0的DEBUG CABLE, 或者是根本没有见过这个GADGET.

原因, 就是:第一贵, 第二, 这玩意儿不好买, 第三, 即使买了, 有些PC也不支持USB DEBUG这个扩展功能.

结果, 我就是第三种情况, 这么贵的玩意到手了, 而且有两个(Ajays technology USB2.0 Debug Cable), 但你眼巴巴地看着, 它就是一没用的东西, 你会什么感受?

而且, 为了折腾它, 花了不少时间.

有兴越的人可以参阅:

How to Debug the Windows OS using USB

http://www.codeproject.com/Articles/132313/How-to-Debug-the-Windows-OS-using-USB

相信没有人会再去看这样的文章, 完完全全地在浪费时间.

1394:

以前使用过, 笔记本带1394口, 被调试的机器, 买一张PCI/PCIE转1394的卡, 使用起来还是比较方便的, 但目前的实际环境是, 现在的笔记本不带1394, 也没有这种PCI/PCIE转1394的卡.

USB3

Win8内核调试支持USB3了, 但需要一根A-A电缆, 没有硬件, 只好放弃.

最后, 选择了人人都能有的NET方式:

三根网线, 一个路由器, 边接到局域网 (两根网线, 加一个路由器, 不接入局域网的方式, 我没弄成功, 因为两台计算机的网卡都处于"黄点"状态;如果只有一根交叉网线, 我也没有试过, 因为没有这样的交叉网线, 也不知道能不能成功. 记得以前, WHQL-->DTM 测试的时间, 就是用的这样的一根交叉网线来测试的, 后来, 我也玩过WHCK, 但也不再用交叉网线了.)

HOST安装了最新的WINDOWS KITS 8.1, 带了最新的WINDBG, 我目前的版本是:6.3.9600.16384, 记录HOST的IP地址.

TARGET:

bcdedit /dbgsettings set hostip:xxx.xxx.xxx.xxx port:50000 key:aaa.bbb.ccc.ddd

bcdedit -debug on

如果有多个网卡:

bcdedit /set {dbgsettings} busparams bus.device.function

bus, device, function在设备管理器的property中查找.

之后, 主机设置PORT NUMBER, KEY, 等待:

Microsoft (R) Windows Debugger Version 6.3.9600.16384 X86

Copyright (c) Microsoft Corporation. All rights reserved.

Using NET for debugging

Opened WinSock 2.0

Waiting to reconnect...

重启从机, 连接成功后,如下显示:

Connected to target 10.38.188.159 on port 50000 on local IP 10.38.188.162.

Connected to Windows 8 9600 x86 compatible target at (Fri Jun 20 15:21:02.168 2014 (UTC + 8:00)), ptr64 FALSE

Kernel Debugger connection established.

目前, NET调试的速度明显提高了, 但我这里还是有不可以设置断点的情况, 没有找到具体原因,

仔细观察的读者, 如何自己尝试后, 会在DEVICE MANAGER中, 看到系统多了一个网卡:

Microsoft Kernel Debug Network Adapter.

而原来那个网卡: Intel(R) 82567LM-3 Gigabit Network Connection却出现在"传说中的黄点".

不用担心, 这个时候, 真正的物理网卡就是前者, 而后者已经不能代表这块物理网卡了.

这一点, 我已经尝试, 即你将带黄点的网卡禁止, 主机WINDBG还是可以控制从机的, "g"

第二十二篇:再写Windows驱动,再玩Windbg---NET,布布扣,bubuko.com

时间: 2024-12-31 03:40:11

第二十二篇:再写Windows驱动,再玩Windbg---NET的相关文章

Python开发【第二十二篇】:Web框架之Django【进阶】

Python开发[第二十二篇]:Web框架之Django[进阶] 猛击这里:http://www.cnblogs.com/wupeiqi/articles/5246483.html 博客园 首页 新随笔 联系 订阅 管理 随笔-124  文章-127  评论-205 Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻

第二十二篇 信念

第二十二篇  信念 "信念"能带给一个人无穷的力量,这些力量可以支撑自己走过漫长的人生.一个人如果没有信念,就很难找到自己的人生方向,所以"信念"也可以理解为希望. 信念可以给到我们希望,也可以给到我们力量,所以一个人的信念会影响到自己的整个人生.当然信念也有好坏之分,好的信念能让自己积极向上.不畏艰难:坏的信念会让我们不思进取.随波逐流.这两种不同的信念会给到我们两种完全不同的人生,就看亲人们如何作出正确的选择. 一个人活在世上,可以选择走正确的人生道路,依靠好的

Egret入门学习日记 --- 第二十二篇(书中 9.7~9.8 节 内容)

第二十二篇(书中 9.7~9.8 节 内容) 开始 9.7节 内容. 重点: 1.进度条ProgressBar的声明和使用. 操作: 1.进度条ProgressBar的声明和使用. 现在真的轻车熟路了,很简单.无非就是设置一下最大值,当前值的属性. 然后,事件监听的话,也是一样的.只不过事件名字的话,我就选书中这个事件吧. 可惜不能发动图,不然你们就可以看到这个进度条,每帧+1的速度前进. 当然,如果你想换自定义皮肤,还是老规矩,去找默认的 EXML 文件. 然后,怎么换素材,就按照自己喜欢的换

C++第三十八篇 -- 研究一下Windows驱动开发(二)--WDM式驱动的加载

基于Windows驱动开发技术详解这本书 一.简单的INF文件剖析 INF文件是一个文本文件,由若干个节(Section)组成.每个节的名称用一个方括号指示,紧接着方括号后面的就是节内容.每一行就是一项内容,其形式都是类似SomeEntry=SomwValue.每个项的顺序是可以颠倒的,但系统分析INF文件的时候,是顺序解析的.INF中注释语句是用分号开头的. 二.WDM设备安装在注册表中的变化 WDM式驱动程序的安装会在三个方面修改注册表,分别是硬件子键(Hardware).类子键(Class

C++第三十九篇 -- 研究一下Windows驱动开发(二)-- 驱动程序中重要的数据结构

数据结构是计算机程序的核心,I/O管理器定义了一些数据结构,这些数据结构是编写驱动程序时所必须掌握的.驱动程序经常要创建和维护这些数据结构的实例. 一.驱动对象(DRIVER_OBJECT) 每个驱动程序会有唯一的驱动对象与之对应,并且这个驱动对象是在驱动加载的时候,被内核中的对象管理程序所创建的. 驱动对象用DRIVER_OBJECT数据结构表示,它作为驱动的一个实例被内核加载,并且内核对一个驱动只加载一个实例.确切地说,是由内核中的I/O管理器负责加载的.驱动程序需要在DriverEntry

开始写游戏 --- 第二十二篇

今天: 先看看目前战斗场景和昨天的对比 昨天: 1.新增 被动技能 2.新增 敌人被攻击动画 3.优化动画流畅度 4.修改动画封装 说明: 1.新增 被动技能 写死在攻击指令里,目前我觉得不太好,不方便后期扩展.后面我再想想怎么设计代码结构吧. 2.新增 敌人被攻击动画 3.优化动画流畅度 每次动画播放的间隔,都会增加一个站立动画来过度. 如敌人被攻击: 主角攻击时: 4.修改动画封装 之前的方式是: 销毁动画 -> 创建新动画 -> 添加动画到舞台 现在的方式是: 更改动画 -> 判断

python全栈开发基础【第二十二篇】进程池和回调函数

一.数据共享 1.进程间的通信应该尽量避免共享数据的方式 2.进程间的数据是独立的,可以借助队列或管道实现通信,二者都是基于消息传递的. 虽然进程间数据独立,但可以用过Manager实现数据共享,事实上Manager的功能远不止于此. 命令就是一个程序,按回车就会执行(这个只是在windows情况下) tasklist 查看进程 tasklist | findstr pycharm #(findstr是进行过滤的),|就是管道(tasklist执行的内容就放到管道里面了, 管道后面的findst

第二十二篇 Java的一些关键字、 作用域 还有运算符的使用

大家好,我来和大家一起分享一下今天我所学习到的一些知识点,今天我学会了怎么去使用Java中的一些关键字 .作业域和运算符的使用.... 首先来介绍一下 Java中的关键字有哪些,由于数量有很多 ,我就来说一下我今天所学会的关键字 与其作用: 我学到的第一个关键字是----Scanner ,他在Java中 代表这扫描器的作用,并且要引入包,他的作用就是监听键盘的输入,其中见过次数最多的是在注册或登陆界面上,那是候会直接采用你所输入的值,并取出来使用, 第二个关键字是 是-------return,

第二十二篇 正在表达式 re模块

re模块****** 就本质而言,正则表达式时一种小型的,高度专业化的编程语言,在python里,它内嵌在python中,并通过re模块实现.正则表达式模式被编译成一系列的字节码.然后用C编写的匹配引擎执行. 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. re 模块使 Python 语言拥有全部的正则表达式功能. 说白了,正则就是用来处理字符串的. 简言之,正则就是给字符串进行模糊匹配 正则的用途: 1. 模糊匹配 2. 应用场景如:一个文本里存了一堆身份证