2013-07-06 2 views
2

Я обнаружил, что функция ConvertStringSecurityDescriptorToSecurityDescriptor() мешает моей программе закончить правильно. Даже если я звоню ExitProcess(0), моя программа остается открытой в фоновом режиме. Если я удалю эту функцию, программа закончится правильно.ConvertStringSecurityDescriptorToSecurityDescriptor() не позволяет моей программе закончить правильно

С помощью отладчика я обнаружил, что эта функция создает новый поток, который остается открытым после завершения этой функции.

Как заставить эту функцию правильно вести себя и закрыть все потоки, которые она открывает?

Мой код:

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 
} 
+1

Вы пытались вызвать 'LocalFree' на' d', чтобы освободить буфер? ([на MSDN] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa376401%28v=vs.85%29.aspx)) – Mgetz

+0

Да, я пробовал это, это didn Помогите. Он просто освобождает буфер, но не закрывает поток. – Peter

+0

И да, я забыл упомянуть, что эта ошибка возникает только тогда, когда я не использую CRT в своей программе (когда у меня есть пользовательская точка входа). – Peter

ответ

1

Вы определили d быть PSECURITY_DESCRIPTOR вместо SECURITY_DESCRIPTOR, поэтому код пропусканием а-указатель указатель на на SECURITY_DESCRIPTOR, а не просто указатель на -a- SECURITY_DESCRIPTOR. Это испортит память и, вероятно, станет причиной зависания.

Посмотрите на пример Creating a DACL. Он выделяет SECURITY_DESCRIPTOR в стеке и инициализирует поля nLength и bInheritHandle перед вызовом ConvertStringSecurityDescriptorToSecurityDescriptor. Кроме того, LocalFree следует называть d.lpSecurityDescriptor, а не d.

Смежные вопросы