我有一个这样的注册表项 ACL 读取请求:
PACL dacl = NULL;
PSECURITY_DESCRIPTOR secDesc = NULL;
if (GetNamedSecurityInfoW(L"HKEY_CURRENT_USER\\SOFTWARE\\SomeSoftware\\SomeKey", SE_REGISTRY_KEY, DACL_SECURITY_INFORMATION, NULL, NULL, &dacl, NULL, &secDesc) != ERROR_SUCCESS)
{ /*... */ }
它失败并出现错误 87,无效参数。但是,如果我使用
HKEY handle;
DWORD Ret = RegOpenKeyExW(HKEY_CURRENT_USER, L"SOFTWARE\\SomeSoftware\\SomeKey", 0, KEY_ALL_ACCESS, &handle);
if (Ret != ERROR_SUCCESS) { /* ... */ }
DWORD secDescSize = 4096;
secDesc = LocalAlloc(LMEM_FIXED, secDescSize);
Ret = (DWORD)RegGetKeySecurity(handle, DACL_SECURITY_INFORMATION, secDesc, &secDescSize);
if (Ret != ERROR_SUCCESS) { /* ... */ }
RegOpenKey()并RegGetKeySecurity()成功,并GetSecurityDescriptorDacl()在结果上运行RegGetKeySecurity()也可以。
此代码适用于SE_FILE_OBJECT和读取目录的 ACL。
此代码位于 64 位 Windows 10 Pro 的 32 位应用程序中的 32 位 DLL 中。我的目标是 XP 及更高版本,使用 Visual Studio 2019 Preview。
我在参数验证中可能遗漏了什么?