windows-nt/Source/XPSP1/NT/base/subsys/posix/psxss/apiinit.c
2020-09-26 16:20:57 +08:00

152 lines
3.4 KiB
C

/*++
Copyright (c) 1989 Microsoft Corporation
Module Name:
apiinit.c
Abstract:
This module contains the code to initialize the ApiPort of the POSIX
Emulation Subsystem.
Author:
Steve Wood (stevewo) 22-Aug-1989
Environment:
User Mode Only
Revision History:
Ellen Aycock-Wright (ellena) 15-Jul-91 Modified for POSIX
--*/
#include "psxsrv.h"
#include "sesport.h"
#include <ntcsrdll.h>
#include <windef.h>
#include <winbase.h>
NTSTATUS
PsxApiPortInitialize( VOID )
{
NTSTATUS Status;
OBJECT_ATTRIBUTES ObjectAttributes;
ULONG i;
CHAR buf[SECURITY_DESCRIPTOR_MIN_LENGTH];
PSECURITY_DESCRIPTOR securityDescriptor;
PSX_GET_SESSION_OBJECT_NAME(&PsxApiPortName, PSX_SS_API_PORT_NAME);
securityDescriptor = (PSECURITY_DESCRIPTOR)buf;
Status = RtlCreateSecurityDescriptor(securityDescriptor,
SECURITY_DESCRIPTOR_REVISION);
ASSERT(NT_SUCCESS(Status));
Status = RtlSetDaclSecurityDescriptor(securityDescriptor, TRUE,
NULL, FALSE);
InitializeObjectAttributes(&ObjectAttributes, &PsxApiPortName, 0,
NULL, securityDescriptor);
IF_PSX_DEBUG(INIT) {
KdPrint(("PSXSS: Creating %wZ port and associated threads\n",
&PsxApiPortName));
}
Status = NtCreatePort(&PsxApiPort, &ObjectAttributes,
sizeof(PSX_API_CONNECTINFO), sizeof(PSX_API_MSG),
4096 * 16);
ASSERT(NT_SUCCESS(Status));
if (!NT_SUCCESS(Status)) {
NtTerminateProcess(NtCurrentProcess(), 1);
}
for (i = 0; i < PsxNumberApiRequestThreads; i++) {
PsxServerThreadHandles[i + PSX_SS_FIRST_API_REQUEST_THREAD] =
CreateThread(NULL, (DWORD)0,
(LPTHREAD_START_ROUTINE)PsxApiRequestThread,
NULL, CREATE_SUSPENDED,
(LPDWORD)&PsxServerThreadClientIds[i +
PSX_SS_FIRST_API_REQUEST_THREAD]);
if (NULL == PsxServerThreadHandles[i +
PSX_SS_FIRST_API_REQUEST_THREAD]) {
NtTerminateProcess(NtCurrentProcess(), 1);
}
}
for (i = 0; i < PsxNumberApiRequestThreads; i++) {
Status = ResumeThread(PsxServerThreadHandles[i +
PSX_SS_FIRST_API_REQUEST_THREAD]);
if (-1 == Status) {
NtTerminateProcess(NtCurrentProcess(), 1);
}
}
//
// Create the Alarm-handling thread here, 'cuz there's no better
// place. See timer.c for AlarmThreadRoutine.
//
{
ULONG ThreadId;
AlarmThreadHandle = CreateThread(NULL, (DWORD)0,
(LPTHREAD_START_ROUTINE)AlarmThreadRoutine, NULL,
CREATE_SUSPENDED, &ThreadId);
if (NULL == AlarmThreadHandle) {
NtTerminateProcess(NtCurrentProcess(), 1);
return STATUS_INSUFFICIENT_RESOURCES;
}
Status = ResumeThread(AlarmThreadHandle);
}
return Status;
}
#if 0
//
// This thread is here solely to allow NTSD -p to attach to the Posix subsystem
// process to debug it. It is required because all of the other thread in the
// Posix subsystem server are waiting non-alertable in an LPC system servive.
//
NTSTATUS
PsxDebugAttachThread (
IN PVOID Parameter
)
{
LARGE_INTEGER TimeOut;
NTSTATUS Status;
// CsrIdentifyAlertableThread(); // So the debugger can interrupt us
while (TRUE) {
//
// Delay alertable for the longest possible integer relative to now.
//
TimeOut.LowPart = 0x0;
TimeOut.HighPart = 0x80000000;
Status = NtDelayExecution( TRUE, &TimeOut );
//
// Do this forever, so the debugger can attach whenever it wants.
//
}
return 0;
}
#endif