WindowsXP-SP1/base/subsys/posix/psxss/coninit.c
2020-09-30 16:53:49 +02:00

324 lines
7.2 KiB
C

/*++
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 <windows.h>
#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;
}