typedef struct _TOKEN_PRIVILEGES { 
  DWORD PrivilegeCount; 
  LUID_AND_ATTRIBUTES Privileges[]; 
} TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES; 
这个定义是系统的,大概很多人都认识它。其中Privileges的长度是任意的,我咋一看,很不习惯,开始还以为是错误的呢。请厉害的给我讲讲啊。这个变长是怎么实现的。

解决方案 »

  1.   

    转载:typedef struct _TOKEN_PRIVILEGES { DWORD PrivilegeCount ; LUID_AND_ATTRIBUTES Privileges []; } TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES; 
    PrivilegeCount 指的数组原素的个数,接着是一个 LUID_AND_ATTRIBUTES 类型的数组,再来看一下 LUID_AND_ATTRIBUTES 这个结构的内容,声明如下: typedef struct _LUID_AND_ATTRIBUTES { LUID Luid ; DWORD Attributes ; 
    } LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES 第二个参数就指明了我们要进行的操作类型,有三个可选项: SE_PRIVILEGE_ENABLED 、 SE_PRIVILEGE_ENABLED_BY_DEFAULT 、 SE_PRIVILEGE_USED_FOR_ACCESS 。要使能一个权限就指定 Attributes 为 SE_PRIVILEGE_ENABLED 。第一个参数就是指权限的类型,是一个 LUID 的 值, LUID 就是指 locally unique identifier ,我想 GUID 大家是比较熟 悉的,和 GUID 的要求保证全局唯一不同, LUID 只要保证局部唯一,就是 指在系统的每一次运行期间保证是唯一的就可以了。另外和 GUID 相同的 一点, LUID 也是一个 64 位的值,相信大家都看过 GUID 那一大串的值。