typedef struct SYSTEM_HANDLE_TABLE_ENTRY_INFO
{
ULONG ProcessId;
BYTE ObjectTypeNumber;
BYTE Flags;
USHORT Handle;
PVOID Object;
ACCESS_MASK GrantedAccess;
} SYSTEM_HANDLE_TABLE_ENTRY_INFO, *PSYSTEM_HANDLE_TABLE_ENTRY_INFO;
我对C ++不是很有经验,但是从我学到的东西来看,我认为这意味着每当我声明类型为* PSYSTEM_HANDLE_TABLE_ENTRY_INFO的东西时,这意味着什么使得这个东西成为SYSTEM_HANDLE_TABLE_ENTRY_INFO类型的结构与变量如上所述。
我有一些问题:
为什么要让PSYSTEM_HANDLE_TABLE_ENTRY_INFO成为指针?
1.1。当我取消引用这个指针时,我能得到什么?我是否获得此结构的第一个元素的地址?如果我记得正确的结构元素连续存储在内存中,那不是吗?
您能举例说明如何在程序中使用它吗?换句话说,以下是否正确,如果不是,你会怎么做?
* PSYSTEM_HANDLE_TABLE_ENTRY_INFO var;
var.ProcessId = 1234;
typedef
。那么为什么声明结构SYSTEM_HANDLE_TABLE_ENTRY_INFO,为什么SYSTEM_HANDLE_TABLE_ENTRY_INFO在它的末尾呢?为什么有逗号?答案 0 :(得分:1)
这是typedef
语句的复杂用法。我们可以按照以下方式细分。
要占据大部分空间的第一部分是
struct SYSTEM_HANDLE_TABLE_ENTRY_INFO
{
ULONG ProcessId;
BYTE ObjectTypeNumber;
BYTE Flags;
USHORT Handle;
PVOID Object;
ACCESS_MASK GrantedAccess;
}
这声明了一个名为struct
的新struct SYSTEM_HANDLE_TABLE_ENTRY_INFO
类型。
在C中,struct
名称和常规类型名称不相同;如果你想使用struct
,你总是必须使用关键字struct
。¹然而,在任何地方输入这个额外的struct
会让人讨厌,所以你可以typedef
到常规类型名称。因此,我们在逗号之前有完整的陈述,
typedef struct SYSTEM_HANDLE_TABLE_ENTRY_INFO
{
ULONG ProcessId;
BYTE ObjectTypeNumber;
BYTE Flags;
USHORT Handle;
PVOID Object;
ACCESS_MASK GrantedAccess;
} SYSTEM_HANDLE_TABLE_ENTRY_INFO
仅此一项就可以让您从C程序中将类型称为struct SYSTEM_HANDLE_TABLE_ENTRY_INFO
或SYSTEM_HANDLE_TABLE_ENTRY_INFO
,就像从C ++程序中一样。
那最后一部分是什么? typedef
语句在很多方面类似于变量声明。特别是,您可以使用单个typedef
语句声明多个类型名称。让我们考虑一个更简单的例子,只是涉及int
类型的变量声明:
int i, *p;
这会在名为int
,和的i
中创建一个名为int
的指向int*
(p
)的指针。在此之前添加typedef
,您可以将i
用作int
的同义词,将p
用作int*
的同义词。
所以你的完整陈述,
typedef struct SYSTEM_HANDLE_TABLE_ENTRY_INFO
{
ULONG ProcessId;
BYTE ObjectTypeNumber;
BYTE Flags;
USHORT Handle;
PVOID Object;
ACCESS_MASK GrantedAccess;
} SYSTEM_HANDLE_TABLE_ENTRY_INFO, *PSYSTEM_HANDLE_TABLE_ENTRY_INFO;
做了三件事:
struct SYSTEM_HANDLE_TABLE_ENTRY_INFO
,其中包含您看到名为的成员。SYSTEM_HANDLE_TABLE_ENTRY_INFO
的类型别名struct SYSTEM_HANDLE_TABLE_ENTRY_INFO
,允许您在代码中使用任一名称。这对于C ++来说是不必要的,但对于C兼容性是必需的。PSYSTEM_HANDLE_TABLE_ENTRY_INFO
的类型别名struct SYSTEM_HANDLE_TABLE_ENTRY_INFO*
(指向struct SYSTEM_HANDLE_TABLE_ENTRY_INFO
的指针),允许您在需要指向此类型的指针时使用名称PSYSTEM_HANDLE_TABLE_ENTRY_INFO
struct
。¹这是在C ++中删除的,但由于C程序可能也想使用Windows API,因此它支持两种用法。