RtlCreateAcl 函数 (ntifs.h)
RtlCreateAcl 例程创建和初始化访问控制列表(ACL)。
语法
NTSYSAPI NTSTATUS RtlCreateAcl(
[out] PACL Acl,
[in] ULONG AclLength,
ULONG AclRevision
);
参数
[out] Acl
指向调用方分配的缓冲区的指针,用于接收初始化的 ACL 结构。 此缓冲区必须至少 sizeof(ACL),
[in] AclLength
Acl 参数指向的缓冲区的长度(以字节为单位)。 此值必须足够大,才能包含 ACL 标头以及要存储在 ACL 中的所有访问控制条目(ACE)。 有关计算 ACL 大小的信息,请参阅以下“备注”部分。
AclRevision
要添加的 ACE 的 ACL 修订级别。 Windows 版本要求如下:
价值 | 意义 |
---|---|
|
在所有 Windows 版本上有效的修订级别。 |
|
请注意,如果 Acl Acl 中的 ACL 包含特定于对象的 ACE,则必须ACL_REVISION_DS AceRevision。
|
返回值
RtlCreateAcl 可以返回以下状态值之一:
返回代码 | 描述 |
---|---|
|
ACL 已成功创建和初始化。 |
|
新的 ACL 不适用于 Acl的缓冲区。 需要更大的 ACL 缓冲区。 |
|
指定的修订不是最新的,或者 AclLength 的值太大。 |
言论
由 RtlCreateAcl 初始化的 ACL 不包含访问控制条目(ACE)。 此 ACL 为空,而不是不存在的 ACL。 如果对对象应用了空 ACL,ACL 将隐式拒绝对该对象的所有访问。 若要将 ACL 添加到 ACL,请使用 RtlAddAccessAllowedAce。
若要计算 ACL 的大小,请将 sizeof(ACL) 添加到 ACL 中存储的所有 ACE 的大小。 若要计算 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 的大小,请使用以下算法,在 sizeof(ACE) 表达式中替换适当的 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;
}
有关安全和访问控制的详细信息,请参阅适用于驱动程序开发人员 Windows 安全模型,以及有关 Windows SDK 中这些主题的文档。
要求
要求 | 价值 |
---|---|
目标平台 | 普遍 |
标头 | ntifs.h (include Ntifs.h) |
库 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= APC_LEVEL |