Re: 让人苦恼的UnicodeString问题
Windows内核调试
让人苦恼的UnicodeString问题
luobing
2011-05-24, 15:27 下午
调试一个比较简单的驱动,创建设备并为应用程序准备符号链接。附件为代码。
问题主要出现在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都没有出现写的动作,感觉好像那片内存被谁改变了权限一样。
到底是怎么回事情,有没有哪位遇到过?
Re: 让人苦恼的UnicodeString问题
luobing
2011-05-24, 15:36 下午
顺便加一句,以上的调试都是使用WDK7600.16385.0,xp check模式编译的,当使用Free模式编译的时候不会出现这个问题。我的目标机器是windows xp sp3(在虚拟机和实际的机器上都调试过),真是苦恼,不知道自己哪个地方理解有误,祈盼解答^^
Re: 让人苦恼的UnicodeString问题
格蠹老雷
2011-05-24, 21:20 下午
为了节约宝贵的内核空间,通常用下面这样的声明把DriverEntry函数放在特殊的INIT段里:
#pragma alloc_text(INIT,DriverEntry)
INIT段在驱动初始化后会被丢弃...
Re: 让人苦恼的UnicodeString问题
王宇
2011-05-24, 21:49 下午
嗯!^_^
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 无效。
Re: 让人苦恼的UnicodeString问题
luobing
2011-05-24, 23:32 下午
非常、非常感谢两位的指导。再调试了去看,确实如此。因此也添加了新的迷思,OS是在什么时候回收内存的呢,通过什么方式回收, windbg应该怎么下断才能看到这个过程?......无穷无尽的疑问啊,调试技术确实有趣^^ 我会自己去寻找这些答案的,再次感谢。
Re: 让人苦恼的UnicodeString问题
wrong
2011-05-25, 11:59 上午
楼上想的好多啊。
Re: 让人苦恼的UnicodeString问题
王宇
2011-05-26, 15:25 下午
很正常的想法啊,这不能算“想的好多”..
luobing 如想找答案请看 mm\mminit.c
看看 ( 跟踪 ) 函数 MiFindInitializationCode() 关于 DiscardSection = TRUE; 的处理,以及最终的 MiFreeInitializationCode() 等。
Re: 让人苦恼的UnicodeString问题
格蠹老雷
2011-05-27, 09:10 上午
有道理,这个属于关键细节