关于LDR_MODULE结构

      在上一篇随笔"进程环境块PEB笔记"中,我们提到了PEB_LDR_DATA内含有三个双向链表成员(LIST_ENTRY类型),然而根据LIST_ENTRY类型的定义,它只有两个分别指向前一个和后一个LIST_ENTRY结构的指针成员,那么又是怎么得到LDR_MODULE结构的信息的呢?
      其实弄清楚LDR_MODULE结构的详细定义这些疑问也就会迎刃而解了. 
ContractedBlock.gif ExpandedBlockStart.gif Code
 1 typedef struct _LDR_MODULE {
 2 
 3   LIST_ENTRY              InLoadOrderModuleList;
 4   LIST_ENTRY              InMemoryOrderModuleList;
 5   LIST_ENTRY              InInitializationOrderModuleList;
 6   PVOID                   BaseAddress;
 7   PVOID                   EntryPoint;
 8   ULONG                   SizeOfImage;
 9   UNICODE_STRING          FullDllName;
10   UNICODE_STRING          BaseDllName;
11   ULONG                   Flags;
12   SHORT                   LoadCount;
13   SHORT                   TlsIndex;
14   LIST_ENTRY              HashTableEntry;
15   ULONG                   TimeDateStamp;
16 
17 } LDR_MODULE, *PLDR_MODULE;
18 

      其相关成员的描述如下:
InLoadOrderModuleList:
      Pointers to previous and next LDR_MODULE in load order.
InMemoryOrderModuleList:
      Pointers to previous and next LDR_MODULE in memory placement order.
InInitializationOrderModuleList:
      Pointers to previous and next LDR_MODULE in initialization order.
BaseAddress:
     Module Base address known also as HMODULE.
     可以用以下图例来说明此结构:
      
关于LDR_MODULE结构_第1张图片   
      由该图可知,三个链表结构被PEB_LDR_DATA和LDR_MODULE结构共用. 知道了这些,再看上文给出的获取kernel32.dll模块加载地址的代码就很明了了.  

转载于:https://www.cnblogs.com/cmleung/archive/2009/09/18/1568978.html

你可能感兴趣的:(关于LDR_MODULE结构)