我按如下方式调用GetNamedSecurityInfo()
:
PSID pSID = NULL;
PSECURITY_DESCRIPTOR pSD = NULL;
// Retrieve the owner SID for the file
if(GetNamedSecurityInfo(TEXT("myfile.txt"),
SE_FILE_OBJECT,
OWNER_SECURITY_INFORMATION,
&pSID,
NULL, NULL, NULL,
&pSD) != ERROR_SUCCESS) {
/* error handling */
}
FreeSid(pSID);
LocalFree(pSD);
然而,当我运行应用程序时,它崩溃了。调试器报告:Critical error detected c0000374
并指向上面代码段末尾的LocalFree()
行。
为什么这条线会导致问题?根据{{1}}参数的文档:
"指向接收指向对象安全描述符的指针的变量的指针。使用完指针后,通过调用LocalFree函数释放返回的缓冲区。"
......这正是我所做的。
答案 0 :(得分:5)
pSID
本地var引用的SID是指pSD
引用的安全描述符中已存在的数据。它“拥有”那个SID,你拥有描述符引用。你只需要释放后者。
短版:删除FreeSid(pSID)
来电。