RtlCreateAcl 函数 (ntifs.h)

RtlCreateAcl 例程创建并初始化 ACL (访问控制) 。

语法

NTSYSAPI NTSTATUS RtlCreateAcl(
  [out] PACL  Acl,
  [in]  ULONG AclLength,
        ULONG AclRevision
);

参数

[out] Acl

指向调用方分配的缓冲区的指针,用于接收初始化的 ACL 结构。 此缓冲区必须至少是 ACL ( 的大小) ,

[in] AclLength

Acl 参数指向的缓冲区的长度(以 字节 为单位)。 此值必须足够大,以包含 ACL 标头以及要存储在 ACL (ACE) 的所有访问控制条目。 有关计算 ACL 大小的信息,请参阅以下"备注"部分。

AclRevision

要添加的 ACE 的 ACL 修订级别。 Windows版本要求如下:

含义
ACL_REVISION

修订级别在所有版本Windows有效。

ACL_REVISION_DS
NoteAceRevision ACL_REVISION_DS Acl 中的 ACL 包含特定于对象的 ACE 时,

返回值

RtlCreateAcl 可以返回以下状态值之一:

返回代码 说明
STATUS_SUCCESS
ACL 已成功创建和初始化。
STATUS_BUFFER_TOO_SMALL
新 ACL 不适合位于 Acl 的缓冲区 。 需要更大的 ACL 缓冲区。
STATUS_INVALID_PARAMETER
指定的修订版本不是最新的,或者 AclLength 的值太大。

注解

RtlCreateAcl 初始化的 ACL 不包含 ACE (访问控制) 。 此 ACL 为空,而不是不存在的 ACL。 如果将空 ACL 应用于对象,ACL 将隐式拒绝对该对象的所有访问。 若要将 ACE 添加到 ACL,请使用 RtlAddAccessAllowedAce

若要计算 ACL 的大小, (ACL) ACL 的大小添加到 ACL 中存储的所有 AES 的大小。 若要计算 ACE 的大小,将 ACE 结构的大小(如 sizeof (ACCESS_ALLOWED_ACE) )添加到与 ACE 关联的 SID 的长度,然后减去 SidStart 成员 (该大小是 ACE 结构和 SID) 的一部分。 使用 RtlLengthSid 函数获取指定 SID 的长度。

以下示例演示如何计算允许访问的 ACE 的大小:

sizeof (ACCESS_ALLOWED_ACE) - sizeof (ACCESS_ALLOWED_ACE.SidStart) 
        + GetLengthSid (pAceSid);

若要计算 ACL 的大小,请使用以下算法,在 ACE 表达式的 sizeof 中 (ACE) 结构:

cbAcl = sizeof (ACL);
for (i = 0 ; i < nAceCount ; i++) {
    // subtract ACE.SidStart from the size
    cbAce = sizeof (ACE) - sizeof (DWORD);
    // add this ACE's SID length
    cbAce += GetLengthSid (pAceSid[i]);
    // add the length of each ACE to the total ACL length
    cbAcl += cbAce;
}

有关安全性和访问控制详细信息,请参阅平台软件开发工具包 (SDK) 中有关这些主题的文档。

要求

   
目标平台 通用
标头 ntifs.h (包括 Ntifs.h)
Library NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= APC_LEVEL

请参阅

ACCESS_ALLOWED_ACE

ACE

ACL

RtlAddAccessAllowedAce

RtlLengthSid

SID