解释SYSTEM_HANDLE_TABLE_ENTRY_INFO的定义以及如何使用它

时间:2017-07-18 21:51:37

标签: c winapi

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类型的结构与变量如上所述。

我有一些问题:

  1. 为什么要让PSYSTEM_HANDLE_TABLE_ENTRY_INFO成为指针?

    1.1。当我取消引用这个指针时,我能得到什么?我是否获得此结构的第一个元素的地址?如果我记得正确的结构元素连续存储在内存中,那不是吗?

  2. 您能举例说明如何在程序中使用它吗?换句话说,以下是否正确,如果不是,你会怎么做?

  3. * PSYSTEM_HANDLE_TABLE_ENTRY_INFO var; var.ProcessId = 1234;

    1. 根据我的学习,typedef的语法是 typedef 。那么为什么声明结构SYSTEM_HANDLE_TABLE_ENTRY_INFO,为什么SYSTEM_HANDLE_TABLE_ENTRY_INFO在它的末尾呢?为什么有逗号?
    2. 编辑:Downvoters,你能解释一下吗?我对建设性的批评持开放态度。

1 个答案:

答案 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_INFOSYSTEM_HANDLE_TABLE_ENTRY_INFO,就像从C ++程序中一样。

那最后一部分是什么? typedef语句在很多方面类似于变量声明。特别是,您可以使用单个typedef语句声明多个类型名称。让我们考虑一个更简单的例子,只是涉及int类型的变量声明:

int i, *p;

这会在名为inti中创建一个名为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;

做了三件事:

  1. 它会创建一个结构类型struct SYSTEM_HANDLE_TABLE_ENTRY_INFO,其中包含您看到名为的成员。
  2. 它创建了一个等同于SYSTEM_HANDLE_TABLE_ENTRY_INFO的类型别名struct SYSTEM_HANDLE_TABLE_ENTRY_INFO,允许您在代码中使用任一名称。这对于C ++来说是不必要的,但对于C兼容性是必需的。
  3. 它创建一个等同于PSYSTEM_HANDLE_TABLE_ENTRY_INFO的类型别名struct SYSTEM_HANDLE_TABLE_ENTRY_INFO*(指向struct SYSTEM_HANDLE_TABLE_ENTRY_INFO的指针),允许您在需要指向此类型的指针时使用名称PSYSTEM_HANDLE_TABLE_ENTRY_INFO struct
  4. ¹这是在C ++中删除的,但由于C程序可能也想使用Windows API,因此它支持两种用法。