|
|
|
|
|
|
|
Windows内核调试
帖子发起人: luobing 发起时间: 2011-05-24 15:27 下午 回复: 7
|
帖子排序:
|
|
|
|
2011-05-24, 15:27 下午
|
luobing
注册: 2009-10-06
发 贴: 19
|
|
|
调试一个比较简单的驱动,创建设备并为应用程序准备符号链接。附件为代码。
问题主要出现在Unicode字符串上。在两个例程中:
CreateDevice中创建工作:
UNICODE_STRING devName;
RtlInitUnicodeString(&devName,L"\\Device\\MyDDKDevice");
......
pDevExt->ustrDeviceName = devName;
......
UNICODE_STRING symLinkName;
RtlInitUnicodeString(&symLinkName,L"\\??\\HelloDDK");
pDevExt->ustrSymLinkName = symLinkName;
.......
在HelloDDKUnload中卸载:
UNICODE_STRING pLinkName = pDevExt->ustrSymLinkName;
IoDeleteSymbolicLink(&pLinkName);
其中pDevExt是自定义的设备扩展。
问题出来了,当去删除设备链接的时候,发现保存在pDevExt->ustrSymLinkName中的字符串已经没有了,操作系统直接不客气的蓝屏。
我的理解:
1 在CreateDevice()中的devName是局部变量,但是为它赋以初值的时候,L"\\Device\\MyDDKDevice"这个字符串是存储在静态存储区内,编译的时候已经确定的,属只读区域。当将devName赋给pDevExt->ustrDeviceName的时候,应该已经将字符串的指针传给了pDevExt->ustrDeviceName,在整个程序运行过程中,不会有谁去动这个静态区域吧。
同样symLinkName也是这样的道理,这是用windbg看到赋值后的情况:
kd> dt symLinkName
Local var @ 0xf88c2c54 Type _UNICODE_STRING
"\??\HelloDDK"
+0x000 Length : 0x18
+0x002 MaximumLength : 0x1a
+0x004 Buffer : 0xf8994110 "\??\HelloDDK"
我觉得0xf8994110中的值应该不会被谁改变。
2 在进入HelloDDKUnload前,我去查看了0xf8994110的值,变成了这样:
kd> dU f8994110
f8994110 "????????????????????????????????"
3 为了验证这个想法,我重新加载驱动,下内存访问的断点:ba r1 f8994110
只有在IoCreateSymbolicLink()中有读的动作,一直运行到HelloDDKUnload都没有出现写的动作,感觉好像那片内存被谁改变了权限一样。
到底是怎么回事情,有没有哪位遇到过?
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2011-05-24, 15:36 下午
|
luobing
注册: 2009-10-06
发 贴: 19
|
|
|
顺便加一句,以上的调试都是使用WDK7600.16385.0,xp check模式编译的,当使用Free模式编译的时候不会出现这个问题。我的目标机器是windows xp sp3(在虚拟机和实际的机器上都调试过),真是苦恼,不知道自己哪个地方理解有误,祈盼解答^^
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2011-05-24, 21:20 下午
|
格蠹老雷
注册: 2005-12-19
发 贴: 1,303
|
|
|
为了节约宝贵的内核空间,通常用下面这样的声明把DriverEntry函数放在特殊的INIT段里:
#pragma alloc_text(INIT,DriverEntry)
INIT段在驱动初始化后会被丢弃...
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2011-05-24, 21:49 下午
|
王宇
注册: 2007-05-08
发 贴: 306
|
|
|
嗯!^_^
INIT:00010780 SourceString: ; DATA XREF: CreateDevice(_DRIVER_OBJECT *)
INIT:00010780 unicode 0, "\Device\MyDDKDevice",0
INIT:000107A8 unicode 0, "\??\HelloDDK",0
INIT:000107C2 align 8
IDA 看一下你的 SYS 就能发现,串在 INIT 节中,所以 Break on Access 无效。
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2011-05-24, 23:32 下午
|
luobing
注册: 2009-10-06
发 贴: 19
|
|
|
非常、非常感谢两位的指导。再调试了去看,确实如此。因此也添加了新的迷思,OS是在什么时候回收内存的呢,通过什么方式回收, windbg应该怎么下断才能看到这个过程?......无穷无尽的疑问啊,调试技术确实有趣^^ 我会自己去寻找这些答案的,再次感谢。
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2011-05-25, 11:59 上午
|
wrong
注册: 2011-01-07
发 贴: 66
|
|
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2011-05-26, 15:25 下午
|
王宇
注册: 2007-05-08
发 贴: 306
|
|
|
很正常的想法啊,这不能算“想的好多”..
luobing 如想找答案请看 mm\mminit.c
看看 ( 跟踪 ) 函数 MiFindInitializationCode() 关于 DiscardSection = TRUE; 的处理,以及最终的 MiFreeInitializationCode() 等。
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2011-05-27, 09:10 上午
|
格蠹老雷
注册: 2005-12-19
发 贴: 1,303
|
|
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
高端调试 » 软件调试 » Windows内核调试 » Re: 让人苦恼的UnicodeString问题
|
|
|
|
|
|