我可以使用
从任意模块转储类型dt modulename!type
在某些情况下,我看到了例如。
dt nt!_TEB
(并且它可以工作)虽然该模块被称为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
之间是否存在差异?是否可以始终以快捷方式使用?我正在寻找一个可靠的答案来源,而不仅仅是“是”。
我试过了:
.hh dt
如果您有一些您想分享的背景知识,可以提出问题:
nt
代替ntdll
,还是dt
具体?答案 0 :(得分:5)
nt
是由$ntsym
或$ntnsym
的调试器查找设置的自动别名。解释是在WinDbg帮助“使用别名”(online version at MSDN)。您可以在需要别名时使用它。
假设您有一个在kernelmode和usermode中都有效的脚本。
您可以使用{nt}来表示ntdll
,ntkrnlpa
,ntkrnlmp
,ntoskrnl
或ntwowxxxx
。
内核模式中的ntdll
和ntXXXXX
不仅具有此自动别名,因为两者具有共同的功能等效代码。没有其他模块具有像这两个模块这样的通用代码。
例如,ntdll!NtCreateFile
具有等效的nt!NtCreateFile
前者是通过系统调用实现后者实际实现的存根。
你无法使用nt
,因为它无处不在
尝试在usermode中自动完成dt nt!_p
它不会自动完成但是
dt ntdll!_p
将正确填写
evaluate nt
它会因为无法评估而发生错误
评估? ntdll
将得到适当的评估
在dt命令中,nt是专门解析的,并且有一个函数可以为字符串分配一个合适的模块值,因此它可以在dt中使用,因为它是
解析nt的函数的伪代码是这样的事情
switch(GetToken(wcschr(inputstr ,"!")) == "nt" )
case usermode nt = "ntdll";
case kmode nt = "Nt" using machineinfo.NtModule (ntos .......)
case wow nt = "Nt32" using getnt32module()
如果你好奇地反汇编dbgeng并搜索其中包含字符串typedump的函数x dbgeng!*typedump*
,其中一个函数有一个解析字符串nt并为其赋值的子查询
答案 1 :(得分:1)
nt和ntdll是完全不同的模块。 nt是一个内核模式模块,它包含执行子系统和Windows内核(我们通常简称为#34;内核")。 ntdll是一个用户模式DLL,它提供了一些用户模式API,用于与内核进行交互。
dt命令显示给定模块的类型。在这种情况下,两个模块碰巧包含相同的数据类型。好像你和我都编写了使用相同数据结构的驱动程序,你可以从任一模块转储它并获得相同的结果。
至于他们为什么不能完全互换,你只能使用" dt nt!"如果您正在调试内核模式目标(实时或转储),请填写表单。
正如其他人所指出的那样," nt"它的特殊之处在于它是内核真实名称的别名。基于处理器体系结构和功能,此模块有不同的名称,因此别名允许我们在不知道确切名称的情况下引用模块。唯一适用的其他模块是硬件抽象层(HAL),它具有各种名称,但可以在调试器中简单地引用" hal"。