Author: mnordell Date: Fri Oct 12 16:04:50 2007 New Revision: 29533
URL: http://svn.reactos.org/svn/reactos?rev=29533&view=rev Log: Beginnings of enabling THREAD_SET_THREAD_TOKEN, to allow ROS to actually be shut down. Mostly skeleton and junk, but the basic infrastructure is at least in place.
Modified: trunk/reactos/base/system/winlogon/sas.c
Modified: trunk/reactos/base/system/winlogon/sas.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/winlogon/sas.c?... ============================================================================== --- trunk/reactos/base/system/winlogon/sas.c (original) +++ trunk/reactos/base/system/winlogon/sas.c Fri Oct 12 16:04:50 2007 @@ -312,14 +312,94 @@ return 1; }
+ +static NTSTATUS +CreateLogoffSecurityAttributes( + OUT PSECURITY_ATTRIBUTES* ppsa) +{ +#if 1 + DPRINT1("CreateSecurityAttributes needs implementation!\n"); + *ppsa = 0; + return STATUS_UNSUCCESSFUL; +#else + /* The following code is no only incomplete, it's a mess and uncompilable */ + /* Still, it gives some ideas about data types and functions involved and */ + /* required to set up a SECURITY_DESCRIPTOR for a SECURITY_ATTRIBUTES + /* instance for a thread, to allow that thread to ImpersonateLoggedOnUser(). */ + /* Specifically THREAD_SET_THREAD_TOKEN is required. */ + PSECURITY_DESCRIPTOR psd = 0; + PSECURITY_ATTRIBUTES psa = 0; + ACL rgAcls[2]; + EXPLICIT_ACCESS ea[2]; + + /* set up the required security attributes to be able to shut down */ + psd = HeapAlloc(GetProcessHeap(), 0, SECURITY_DESCRIPTOR_MIN_LENGTH); + psa = HeapAlloc(GetProcessHeap(), 0, sizeof(SECURITY_ATTRIBUTES)); + if (!psd || !psa) + { + DPRINT("Failed to allocate memory for a security descriptor!\n"); + return STATUS_NO_MEMORY; + } + + if (!InitializeSecurityDescriptor(psd, SECURITY_DESCRIPTOR_REVISION)) + { + HeapFree(GetProcessHeap(), 0, psd); + DPRINT("Failed to initialize security descriptor for logoff thread!\n"); + return STATUS_UNSUCCESSFUL; + } + + // Initialize an EXPLICIT_ACCESS structure for an ACE. + // The ACE will allow this thread to log off (and shut down the system, currently). + ZeroMemory(ea, sizeof(ea)); + ea[0].grfAccessPermissions = KEY_READ; + ea[0].grfAccessMode = SET_ACCESS; + ea[0].grfInheritance= NO_INHERITANCE; + ea[0].Trustee.TrusteeForm = TRUSTEE_IS_SID; + ea[0].Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP; + ea[0].Trustee.ptstrName = (LPTSTR) pEveryoneSID; + + if (!SetSecurityDescriptorDacl(pSD, + TRUE, // bDaclPresent flag + pACL, + FALSE)) // not a default DACL + { + DPRINT("SetSecurityDescriptorDacl Error %u\n", GetLastError()); + HeapFree(GetProcessHeap(), 0, psd); + return STATUS_UNSUCCESSFUL; + } + + psa->nLength = sizeof(sa); + psa->lpSecurityDescriptor = psd; + psa->bInheritHandle = FALSE; + + *ppsa = psa; + + return STATUS_SUCCESS; +#endif +} + +static void +DestroyLogoffSecurityAttributes( + IN PSECURITY_ATTRIBUTES psa) +{ + if (psa) + { + HeapFree(GetProcessHeap(), 0, psa->lpSecurityDescriptor); + HeapFree(GetProcessHeap(), 0, psa); + } +} + + static NTSTATUS HandleLogoff( IN OUT PWLSESSION Session, IN UINT Flags) { PLOGOFF_SHUTDOWN_DATA LSData; + PSECURITY_ATTRIBUTES psa; HANDLE hThread; DWORD exitCode; + NTSTATUS Status;
DisplayStatusMessage(Session, Session->WinlogonDesktop, IDS_SAVEYOURSETTINGS);
@@ -333,8 +413,26 @@ LSData->Flags = Flags; LSData->Session = Session;
+ Status = CreateLogoffSecurityAttributes(&psa); + if (!NT_SUCCESS(Status)) + { + DPRINT("Failed to create a required security descriptor. Error 0x%08x\n", Status); +#if 1 + DPRINT("Attempting to continue without it.\n"); +#else + DPRINT("Aborting logoff\n"); + HeapFree(GetProcessHeap(), 0, LSData); + return Status; +#endif + } + /* Run logoff thread */ - hThread = CreateThread(NULL, 0, LogoffShutdownThread, (LPVOID)LSData, 0, NULL); + hThread = CreateThread(psa, 0, LogoffShutdownThread, (LPVOID)LSData, 0, NULL); + + /* we're done with the SECURITY_DESCRIPTOR */ + DestroyLogoffSecurityAttributes(psa); + psa = NULL; + if (!hThread) { ERR("Unable to create logoff thread, error %lu\n", GetLastError());