我可以使用
dt modulename!type
在某些情况下,我看到例如。
dt nt!_TEB
(and它工作),尽管该模块被称为ntdll
:
0:001> lm m nt
start end module name
0:001> lm m ntdll
start end module name
00000000`76e00000 00000000`76fa9000 ntdll (pdb symbols) d:\...\ntdll.pdb
正如上面所看到的,ntdll
不能总是被nt
替换。dt nt!type
和dt ntdll!type
有区别吗?或者它总是可以用它的快捷方式吗?我在寻找一个可信的答案,不仅仅是“是”。
我试过:
- 阅读WinDbg帮助
.hh dt
如果您想分享一些背景知识,请回答以下附加问题:
- 是否有其他可以使用
nt
而不是ntdll
的命令,或者这是特定于dt
的命令? - 是否有其他模块具有快捷方式表单?
- 这是从哪里来的(例如,这种行为是否有一些历史背景)?
2条答案
按热度按时间3lxsmp7m1#
nt
是调试器查找为$ntsym
或$ntnsym
设置的自动别名。有关解释,请参阅WinDbg帮助“使用别名”(online version at MSDN)。您可以在需要该别名的任何地方使用它。假设您有一个在内核模式和用户模式下都能工作的脚本。您可以使用{nt}来表示
ntdll
、ntkrnlpa
、ntkrnlmp
、ntoskrnl
或ntwowxxxx
。不仅
ntdll
和ntXXXXX
在内核模式下有这个自动别名,因为两者都有功能上相同的代码。没有其他模块有像这两个模块一样的代码。例如,ntdll!NtCreateFile
有一个等效的nt!NtCreateFile
,前者是一个存根,通过syscall到达后者的真实的实现。你不能像在任何地方一样使用
nt
。例如,在用户模式下自动完成dt nt!_p
不会自动完成,但dt ntdll!_p
会正确地自动完成。evaluate nt
会错误地显示 cannot evaluate,但对? ntdll
求值会起作用。nt
在dt
命令中被专门解析,并具有为字符串分配适当模块值的功能,以便可以按原样在dt
中使用。解析nt的函数的伪代码如下所示:
如果您对分解dbgeng感兴趣,可以搜索其中包含字符串typedump的函数,即
x dbgeng!*typedump*
,其中一个函数有一个子调用,该子调用解析字符串nt并为其赋值。bnlyeluc2#
nt和ntdll是完全不同的模块。nt是一个内核模式模块,包含执行子系统和Windows内核(我们通常简称此映像为“内核”)。ntdll是一个用户模式DLL,提供一些用户模式API以与内核交互。
dt命令显示给定模块的类型。在这种情况下,两个模块恰好包含相同的数据类型。这就好像你和我都编写了使用相同数据结构的驱动程序,你可以从任何一个模块转储它,并得到相同的结果。
至于为什么它们不能完全互换,如果您正在调试内核模式目标(live或dump),则只能使用“dt nt!”形式。
正如其他人所指出的,“nt”的特殊之处在于它是内核真实的名称的别名。基于处理器架构和特性,该模块有不同的名称,因此别名使我们在不知道确切名称的情况下引用该模块。唯一适用于该模块的是硬件抽象层(HAL),它有各种各样的名称,但在调试器中可以简单地用“hal”来引用。