能力值:
( LV2,RANK:10 )
126 楼
支持一下!先读试读章节,呵呵
能力值:
( LV4,RANK:50 )
127 楼
前面的wowocock帖子已经做了解释,是WDK的版本的问题,不是操作系统的版本的问题。感谢你再次指出,我在本帖第一楼着重说明这个问题,以便避免读者的困扰。
能力值:
( LV2,RANK:10 )
128 楼
支持,已在淘宝上进行购买,过两天书到后好好研读研读。
能力值:
( LV2,RANK:10 )
129 楼
怎么当当上还没有?
能力值:
( LV7,RANK:100 )
130 楼
支持!!刚高考完。。正在读天书夜读。。。
能力值:
( LV2,RANK:10 )
131 楼
WINDBG调试部成功。。。在主机(4核CPU2个)安装WINDBG设置参数是 :"C:\Program Files\Debugging Tools for Windows (x86)\windbg.exe" -b -k com:port=\\.\pipe\com_1,baud=1152,pipe
XP虚拟机开启(调试状态[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect /debug /debugprot=com1 /baudrate=115200 正确启动调试态。。) 安装被调试驱动设置管道 (虚拟机同时开放2个,1个XP调试驱动CPU设置1个,1个LINUX做其他用处cpu设置2个)。启动虚拟机会开启WINDBG,显示如下:
Microsoft (R) Windows Debugger Version 6.11.0001.404 X86
Copyright (c) Microsoft Corporation. All rights reserved.
Opened \\.\pipe\com_1
Waiting to reconnect... 请各位大侠帮忙。。。谢谢
能力值:
( LV4,RANK:50 )
132 楼
baud=1152是不是写错了,应该是baud=115200
能力值:
( LV4,RANK:50 )
133 楼
因为不是首发,当当一般从发货到上架要一周半左右的时间。
能力值:
( LV2,RANK:10 )
134 楼
天书夜读后,一直盼寒江独钓。
能力值:
( LV7,RANK:100 )
135 楼
看了前3章, 感觉还能看懂, 但是到了第4章, 越来越看不明白了
感觉有以下几个问题:
1. 调式方法太单一,除了_asm int 3之外, 没有任何其它调试方法的介绍
第三章的串口过滤, 虽然按照书上的方法用dbgview以及windbg看到了输出, 但是除了用
_asm int 3 来搞个断点外, 用windbg本身的断点命令却无法下断, 还是不知道怎么调试好
而且在用了_asm int 3后, 分发函数进不去了, 无论怎么按键, 串口的分发函数都没有任何信息打印出来
感觉很迷茫
2. 没有讲解应用程序是如何跟驱动程序通讯的
虽然说, 用dbgview等工具能看到程序的实际输出, 可是驱动写出来了, 却不知道如何跟应用程序通讯
3. 很多概念令人迷惑
比如说要被绑定的目标设备, 这个设备是虚拟设备还是真实的设备? 它和目标设备之间、和真实设备之间的关系到底是怎样的?
设备栈里面的设备之间的关系是怎样的, 和真实设备的关系又是怎样的? 这个对应关系是怎样的?
书上说栈空间是非常重要的数据结构, 可是却没有解释栈空间在驱动程序中扮演怎样的角色, 它的结构
究竟是怎样的?它为什么重要?
4. 代码注释有些不疼不痒的
比如说, 这段代码:
PIO_STACK_LOCATION irpsp = IOGetCurrentIrpStackLocation(irp);
if ( irpsp->MajorFunction == IRP_MJ_WRITE )
{
// 如果是写。。。
}
else if ( irpsp->MajorFunction == IRP_MJ_READ )
{
// 如果是读。。。。
}
上面的2个注释其实根本不需要, 一看后面的IRP_MJ_WRITE和IRP_MJ_READ就知道是写和读
而真正需要注释, 需要说清楚的IoGetCurrentIrpStackLocation函数却没有讲清楚,只是简单的
注释: 获得当前栈空间, 这个注释只是从字面的意思说了一下这个函数, 但是没有说明原理以及它
在整个程序中的作用, 后面的IoSkipCurrentIrpStackLocation(irp)也是一样, 只是从字面意思
上解释说是跳过当前的栈空间, 没有解释为什么要调用这个函数, 跳过栈空间究竟是个什么意思?
5. 缺少程序整体框架、结构以及流程的讲解
我现在只看到第4章, 就再也看不下去了,程序中都是大段大段的代码加简单注释, 原理性的东西讲解太少,
代码中的有不少函数出现了, 但是没有讲解用它的作用,比如:
IoCopyCurrentIrpStackLocationToNext(Irp);
为什么要调用这个函数?作用是什么? 调用后产生的结果是什么样的?
以上只是我个人的一些小小看法, 可能是我的学习方法不得当或者是不够用功,
没有理解书中的意思, 因为我刚刚接触驱动,所以基本上对于驱动是一片空白,
以上说辞如有不妥之处, 还望狂人大哥海涵。
如果狂人大哥有条件或者时间, 不知可否开一个QQ讨论群或者是一个bbs, 专门
讨论狂人大哥的几本巨著, 好让读者能有个地方探讨读书的感受,解决读书的疑惑。
能力值:
( LV4,RANK:50 )
136 楼
第一个问题,调试,这个问题说“除了_asm int 3之外, 没有任何其它调试方法的介绍”纯属冤枉。本书第15页:“在驱动加载之前,设置断点不方便。所以笔者手工在DriverEntry 中加入一个断点如下:”,也就是说用int 3设置断点是因为在驱动加载之前,不方便设置断点采用的临时措施,绝对没有说int 3是唯一的设置断点的方法。
本书第16页很清楚的写明:
“(3)将光标移动到代码某一行上按下F9 键设置一个断点。请注意设置断点之前,系统必须已经中断;否则无法设置和修改断点。此外,再按一次F9 键可以取消断点。”
如果你按本书的第一章设置好了代码目录、符号表目录,从技术上说就可以用F9设置断点。如果不行,只剩下一点运气问题。WinDbg并不是总是没问题的,你必须多试几次。
第二个问题,应用程序和驱动程序的通讯问题
本书至少有两章讲解了应用程序和驱动程序的通讯,其中之一是第9章,其中之二是第11章。因为驱动和应用程序通信的方法都是一样的,所以没有必要每个例子都讲解驱动和应用程序的通信。所以9章之前的例子都有意设计成了不需要和应用程序通信的情况。让读者可以先熟悉驱动程序的开发。而且本书“阅读注意”中一开头就说本书应该从头到尾阅读,循序渐进,而不应该仅仅为了实现某个需求而阅读本书的某一章。
第三,迷惑的概念
“被绑定的目标设备, 这个设备是虚拟设备还是真实的设备? 它和目标设备之间、和真实设备之间的关系”这一点其实在书上多处都有解释。其中解说最多的是第三章。第四章的情况和第三章几乎完全一样,所以没有必要再次反复的加以解说。本书3.1.1的开头:
“进行过滤的最主要的方法是对一个设备对象(Device Object)进行绑定。读者可以想象,Windows系统之所以可以运作,是因为Windows中已经存在许多提供了各种功能的设备对象。这些设备对象接收请求,并完成实际硬件的功能。
“我们可以首先认为:一个真实的设备对应一个设备对象(虽然实际对应关系可能复杂得多)。通过编程可以生成一个虚拟的设备对象,并“绑定”(Attach)在一个真实的设备上。一旦绑定,则本来操作系统发送给真实设备的请求,就会首先发送到这个虚拟设备。”
至于你绑定的实际是什么设备,以及你的设备之下是什么设备,它们有什么关系,这和具体情况有关,甚至和这台计算机上安装的其他软件有关,换句话说,作为这层设备的编程者,根本不需要去关心,也不能依赖这些信息。
第四个问题:
代码中的有不少函数出现了, 但是没有讲解用它的作用,比如:
IoCopyCurrentIrpStackLocationToNext(Irp);
为什么要调用这个函数?作用是什么? 调用后产生的结果是什么样的?
这个函数最初出现在第4章第70页,在调用之前本书已经有解释(同一页上):
"调用IoCopyCurrentIrpStackLocationToNext把当前IRP栈空间拷贝到下一个栈空间(这和前面的调用IoSkipCurrentIrpStackLocation跳过当前栈空间形成对比)。"
这个解释只是为了让读者能使用这个函数。在本书第7章196页又做了总结性的介绍:
"完成IRP时是忽略还是拷贝当前栈空间(IO_STACK_LOCATION),返回什么状态值,以及完成函数中如何结束IRP,是不那么容易弄清楚的一件事情。笔者做个总结如下:
(1)如果对IRP完成之后的事情无兴趣,则直接忽略当前IO_STACK_ LOCATION(从代码上说,调用内核API函数IoSkipCurrentIrpStackLocation),然后向下传递请求,返回IoCallDriver所返回的状态。
(2)不但对IRP完成之后的事情无兴趣,而且不打算继续传递,打算立刻返回成功或失败。那么不用忽略或者拷贝当前IO_STACK_LOCATION,填写IRP的状态参数后调用IoCompleteRequest,并返回自己想返回的结果。
(3)如果对IRP完成之后的事情有兴趣,并打算在完成函数中处理,应该首先拷贝当前IO_STACK_LOCATION(IoCopyCurrentIrpStackLocationToNext),然后指定完成函数,并返回IoCallDriver()所返回的状态。在完成函数中,不需要调用IoCompleteRequest,直接返回IRP的当前状态即可。
(4)同(3)的情况,有时候,会把任务塞入系统工作线程或者希望在另外的线程中去完成IRP,那么完成函数中应该返回STATUS_MORE_PROCESSING_ REQUIRED,此时完成IRP时应该调用IoCompleteRequest。另一种类似的情况是在分发函数中等待完成函数中设置事件,那么完成函数返回STATUS_MORE_PROCESSING_REQUIRED,分发函数在等待结束后调用IoCompleteRequest。
"
我理解读者希望读到某一个部分就完全弄懂已经读过的所有的部分的心情,但是在Windows内核编程中,很遗憾这是不可能的。越想了解得多,进展就越缓慢,甚至可能就泄气放弃了。本人在完成第一个商业产品之前,许多概念都没有弄懂,但是开发了很多项目之后,许多概念就慢慢的懂了。本书没办法在第4章就把第4章需要的全部知识都罗列给读者(那后面的章节就没有必要了),但是凭我的经验说一句:知识是许多项目积累和总结出来的,而不是一蹴而就的学会的。在早期的学习中囫囵吞枣并不总是错的。
第五个问题:关于代码的注释。
关于代码的注释是仁者见仁智者见智,每个人都希望自己不懂的地方注释多,而自己懂的地方注释少。但是每个人懂和不懂的地方并不一样,所以满足所有人是不可能的。而且本书中的代码并没有为特定的读者特别写过,很多代码是原始工程中留下来的。
能力值:
( LV2,RANK:10 )
137 楼
已在china-pub买了
能力值:
( LV4,RANK:50 )
138 楼
前三章看过,还在等待我的订购. 楼上有不能编译的兄弟,可能跟路径有关系,我发现在我的桌面的路径就不能编译,放到ddk\src下就可以了,可能是目录不能出现空格或者中文的原因
能力值:
( LV7,RANK:100 )
139 楼
非常感谢狂人兄耐心细致的讲解,希望我的冒昧提问不会给狂人兄带来不悦,因为我说过,我只看到了第4章, 然后感觉越看越费劲,很多概念理解起来挺费劲的, 所以就没有看下去了, 后面讲解的是什么也不大清楚。看来我得重新仔细的研读前面几章,得下更多的功夫,既然开始学了, 就不能因为一时的困难放弃。
再次感谢狂人兄的辛勤劳动以及耐心解释。
能力值:
( LV7,RANK:100 )
140 楼
不知楚狂人前辈有没有调试Vista?
在XP下 SRVINSTW.EXE 或者 INSTDRV.EXE 都是可以顺利加载驱动的
在vista下可以用 SRVINSTW.EXE 创建一个服务,也可以用net start 启动服务,但是debugview中看不到信息,windbg中也没有中断.....
初学驱动还望前辈不吝赐教....
能力值:
( LV7,RANK:100 )
141 楼
我是134L~好像是权限问题,已经解决了。。
能力值:
( LV2,RANK:10 )
142 楼
以后闲了,买来研究研究。呵呵
能力值:
( LV2,RANK:10 )
143 楼
经典之作
必看之……
能力值:
( LV4,RANK:50 )
144 楼
好久没有来过了,所以少看这个。不过你既然解决了,嘿嘿,那就不说了。
能力值:
( LV2,RANK:10 )
145 楼
支持下,呵呵!
能力值:
( LV2,RANK:10 )
146 楼
拜读了,谢谢LZ
能力值:
( LV5,RANK:60 )
147 楼
本人已购,哈哈……
能力值:
( LV2,RANK:10 )
148 楼
书俺买了。。。。。。
能力值:
( LV5,RANK:60 )
149 楼
仔细看了这本书的前几章,经过自己核对实验,发现ps2intcap的那个例子错误太多了,包括C语言运用的错误,对中断控制的错误,端口操作的错误……
希望以后几章不是这样的……
能力值:
( LV9,RANK:250 )
150 楼
我是来纯支持一下的 ~~