Windbg 如何获取流程中的关键部分列表

Windbg 如何获取流程中的关键部分列表,windbg,Windbg,在WinDbg中,您可以呼叫!锁定以获取当前进程中所有关键部分的列表。我想知道是否有方法调用调试引擎API来检索相同的列表。我想在一个C++内置的调试器中完成它,它是在调试引擎API上构建的。有什么想法吗 非常感谢。这相对来说比较困难,您需要使用名为RTL\u CRITICAL\u SECTION\u DEBUG的结构。我在打印输出中添加了注释: 0:011> dt ntdll!_RTL_CRITICAL_SECTION_DEBUG +0x000 Type :

在WinDbg中,您可以呼叫!锁定以获取当前进程中所有关键部分的列表。我想知道是否有方法调用调试引擎API来检索相同的列表。我想在一个C++内置的调试器中完成它,它是在调试引擎API上构建的。有什么想法吗


非常感谢。

这相对来说比较困难,您需要使用名为RTL\u CRITICAL\u SECTION\u DEBUG的结构。我在打印输出中添加了注释:

0:011> dt ntdll!_RTL_CRITICAL_SECTION_DEBUG
   +0x000 Type             : Uint2B
   +0x002 CreatorBackTraceIndex : Uint2B
   +0x004 CriticalSection  : Ptr32 _RTL_CRITICAL_SECTION  // This is pointer to actual critical section
   +0x008 ProcessLocksList : _LIST_ENTRY  // All critical sections are chained in this doubly linked list
   +0x010 EntryCount       : Uint4B
   +0x014 ContentionCount  : Uint4B
   +0x018 Flags            : Uint4B
   +0x01c CreatorBackTraceIndexHigh : Uint2B
   +0x01e SpareUSHORT      : Uint2B
如您所见,所有关键部分都属于相同的全局列表,其中一个关键部分的
ProcessLocksList
指向下一个关键部分(以及上一个关键部分)的
ProcessLocksList
。一旦知道所有
ProcessLocksList
s的地址,就可以通过从中减去sizeof(void*)来提取指向RTL\u CRITICAL\u节结构的指针

最后,ntdll给出了第一个
ProcessLocksList
条目的地址!RtlCriticalSectionList

下面的命令演示了我上面所说的内容。它将打印出流程中的所有关键部分:

  !list "-t ntdll!_LIST_ENTRY.Flink -e -x \"ln poi(@$extret-0x4); dt ntdll!_RTL_CRITICAL_SECTION poi(@$extret-0x4)\" ntdll!RtlCriticalSectionList"
如果需要,请对x64进行调整

按要求增加: 以下是x64的版本:

  !list "-t ntdll!_LIST_ENTRY.Flink -e -x \"ln poi(@$extret-0x8); dt ntdll!_RTL_CRITICAL_SECTION poi(@$extret-0x8)\" ntdll!RtlCriticalSectionList"

非常感谢。这很有帮助。您能同时提供64位版本吗?此外有没有方法直接检查C++程序中的“yrtRyMyLySeCuthOutUnbug”,它是由BGPrPult.dll和/或dgGun.dll?@ aWATTO - X64版本提供的帮助,现在被添加到答案中——它是从0x4到0x8的简单改变,以补偿指针类型的大小。@ AWATTO——回答您的第二个问题——RTLL临界段和RTL_CRITICAL_SECTION_调试结构在winnt.h中声明,因此从应用程序中使用这些结构应该没有问题。例如,如果您有一个指向critical section实例的指针,您可以将指针键入RTL_critical_section,然后使用field DebugInfo作为指向RTL_critical_section_调试结构的指针。如果您正在编写调试器,则需要从另一个方向--查找符号ntdll!RtlCriticalSectionList,然后从指针的值中生成8个字节的子结构(x64为16个字节)——这将是第一个RTL_CRITICAL_SECTION_调试结构的指针。通过使用RTL_critical_SECTION_DEBUG的ProcessLocksList字段,在循环中继续获取其余的关键部分。