Advanced Debugging
About AdvDbg Consult Train Services Products Tools Community Contact  
欢迎光临 高端调试 登录 | 注册 | FAQ
 
  ACPI调试
Linux内核调试
Windows内核调试
 
  调试战役
调试原理
新工具观察
 
  Linux
Windows Vista
Windows
 
  Linux驱动
WDF
WDM
 
  PCI Express
PCI/PCI-X
USB
无线通信协议
 
  64位CPU
ARM
IA-32
  CPU Info Center
 
  ACPI标准
系统认证
Desktop
服务器
 
  Embedded Linux
嵌入式开发工具
VxWorks
WinCE
嵌入式Windows
 
  格蠹调试套件(GDK)
  格蠹学院
  小朱书店
  老雷的微博
  《软件调试》
  《格蠹汇编》
  《软件调试(第二版)》
沪ICP备11027180号-1

Windows内核调试

帖子发起人: luobing   发起时间: 2011-05-24 15:27 下午   回复: 7

Print Search
帖子排序:    
   2011-05-24, 15:27 下午
luobing4365 离线,最后访问时间: 2022/5/16 2:05:04 luobing

发帖数前50位
注册: 2009-10-06
发 贴: 19
Huh? [:^)] 让人苦恼的UnicodeString问题

附件: NT_Driver.rar
Reply Quote
调试一个比较简单的驱动,创建设备并为应用程序准备符号链接。附件为代码。
问题主要出现在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 下午
luobing4365 离线,最后访问时间: 2022/5/16 2:05:04 luobing

发帖数前50位
注册: 2009-10-06
发 贴: 19
Re: 让人苦恼的UnicodeString问题
Reply Quote
顺便加一句,以上的调试都是使用WDK7600.16385.0,xp check模式编译的,当使用Free模式编译的时候不会出现这个问题。我的目标机器是windows xp sp3(在虚拟机和实际的机器上都调试过),真是苦恼,不知道自己哪个地方理解有误,祈盼解答^^
IP 地址: 已记录   报告
   2011-05-24, 21:20 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 让人苦恼的UnicodeString问题
Reply Quote
为了节约宝贵的内核空间,通常用下面这样的声明把DriverEntry函数放在特殊的INIT段里:
#pragma alloc_text(INIT,DriverEntry)
INIT段在驱动初始化后会被丢弃...


IP 地址: 已记录   报告
   2011-05-24, 21:49 下午
WANGyu 离线,最后访问时间: 2012/9/10 3:34:00 王宇

发帖数前10位
男
注册: 2007-05-08
发 贴: 306
Re: 让人苦恼的UnicodeString问题
Reply Quote
嗯!^_^

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 下午
luobing4365 离线,最后访问时间: 2022/5/16 2:05:04 luobing

发帖数前50位
注册: 2009-10-06
发 贴: 19
Re: 让人苦恼的UnicodeString问题
Reply Quote
非常、非常感谢两位的指导。再调试了去看,确实如此。因此也添加了新的迷思,OS是在什么时候回收内存的呢,通过什么方式回收, windbg应该怎么下断才能看到这个过程?......无穷无尽的疑问啊,调试技术确实有趣^^ 我会自己去寻找这些答案的,再次感谢。
IP 地址: 已记录   报告
   2011-05-25, 11:59 上午
rong_bo 离线,最后访问时间: 2011/9/5 12:57:46 wrong

发帖数前10位
注册: 2011-01-07
发 贴: 66
Re: 让人苦恼的UnicodeString问题
Reply Quote
楼上想的好多啊。
IP 地址: 已记录   报告
   2011-05-26, 15:25 下午
WANGyu 离线,最后访问时间: 2012/9/10 3:34:00 王宇

发帖数前10位
男
注册: 2007-05-08
发 贴: 306
Re: 让人苦恼的UnicodeString问题
Reply Quote
很正常的想法啊,这不能算“想的好多”..

luobing 如想找答案请看 mm\mminit.c

看看 ( 跟踪 ) 函数 MiFindInitializationCode() 关于 DiscardSection = TRUE; 的处理,以及最终的 MiFreeInitializationCode() 等。
IP 地址: 已记录   报告
   2011-05-27, 09:10 上午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 让人苦恼的UnicodeString问题
Reply Quote
有道理,这个属于关键细节
IP 地址: 已记录   报告
高端调试 » 软件调试 » Windows内核调试 » Re: 让人苦恼的UnicodeString问题

 
Legal Notice Privacy Statement Corporate Governance Corporate Governance
(C)2004-2020 ADVDBG.ORG All Rights Reserved.