/*++
Copyright (c) 1989 Microsoft Corporation
Module Name:
os2srv.c
Abstract:
This is the main startup module for the OS/2 Emulation Subsystem Server
Author:
Steve Wood (stevewo) 22-Aug-1989
Environment:
User Mode Only
Revision History:
--*/
#include "os2srv.h"
static WCHAR Os2InitName[] = L"\\REGISTRY\\MACHINE\\SOFTWARE\\Microsoft\\OS/2 Subsystem for NT\\1.0\\os2.ini";
void __cdecl
main(
IN ULONG argc,
IN PCH argv[],
IN PCH envp[],
IN ULONG DebugFlag OPTIONAL
)
{
OBJECT_ATTRIBUTES ObjectAttributes;
UNICODE_STRING DirectoryName_U;
UNICODE_STRING Os2Init_U;
HANDLE Os2IniKeyHandle;
CHAR localSecurityDescriptor[SECURITY_DESCRIPTOR_MIN_LENGTH];
PSECURITY_DESCRIPTOR securityDescriptor;
NTSTATUS Status;
#if PMNT
extern VOID Os2SbProbeForInitialSetup(VOID);
#endif
UNREFERENCED_PARAMETER(argc);
UNREFERENCED_PARAMETER(argv);
UNREFERENCED_PARAMETER(envp);
UNREFERENCED_PARAMETER(DebugFlag);
#ifdef PMNT
//
// Check out if this is the first time after system setup that the OS/2 SS
// has been run. If so, do the necessary privileged initialization of the
// registry for the OS/2 SS
//
// Note -- This code has been moved to WINLOGON. It's only duplicated here
// (in an older and outdated version) so PMNT can be based on NT build 438.
//
//
Os2SbProbeForInitialSetup();
#endif
//
// Create a root directory in the object name space that will be used
// to contain all of the named objects created by the OS/2 Emulation
// subsystem.
//
RtlInitUnicodeString( &DirectoryName_U, OS2_SS_ROOT_OBJECT_DIRECTORY );
Status = RtlCreateSecurityDescriptor( (PSECURITY_DESCRIPTOR)
&localSecurityDescriptor,
SECURITY_DESCRIPTOR_REVISION );
ASSERT( NT_SUCCESS( Status ) );
Status = RtlSetDaclSecurityDescriptor( (PSECURITY_DESCRIPTOR)
&localSecurityDescriptor,
TRUE,
(PACL) NULL,
FALSE );
securityDescriptor = (PSECURITY_DESCRIPTOR) &localSecurityDescriptor;
InitializeObjectAttributes(
&ObjectAttributes,
&DirectoryName_U,
OBJ_PERMANENT | OBJ_CASE_INSENSITIVE,
NULL,
securityDescriptor
);
Status = NtCreateDirectoryObject( &Os2RootDirectory,
DIRECTORY_ALL_ACCESS,
&ObjectAttributes
);
ASSERT( NT_SUCCESS( Status ) );
if (!NT_SUCCESS( Status )) {
#if DBG
KdPrint(( "OS2SRV: Unable to initialize server. Status == %X\n",
Status
));
#endif
}
//
// Reset OS2.INI key security descriptor (winlogon sets it to admin only)
//
RtlInitUnicodeString( &Os2Init_U, Os2InitName );
InitializeObjectAttributes(
&ObjectAttributes,
&Os2Init_U,
OBJ_CASE_INSENSITIVE,
NULL,
NULL
);
Status = NtOpenKey(&Os2IniKeyHandle,
KEY_ALL_ACCESS,
&ObjectAttributes
);
if (!NT_SUCCESS(Status)) {
#if DBG
KdPrint(("Os2ss: Can't open os2.ini key, rc = %lx\n", Status));
#endif
}
Status = NtSetSecurityObject(Os2IniKeyHandle,
DACL_SECURITY_INFORMATION,
securityDescriptor
);
if (!NT_SUCCESS(Status)) {
#if DBG
KdPrint(("Os2ss: Can't set security on os2.ini key, rc = %lx\n", Status));
#endif
}
//
// Initialize the OS2 Server Session Manager API Port, the listen thread
// one request thread.
//
Status = Os2SbApiPortInitialize();
ASSERT( NT_SUCCESS( Status ) );
//
// Connect to the session manager so we can start foreign sessions
//
Status = SmConnectToSm( &Os2SbApiPortName_U,
Os2SbApiPort,
IMAGE_SUBSYSTEM_OS2_CUI,
&Os2SmApiPort
);
ASSERT( NT_SUCCESS( Status ) );
NtTerminateThread( NtCurrentThread(), STATUS_SUCCESS);
}