mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
165 lines
4.3 KiB
165 lines
4.3 KiB
/*++
|
|
|
|
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);
|
|
}
|