我发现函数ConvertStringSecurityDescriptorToSecurityDescriptor()
阻止我的程序正常结束。即使我拨打ExitProcess(0)
,我的程序也会在后台保持打开状态。如果我删除此功能,程序将正常结束。
在调试器的帮助下,我发现这个函数创建了一个在此函数结束后保持打开的新线程。
如何强制此函数正常运行并关闭它打开的所有线程?
我的代码:
int main() {
PSECURITY_DESCRIPTOR d;
// program has 1 thread
ConvertStringSecurityDescriptorToSecurityDescriptorW(L".....", SDDL_REVISION_1, &d, NULL);
// program has 2 threads
return 0; // still running in background after this
}
答案 0 :(得分:1)
您将d
定义为PSECURITY_DESCRIPTOR
而不是SECURITY_DESCRIPTOR
,因此代码将指针指针传递给SECURITY_DESCRIPTOR
,而不是只是指向一个指针 - SECURITY_DESCRIPTOR
。这会搞砸内存,可能是导致死机的原因。
查看示例Creating a DACL。它在堆栈上分配SECURITY_DESCRIPTOR
,并在调用nLength
之前初始化字段bInheritHandle
和ConvertStringSecurityDescriptorToSecurityDescriptor
。此外,应LocalFree
而不是d.lpSecurityDescriptor
调用d
。