PSX: posixw32: some work for compatibility with future SM

svn path=/trunk/; revision=13504
This commit is contained in:
Emanuele Aliberti 2005-02-12 14:33:41 +00:00
parent feb76365e7
commit 68537ca04f
3 changed files with 68 additions and 37 deletions

View file

@ -1,4 +1,4 @@
# $Id: Makefile,v 1.4 2003/01/05 18:27:19 robd Exp $ # $Id$
# #
# Win32 Terminal Emulator for the POSIX+ subsystem. # Win32 Terminal Emulator for the POSIX+ subsystem.
# #
@ -15,7 +15,7 @@ TARGET_APPTYPE = console
TARGET_CFLAGS = -I$(PATH_TO_TOP_PSX)/include TARGET_CFLAGS = -I$(PATH_TO_TOP_PSX)/include
TARGET_SDKLIBS = ntdll.a kernel32.a TARGET_SDKLIBS = ntdll.a smdll.a kernel32.a
TARGET_OBJECTS = \ TARGET_OBJECTS = \
$(TARGET_NAME).o \ $(TARGET_NAME).o \

View file

@ -1,4 +1,4 @@
/* $Id: posixw32.c,v 1.4 2003/08/28 20:01:23 ea Exp $ /* $Id$
* *
* PROJECT : ReactOS Operating System / POSIX+ Environment Subsystem * PROJECT : ReactOS Operating System / POSIX+ Environment Subsystem
* DESCRIPTION: POSIXW32 - A DEC VT-100 terminal emulator for the PSX subsystem * DESCRIPTION: POSIXW32 - A DEC VT-100 terminal emulator for the PSX subsystem
@ -39,6 +39,7 @@
#define NTOS_MODE_USER #define NTOS_MODE_USER
#include <ntos.h> #include <ntos.h>
#include <sm/helper.h>
#include <psx/lpcproto.h> #include <psx/lpcproto.h>
#include "vt100.h" #include "vt100.h"
@ -53,7 +54,8 @@
#ifdef NDEBUG #ifdef NDEBUG
#define TRACE #define TRACE
#else #else
#define TRACE OutputDebugString(__FUNCTION__) //#define TRACE OutputDebugString(__FUNCTION__)
#define TRACE vtprintf("%s\n",__FUNCTION__)
#endif #endif
/*** GLOBALS *********************************************************/ /*** GLOBALS *********************************************************/
@ -347,7 +349,31 @@ TRACE;
} }
return Status; return Status;
} }
/**********************************************************************
* RunPsxSs/0
*
* DESCRIPTION
* This function is called only when initializing the session
* with PSXSS fails. We assume that it failed because the
* subsystem, being optional, is not running, therefore we
* ask the SM to start it up.
*/
PRIVATE NTSTATUS RunPsxSs(VOID)
{
NTSTATUS Status;
HANDLE SmApiPort;
UNICODE_STRING Program;
RtlInitUnicodeString (& Program, L"POSIX");
Status = SmConnectApiPort (NULL, 0, 0, & SmApiPort);
if(!NT_SUCCESS(Status))
{
return Status;
}
Status = SmExecuteProgram (SmApiPort, & Program);
NtClose (SmApiPort);
return Status;
}
/********************************************************************** /**********************************************************************
* CreateTerminalToPsxChannel/0 PRIVATE * CreateTerminalToPsxChannel/0 PRIVATE
* *
@ -360,6 +386,7 @@ PRIVATE NTSTATUS STDCALL CreateTerminalToPsxChannel (VOID)
ULONG ConnectDataLength = sizeof ConnectData; ULONG ConnectDataLength = sizeof ConnectData;
SECURITY_QUALITY_OF_SERVICE Sqos; SECURITY_QUALITY_OF_SERVICE Sqos;
NTSTATUS Status; NTSTATUS Status;
LONG Count = 2;
TRACE; TRACE;
@ -374,22 +401,32 @@ TRACE;
* Try connecting to \POSIX+\SessionPort. * Try connecting to \POSIX+\SessionPort.
*/ */
RtlInitUnicodeString (& Session.ServerPort.Name, Session.ServerPort.NameBuffer); RtlInitUnicodeString (& Session.ServerPort.Name, Session.ServerPort.NameBuffer);
OutputDebugStringW(Session.ServerPort.Name.Buffer); while (Count--)
Status = NtConnectPort (
& Session.ServerPort.Handle,
& Session.ServerPort.Name,
& Sqos,
NULL,
NULL,
0,
& ConnectData,
& ConnectDataLength
);
if (STATUS_SUCCESS != Status)
{ {
vtprintf ("%s: %s: NtConnectPort failed with %08x\n", OutputDebugStringW(Session.ServerPort.Name.Buffer);
MyName, __FUNCTION__, Status); Status = NtConnectPort (
return Status; & Session.ServerPort.Handle,
& Session.ServerPort.Name,
& Sqos,
NULL,
NULL,
0,
& ConnectData,
& ConnectDataLength
);
if (STATUS_SUCCESS != Status)
{
if(Count)
{
vtprintf("%s: %s: asking SM to start PSXSS...\n",MyName,__FUNCTION__);
RunPsxSs();
continue;
}
vtprintf ("%s: %s: NtConnectPort failed with %08x\n",
MyName, __FUNCTION__, Status);
return Status;
}
break;
} }
Session.Identifier = ConnectData.PortIdentifier; Session.Identifier = ConnectData.PortIdentifier;
return STATUS_SUCCESS; return STATUS_SUCCESS;
@ -399,9 +436,9 @@ TRACE;
* InitializeSsIoChannel PRIVATE * InitializeSsIoChannel PRIVATE
* *
* DESCRIPTION * DESCRIPTION
* Create our objects in the system name space * Connect to the session port (CreateControChannel) of the PSX
* (CreateSessionObjects) and then connect to the session port * subsystem. If that succeeds, create our objects in the system
* (CreateControChannel). * name space (CreateSessionObjects).
*/ */
PRIVATE NTSTATUS STDCALL InitializeSsIoChannel (VOID) PRIVATE NTSTATUS STDCALL InitializeSsIoChannel (VOID)
{ {
@ -411,13 +448,6 @@ PRIVATE NTSTATUS STDCALL InitializeSsIoChannel (VOID)
TRACE; TRACE;
Status = CreateSessionObjects (Pid);
if (STATUS_SUCCESS != Status)
{
vtprintf ("%s: %s: CreateSessionObjects failed with %08x\n",
MyName, __FUNCTION__, Status);
return Status;
}
Status = CreateTerminalToPsxChannel (); Status = CreateTerminalToPsxChannel ();
if (STATUS_SUCCESS != Status) if (STATUS_SUCCESS != Status)
{ {
@ -425,6 +455,13 @@ TRACE;
MyName, __FUNCTION__, Status); MyName, __FUNCTION__, Status);
return Status; return Status;
} }
Status = CreateSessionObjects (Pid);
if (STATUS_SUCCESS != Status)
{
vtprintf ("%s: %s: CreateSessionObjects failed with %08x\n",
MyName, __FUNCTION__, Status);
return Status;
}
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
/********************************************************************** /**********************************************************************

View file

@ -1,12 +1,6 @@
/* $Id: posixw32.rc,v 1.5 2004/10/31 20:11:09 ea Exp $ */ /* $Id$ */
#include <defines.h> #define REACTOS_STR_FILE_DESCRIPTION "W32 Terminal Emulator for POSIX+ LPC pseudo tty\0"
#include <reactos/resource.h>
#include <windows.h>
#define REACTOS_STR_FILE_DESCRIPTION "W32 Terminal Emulator for POSIX+\0"
#define REACTOS_STR_INTERNAL_NAME "posixw32\0" #define REACTOS_STR_INTERNAL_NAME "posixw32\0"
#define REACTOS_STR_ORIGINAL_FILENAME "posixw32.exe\0" #define REACTOS_STR_ORIGINAL_FILENAME "posixw32.exe\0"
#include <reactos/version.rc> #include <reactos/version.rc>
/* EOF */ /* EOF */