我的目标是理解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个字节的数组。ULONG
和BOOL
各为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::Reserved1
0的偏移量与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
一样。这就是类型投射指针的强度(和危险性(。