我可以从任意模块转储类型
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
-specific?发布于 2015-04-09 08:43:08
nt
是$ntsym
或$ntnsym
的调试器查找设置的自动别名。解释在WinDbg帮助“使用别名”(MSDN在线版本)中。您可以在需要别名的任何地方使用它。
假设您有一个脚本,它既可以在内核模式下工作,也可以在用户模式下工作。可以使用{nt}表示ntdll
、ntkrnlpa
、ntkrnlmp
、ntoskrnl
或ntwowxxxx
之一。
不仅内核模式下的ntdll
和ntXXXXX
具有这个自动别名,因为它们都有相同的功能等价代码。没有其他模块有像这两个模块那样的通用代码。例如,ntdll!NtCreateFile
有一个等价的nt!NtCreateFile
,其中前者是一个存根,通过syscall在后者中达到真正的实现。
您不能像任何地方一样使用nt
。例如,在用户模式下自动完成dt nt!_p
不会自动完成,但是dt ntdll!_p
将正确地自动完成。evaluate nt
,它将错误与无法评估,但评估? ntdll
将工作。
nt
是在dt
命令中特别解析的,它有一个函数为字符串分配一个适当的模块值,这样它就可以按原样在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并为其赋值。
发布于 2015-04-09 18:21:16
nt和ntdll是完全不同的模块。nt是一个内核模式模块,包含执行子系统和Windows内核(我们通常称之为“内核”)。ntdll是一个用户模式DLL,它提供了一些用户模式API来与内核进行接口。
dt命令显示来自给定模块的类型。在这种情况下,两个模块恰好包含相同的数据类型。就好像您和我都编写了使用相同数据结构的驱动程序一样,您可以将其从任何一个模块中转储出来,得到相同的结果。
至于为什么它们不能完全互换,你只能使用"dt nt!“窗体,如果您正在调试内核模式目标(活动或转储)。
正如其他人所指出的,"nt“很特殊,因为它是内核实名的别名。基于处理器架构和功能,该模块有不同的名称,因此别名允许我们在不知道确切名称的情况下引用该模块。唯一适用于此的其他模块是硬件抽象层( HAL),它具有不同的名称,但可以在调试器中使用简单的"hal“引用。
https://stackoverflow.com/questions/29526072
复制相似问题