重新定义的Winapi结构与其原始状态的连接



我的目标是理解WinApi结构的重新定义。但我在任何地方都找不到任何文档、参考资料或手册。请解释一下,在下面的例子中,如何将结构重新定义为其原始形式。编译器是否理解重新定义的结构的名称并与PEB_LDR_DATA结构建立关系?

以下是原始的PEB_LDR_DATA结构:

typedef struct _PEB_LDR_DATA {
BYTE       Reserved1[8];
PVOID      Reserved2[3];
LIST_ENTRY InMemoryOrderModuleList;
} PEB_LDR_DATA, *PPEB_LDR_DATA;

这里是PEB_LDR_DATA重新定义的结构MY_PEB_LDR_DATA:

typedef struct _MY_PEB_LDR_DATA {
ULONG Length;
BOOL Initialized;
PVOID SsHandle;
LIST_ENTRY InLoadOrderModuleList;
LIST_ENTRY InMemoryOrderModuleList;
LIST_ENTRY InInitializationOrderModuleList;
} MY_PEB_LDR_DATA, * PMY_PEB_LDR_DATA;

请解释一下,如何将结构重新定义为其原始形式

在内存中,两个结构具有相同的布局,假设它们对各自的字段使用相同的数据对齐设置。

CCD_ 1是一个包含8个字节的数组。ULONGBOOL各为4个字节,因此MY_PEB_LDR_DATA::Length的偏移量与PEB_LDR_DATA::Reserved1[0]相同,而MY_PEB_LDR_DATA::Initialized的偏移量则与PEB_LDR_DATA::Reserved1[4]相同。

CCD_ 8是一个包含3个CCD_。PEB_LDR_DATA::Reserved10的偏移量与PEB_LDR_DATA::Reserved2[0]的偏移量相同。LIST_ENTRY是一个包含2个LIST_ENTRY*指针的结构体,因此MY_PEB_LDR_DATA::InLoadOrderModuleList::Flink的偏移量与PEB_LDR_DATA::Reserved2[1]相同,MY_PEB_LDR_DATA::InLoadOrderModuleList::Blink的偏移量则与PEB_LDR_DATA::Reserved2[2]相同。

从而使CCD_ 18的偏移量与CCD_。

对于其余的CCD_ 20和CCD_。

编译器是否理解重新定义的结构的名称并与PEB_LDR_DATA结构建立关系?

否。就编译器而言,它们是独立的、不同的类型,它们之间根本没有关系。但是,如果它们设置正确,然后给定一个指向内存块的指针,该内存块包含PEB_LDR_DATA,则可以键入强制转换该指针并访问数据,就好像内存包含MY_PEB_LDR_DATA一样。这就是类型投射指针的强度(和危险性(。

最新更新