/*++ Copyright (c) 1989 Microsoft Corporation Module Name: coninit.c Abstract: This module contains the code to initialize the Console Port of the POSIX Emulation Subsystem. Author: Avi Nathan (avin) 17-Jul-1991 Environment: User Mode Only Revision History: --*/ #include "psxsrv.h" #include #define NTPSX_ONLY #include "sesport.h" NTSTATUS PsxInitializeConsolePort( VOID ) { NTSTATUS Status; UNICODE_STRING PsxSessionDirectoryName_U; UNICODE_STRING PsxSessionPortName_U; OBJECT_ATTRIBUTES ObjectAttributes; CHAR cchSecurityDescriptor [SECURITY_DESCRIPTOR_MIN_LENGTH]; PSECURITY_DESCRIPTOR pSecurityDescriptor = (PSECURITY_DESCRIPTOR) cchSecurityDescriptor; BOOLEAN bAllocDirectoryName = FALSE; /* ** Create a directory in the object name space for the session port ** names */ PSX_GET_SESSION_OBJECT_NAME(&PsxSessionPortName_U,PSX_SS_SESSION_PORT_NAME); PSX_GET_CREATE_UNICODE_STRING_FROM_ASCIIZ(&PsxSessionDirectoryName_U,PSX_SES_BASE_PORT_NAME,bAllocDirectoryName); Status = (bAllocDirectoryName) ? STATUS_SUCCESS : STATUS_NO_MEMORY; if (NT_SUCCESS (Status)) { Status = PsxCreateDirectoryObject (&PsxSessionDirectoryName_U); } IF_PSX_DEBUG(LPC) { KdPrint(("PSXSS: Creating %wZ port and associated thread\n", &PsxSessionPortName_U )); } if (NT_SUCCESS (Status)) { Status = RtlCreateSecurityDescriptor (pSecurityDescriptor, SECURITY_DESCRIPTOR_REVISION); } if (NT_SUCCESS (Status)) { Status = RtlSetDaclSecurityDescriptor (pSecurityDescriptor, TRUE, NULL, FALSE); } if (NT_SUCCESS (Status)) { InitializeObjectAttributes (&ObjectAttributes, &PsxSessionPortName_U, 0, NULL, pSecurityDescriptor); Status = NtCreatePort (&PsxSessionPort, &ObjectAttributes, sizeof (PSXSESCONNECTINFO), sizeof (PSXSESREQUESTMSG), sizeof (PSXSESREQUESTMSG) * 32); } #if BOGUS_THREADS ASSERT(NT_SUCCESS(Status)); Status = RtlCreateUserThread (NtCurrentProcess(), NULL, TRUE, 0, 0, 0, PsxSessionRequestThread, NULL, &PsxSessionRequestThreadHandle, NULL); ASSERT(NT_SUCCESS(Status)); #else if (NT_SUCCESS (Status)) { DWORD Id; PsxSessionRequestThreadHandle = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)PsxSessionRequestThread, NULL, CREATE_SUSPENDED, &Id); } #endif /* ** BUGBUG: this guy is going to spin for quite a while until ** he does something */ if (NT_SUCCESS (Status)) { Status = NtResumeThread (PsxSessionRequestThreadHandle, NULL); } if (bAllocDirectoryName) RtlFreeUnicodeString (&PsxSessionDirectoryName_U); return Status; } NTSTATUS PsxCreateDirectoryObject( PUNICODE_STRING pUnicodeDirectoryName ) /*++ Routine Description This function is called to create a directory object of the specified name. It ensures that the object has the appropriate permissions, protections etc. Arguments: pUnicodeDirectoryName - the full path name of the directory to be created in a unicode format. Return Value: Status of operation. --*/ { NTSTATUS Status; HANDLE DirectoryHandle; OBJECT_ATTRIBUTES ObjectAttributes; CHAR cchSecurityDescriptor [SECURITY_DESCRIPTOR_MIN_LENGTH]; PSECURITY_DESCRIPTOR pSecurityDescriptor = (PSECURITY_DESCRIPTOR) cchSecurityDescriptor; PSID pSidAdmin, pSidSystem, pSidWorld; SID_IDENTIFIER_AUTHORITY AuthorityNt = SECURITY_NT_AUTHORITY, AuthorityWorld = SECURITY_WORLD_SID_AUTHORITY; ACCESS_MASK AccessMask = (DIRECTORY_ALL_ACCESS) & ~(WRITE_DAC | WRITE_OWNER | DELETE); ULONG cbDaclLength; PACL pDacl; PACE_HEADER Ace; BOOLEAN bAllocSidAdmin = FALSE, bAllocSidSystem = FALSE, bAllocSidWorld = FALSE, bAllocDacl = FALSE; Status = RtlCreateSecurityDescriptor (pSecurityDescriptor, SECURITY_DESCRIPTOR_REVISION); if (NT_SUCCESS (Status)) { Status = RtlAllocateAndInitializeSid (&AuthorityNt, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &pSidAdmin); bAllocSidAdmin = NT_SUCCESS (Status); } if (NT_SUCCESS (Status)) { Status = RtlAllocateAndInitializeSid (&AuthorityNt, 1, SECURITY_LOCAL_SYSTEM_RID, 0, 0, 0, 0, 0, 0, 0, &pSidSystem); bAllocSidSystem = NT_SUCCESS (Status); } if (NT_SUCCESS (Status)) { Status = RtlAllocateAndInitializeSid (&AuthorityWorld, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, &pSidWorld); bAllocSidWorld = NT_SUCCESS (Status); } if (NT_SUCCESS (Status)) { cbDaclLength = sizeof (ACL) + 3 * sizeof (ACCESS_ALLOWED_ACE) + RtlLengthSid (pSidAdmin) + RtlLengthSid (pSidSystem) + RtlLengthSid (pSidWorld); pDacl = RtlAllocateHeap (RtlProcessHeap(), 0, cbDaclLength); if (NULL == pDacl) { Status = STATUS_NO_MEMORY; } else { bAllocDacl = TRUE; } } /* ** Create the Dacl and then add the ACEs */ if (NT_SUCCESS(Status)) { Status = RtlCreateAcl (pDacl, cbDaclLength, ACL_REVISION); } if (NT_SUCCESS(Status)) { Status = RtlAddAccessAllowedAce (pDacl, ACL_REVISION, GENERIC_ALL, pSidAdmin); } if (NT_SUCCESS(Status)) { Status = RtlAddAccessAllowedAce (pDacl, ACL_REVISION, GENERIC_ALL, pSidSystem); } if (NT_SUCCESS(Status)) { Status = RtlAddAccessAllowedAce (pDacl, ACL_REVISION, AccessMask, pSidWorld); } /* ** Put the Dacl in the security descriptor */ if (NT_SUCCESS(Status)) { Status = RtlSetDaclSecurityDescriptor (pSecurityDescriptor, TRUE, pDacl, FALSE); } if (NT_SUCCESS (Status)) { if (NtCurrentPeb()->SessionId) { InitializeObjectAttributes (&ObjectAttributes, pUnicodeDirectoryName, 0, NULL, pSecurityDescriptor); }else{ InitializeObjectAttributes (&ObjectAttributes, pUnicodeDirectoryName, OBJ_PERMANENT, NULL, pSecurityDescriptor); } Status = NtCreateDirectoryObject (&DirectoryHandle, DIRECTORY_ALL_ACCESS, &ObjectAttributes); } if (bAllocDacl) RtlFreeHeap (RtlProcessHeap(), 0, pDacl); if (bAllocSidWorld) RtlFreeHeap (RtlProcessHeap(), 0, pSidWorld); if (bAllocSidSystem) RtlFreeHeap (RtlProcessHeap(), 0, pSidSystem); if (bAllocSidAdmin) RtlFreeHeap (RtlProcessHeap(), 0, pSidAdmin); return Status; }