ea(a)reactos.com
- make SmExecuteProgram work
- implement SmCompleteSession (untested)
Modified: trunk/reactos/subsys/smss/client.c
Modified: trunk/reactos/subsys/smss/initss.c
Modified: trunk/reactos/subsys/smss/smapi.c
Modified: trunk/reactos/subsys/smss/smapicomp.c
Modified: trunk/reactos/subsys/smss/smapiexec.c
Modified: trunk/reactos/subsys/smss/smss.c
Modified: trunk/reactos/subsys/smss/smss.h
_____
Modified: trunk/reactos/subsys/smss/client.c
--- trunk/reactos/subsys/smss/client.c 2005-03-13 17:00:19 UTC (rev
14015)
+++ trunk/reactos/subsys/smss/client.c 2005-03-13 17:01:59 UTC (rev
14016)
@@ -42,40 +42,7 @@
} SmpClientDirectory;
-#if 0
/**********************************************************************
- * SmpRegisterSmss/0
- */
-static NTSTATUS
-SmpRegisterSmss(VOID)
-{
- NTSTATUS Status = STATUS_SUCCESS;
- UNICODE_STRING SbApiPortName = {0,0,NULL};
- HANDLE hSmApiPort = (HANDLE) 0;
-
- DPRINT("SM: %s called\n",__FUNCTION__);
-
- Status = SmConnectApiPort(& SbApiPortName,
- (HANDLE) -1,
- IMAGE_SUBSYSTEM_NATIVE,
- & hSmApiPort);
- if(!NT_SUCCESS(Status))
- {
- DPRINT("SM: %s: SMDLL!SmConnectApiPort failed
(Status=0x%08lx)\n",__FUNCTION__,Status);
- return Status;
- }
- Status = SmCompleteSession (hSmApiPort, (HANDLE)0, hSmApiPort);
- if(!NT_SUCCESS(Status))
- {
- DPRINT("SM: %s: SMDLL!SmCompleteSession failed
(Status=0x%08lx)\n",__FUNCTION__,Status);
- return Status;
- }
- NtClose(hSmApiPort);
- return Status;
-}
-#endif
-
-/**********************************************************************
* SmInitializeClientManagement/0
*/
NTSTATUS
@@ -85,18 +52,48 @@
RtlInitializeCriticalSection(& SmpClientDirectory.Lock);
SmpClientDirectory.Count = 0;
SmpClientDirectory.Client = NULL;
-#if 0
- /* Register IMAGE_SUBSYSTE_NATIVE to be managed by SM */
- return SmpRegisterSmss();
-#endif
return STATUS_SUCCESS;
}
/**********************************************************************
- * SmpLookupClient/1
+ * SmCompleteClientInitialization/1
*
* DESCRIPTION
+ * Lookup the subsystem server descriptor given the process handle
+ * of the subsystem server process.
+ */
+NTSTATUS STDCALL
+SmCompleteClientInitialization (HANDLE hProcess)
+{
+ NTSTATUS Status = STATUS_SUCCESS;
+ PSM_CLIENT_DATA Client = NULL;
+
+ DPRINT("SM: %s called\n", __FUNCTION__);
+
+ RtlEnterCriticalSection (& SmpClientDirectory.Lock);
+ if (SmpClientDirectory.Count > 0)
+ {
+ Client = SmpClientDirectory.Client;
+ while (NULL != Client)
+ {
+ if (hProcess == Client->ServerProcess)
+ {
+ Client->Initialized = TRUE;
+ break;
+ }
+ Client = Client->Next;
+ }
+ Status = STATUS_NOT_FOUND;
+ }
+ RtlLeaveCriticalSection (& SmpClientDirectory.Lock);
+ return Status;
+}
+
+/**********************************************************************
+ * SmpLookupClient/1 PRIVATE
+ *
+ * DESCRIPTION
* Lookup the subsystem server descriptor given its image ID.
*
* SIDE EFFECTS
@@ -148,7 +145,7 @@
*/
if (SmpLookupClient(ConnectData->Subsystem))
{
- DPRINT("SMSS: %s: attempt to register again subsystem
%d.\n",
+ DPRINT("SM: %s: attempt to register again subsystem
%d.\n",
__FUNCTION__,
ConnectData->Subsystem);
return STATUS_UNSUCCESSFUL;
_____
Modified: trunk/reactos/subsys/smss/initss.c
--- trunk/reactos/subsys/smss/initss.c 2005-03-13 17:00:19 UTC (rev
14015)
+++ trunk/reactos/subsys/smss/initss.c 2005-03-13 17:01:59 UTC (rev
14016)
@@ -53,7 +53,43 @@
*/
/**********************************************************************
+ * SmpRegisterSmss/0
+ *
+ * DESCRIPTION
+ * Make smss register with itself for IMAGE_SUBSYSTEM_NATIVE
+ * (programmatically). This also open hSmApiPort to be used
+ * in loading required subsystems.
*/
+#if 0
+static NTSTATUS
+SmpRegisterSmss(VOID)
+{
+ NTSTATUS Status = STATUS_SUCCESS;
+ UNICODE_STRING SbApiPortName = {0,0,NULL};
+
+ DPRINT("SM: %s called\n",__FUNCTION__);
+
+ Status = SmConnectApiPort(& SbApiPortName,
+ (HANDLE) 0,
+ IMAGE_SUBSYSTEM_NATIVE,
+ & hSmApiPort);
+ if(!NT_SUCCESS(Status))
+ {
+ DPRINT("SM: %s: SMDLL!SmConnectApiPort failed
(Status=0x%08lx)\n",
+ __FUNCTION__,Status);
+ return Status;
+ }
+ /*
+ * Note that you don't need to call complete session
+ * because connection handling code autocompletes
+ * the client structure for IMAGE_SUBSYSTEM_NATIVE.
+ */
+ return Status;
+}
+#endif
+
+/**********************************************************************
+ */
NTSTATUS
SmLoadSubsystems(VOID)
{
@@ -65,7 +101,15 @@
DPRINT("SM: loading subsystems\n");
-
+
+ /* SM self registers */
+#if 0
+ Status = SmpRegisterSmss();
+ if(!NT_SUCCESS(Status))
+ {
+ DPRINT1("SM: SM failed to self register: system is not
secure!\n");
+ }
+#endif
/* Load Kmode subsystem (aka win32k.sys) */
Status = SmLookupSubsystem (L"Kmode",
Data,
@@ -91,6 +135,13 @@
}
}
/* TODO: load Required subsystems (Debug Windows) */
+#if 0
+ Status = SmExecuteProgram(L"DEBUG");
+ if(!NT_SUCCESS(Status))
+ {
+ DPRINT1("SM: DBSS failed to initialize!\n");
+ }
+#endif
return Status;
}
_____
Modified: trunk/reactos/subsys/smss/smapi.c
--- trunk/reactos/subsys/smss/smapi.c 2005-03-13 17:00:19 UTC (rev
14015)
+++ trunk/reactos/subsys/smss/smapi.c 2005-03-13 17:01:59 UTC (rev
14016)
@@ -51,20 +51,22 @@
* Entry point for the listener thread of LPC port "\SmApiPort".
*/
VOID STDCALL
-SmpApiConnectedThread(PVOID dummy)
+SmpApiConnectedThread(PVOID pConnectedPort)
{
NTSTATUS Status = STATUS_SUCCESS;
PVOID Unknown = NULL;
PLPC_MESSAGE Reply = NULL;
SM_PORT_MESSAGE Request = {{0}};
+ HANDLE ConnectedPort = * (PHANDLE) pConnectedPort;
- DPRINT("SM: %s running\n",__FUNCTION__);
+ DPRINT("SM: %s(%08lx) running\n", __FUNCTION__, pConnectedPort);
+ DPRINT("SM: %s(%08lx): ConnectedPort = %08lx\n", __FUNCTION__,
pConnectedPort, ConnectedPort);
while (TRUE)
{
DPRINT("SM: %s: waiting for message\n",__FUNCTION__);
- Status = NtReplyWaitReceivePort(SmApiPort,
+ Status = NtReplyWaitReceivePort(ConnectedPort,
(PULONG) & Unknown,
Reply,
(PLPC_MESSAGE) &
Request);
@@ -98,8 +100,13 @@
Reply = (PLPC_MESSAGE) &
Request;
}
}
+ } else {
+ /* LPC failed */
+ break;
}
}
+ NtClose (ConnectedPort);
+ NtTerminateThread (NtCurrentThread(), Status);
}
/**********************************************************************
@@ -115,75 +122,91 @@
NTSTATUS STDCALL
SmpHandleConnectionRequest (PSM_PORT_MESSAGE Request)
{
-#if defined(__USE_NT_LPC__)
+ PSM_CONNECT_DATA ConnectData = (PSM_CONNECT_DATA) ((PBYTE)
Request) + sizeof (LPC_REQUEST);
NTSTATUS Status = STATUS_SUCCESS;
+ BOOL Accept = FALSE;
PSM_CLIENT_DATA ClientData = NULL;
+ HANDLE hClientDataApiPort = (HANDLE) 0;
+ PHANDLE ClientDataApiPort = & hClientDataApiPort;
+ HANDLE hClientDataApiPortThread = (HANDLE) 0;
+ PHANDLE ClientDataApiPortThread = &
hClientDataApiPortThread;
PVOID Context = NULL;
- DPRINT("SM: %s called\n",__FUNCTION__);
+ DPRINT("SM: %s called\n", __FUNCTION__);
- /*
- * SmCreateClient/2 is called here explicitly to *fail*.
- * If it succeeds, there is something wrong in the
- * connection request. An environment subsystem *never*
- * registers twice. (Security issue: maybe we will
- * write this event into the security log).
- */
- Status = SmCreateClient (Request, & ClientData);
- if(STATUS_SUCCESS == Status)
+ if(sizeof (SM_CONNECT_DATA) == Request->Header.DataSize)
{
- /* OK: the client is an environment subsystem
- * willing to manage a free image type.
- * Accept it.
- */
- Status = NtAcceptConnectPort (& ClientData->ApiPort,
- Context,
- (PLPC_MESSAGE) Request,
- TRUE, //accept
- NULL,
- NULL);
- if(NT_SUCCESS(Status))
+ if(IMAGE_SUBSYSTEM_UNKNOWN == ConnectData->Subsystem)
{
- Status =
NtCompleteConnectPort(ClientData->ApiPort);
+ /*
+ * This is not a call from an environment server
+ * willing to register, but from any other
process
+ * that will use the SM API.
+ */
+ DPRINT("SM: %s: req from NON subsys server
process\n", __FUNCTION__);
+ ClientDataApiPort = & hClientDataApiPort;
+ ClientDataApiPortThread = &
hClientDataApiPortThread;
+ Accept = TRUE;
+ } else {
+ DPRINT("SM: %s: req from subsys server
process\n", __FUNCTION__);
+ /*
+ * SmCreateClient/2 is called here explicitly to
*fail*.
+ * If it succeeds, there is something wrong in
the
+ * connection request. An environment subsystem
*never*
+ * registers twice. (Security issue: maybe we
will
+ * write this event into the security log).
+ */
+ Status = SmCreateClient (Request, & ClientData);
+ if(STATUS_SUCCESS == Status)
+ {
+ /* OK: the client is an environment
subsystem
+ * willing to manage a free image type.
+ */
+ ClientDataApiPort = &
ClientData->ApiPort;
+ ClientDataApiPortThread = &
ClientData->ApiPortThread;
+ /*
+ * Reject GUIs: only odd subsystem IDs
are
+ * allowed to register here.
+ */
+ Accept = (1 == (ConnectData->Subsystem %
2));
+ }
}
- return STATUS_SUCCESS;
- } else {
- /* Reject the subsystem */
- Status = NtAcceptConnectPort (& ClientData->ApiPort,
- Context,
- (PLPC_MESSAGE) Request,
- FALSE, //reject
- NULL,
- NULL);
}
+#if defined(__USE_NT_LPC__)
+ Status = NtAcceptConnectPort (ClientDataApiPort,
+ Context,
+ (PLPC_MESSAGE) Request,
+ Accept,
+ NULL,
+ NULL);
#else /* ReactOS LPC */
- NTSTATUS Status = STATUS_SUCCESS;
- PSM_CLIENT_DATA ClientData = NULL;
-
- DPRINT("SM: %s called\n",__FUNCTION__);
-
- Status = SmCreateClient (Request, & ClientData);
- if(STATUS_SUCCESS == Status)
+ Status = NtAcceptConnectPort (ClientDataApiPort,
+ SmApiPort, // ROS LPC requires the
listen port here
+ Context,
+ Accept,
+ NULL,
+ NULL);
+#endif
+ DPRINT("SM: %s: ClientDataPort=0x%08lx\n", __FUNCTION__,
ClientDataApiPort);
+ DPRINT("SM: %s: *ClientDataPort=0x%08lx\n", __FUNCTION__,
*ClientDataApiPort);
+ if(Accept)
{
- Status = NtAcceptConnectPort (& ClientData->ApiPort,
- SmApiPort,
- NULL,
- TRUE, //accept
- NULL,
- NULL);
- if (!NT_SUCCESS(Status))
+ if(!NT_SUCCESS(Status))
{
DPRINT1("SM: %s: NtAcceptConnectPort() failed
(Status=0x%08lx)\n",
- __FUNCTION__, Status);
+ __FUNCTION__, Status);
return Status;
} else {
- Status =
NtCompleteConnectPort(ClientData->ApiPort);
+ DPRINT("SM: %s: completing conn req\n",
__FUNCTION__);
+ Status = NtCompleteConnectPort
(*ClientDataApiPort);
if (!NT_SUCCESS(Status))
{
DPRINT1("SM: %s: NtCompleteConnectPort()
failed (Status=0x%08lx)\n",
__FUNCTION__, Status);
return Status;
}
+#if !defined(__USE_NT_LPC__) /* ReactOS LPC */
+ DPRINT("SM: %s: server side comm port thread
(ROS LPC)\n", __FUNCTION__);
Status = RtlCreateUserThread(NtCurrentProcess(),
NULL,
FALSE,
@@ -191,8 +214,8 @@
NULL,
NULL,
(PTHREAD_START_ROUTINE)
SmpApiConnectedThread,
- ClientData->ApiPort,
- &
ClientData->ApiPortThread,
+ ClientDataApiPort,
+ ClientDataApiPortThread,
NULL);
if (!NT_SUCCESS(Status))
{
@@ -200,18 +223,11 @@
__FUNCTION__, Status);
return Status;
}
+#endif
}
- return STATUS_SUCCESS;
- } else {
- /* Reject the subsystem */
- Status = NtAcceptConnectPort (& ClientData->ApiPort,
- SmApiPort,
- NULL,
- FALSE, //reject
- NULL,
- NULL);
+ Status = STATUS_SUCCESS;
}
-#endif /* defined __USE_NT_LPC__ */
+ DPRINT("SM: %s done\n", __FUNCTION__);
return Status;
}
_____
Modified: trunk/reactos/subsys/smss/smapicomp.c
--- trunk/reactos/subsys/smss/smapicomp.c 2005-03-13 17:00:19 UTC
(rev 14015)
+++ trunk/reactos/subsys/smss/smapicomp.c 2005-03-13 17:01:59 UTC
(rev 14016)
@@ -4,10 +4,26 @@
*
* Reactos Session Manager
*
+ * --------------------------------------------------------------------
+ *
+ * This software is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this software; see the file COPYING.LIB. If not, write
+ * to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
+ * MA 02139, USA.
+ *
+ * --------------------------------------------------------------------
*/
-
#include "smss.h"
-#include <rosrtl/string.h>
#define NDEBUG
#include <debug.h>
@@ -18,9 +34,19 @@
*/
SMAPI(SmCompSes)
{
- DPRINT("SM: %s called\n",__FUNCTION__);
- Request->Status = STATUS_NOT_IMPLEMENTED;
- return STATUS_SUCCESS;
+ NTSTATUS Status = STATUS_SUCCESS;
+
+ DPRINT("SM: %s called from [%lx|%lx]\n",
+ __FUNCTION__,
+ Request->ClientId.UniqueProcessId,
+ Request->ClientId.UniqueThreadId);
+
+ Status = SmCompleteClientInitialization
(Request->Header.ClientId.UniqueProcess);
+ if(!NT_SUCCESS(Status))
+ {
+ Request->Status = STATUS_UNSUCCESSFUL;
+ }
+ return Status;
}
_____
Modified: trunk/reactos/subsys/smss/smapiexec.c
--- trunk/reactos/subsys/smss/smapiexec.c 2005-03-13 17:00:19 UTC
(rev 14015)
+++ trunk/reactos/subsys/smss/smapiexec.c 2005-03-13 17:01:59 UTC
(rev 14016)
@@ -285,18 +285,23 @@
}
else
{
- WCHAR ImagePath [1024] = {0};
- ULONG ImagePathLength = sizeof ImagePath;
- ULONG ImagePathType = REG_EXPAND_SZ;
+ WCHAR Data [MAX_PATH + 1] = {0};
+ ULONG DataLength = sizeof Data;
+ ULONG DataType = REG_EXPAND_SZ;
/* Lookup Name in the registry */
Status = SmLookupSubsystem (Name,
- ImagePath,
- & ImagePathLength,
- & ImagePathType,
+ Data,
+ & DataLength,
+ & DataType,
TRUE); /* expand */
if(NT_SUCCESS(Status))
{
+ WCHAR ImagePath [MAX_PATH + 1] = {0};
+
+ wcscpy (ImagePath, L"\\??\\");
+ wcscat (ImagePath, Data);
+
/* Create native process */
Request->Status =
SmCreateUserProcess(ImagePath,
L"", /* FIXME */
_____
Modified: trunk/reactos/subsys/smss/smss.c
--- trunk/reactos/subsys/smss/smss.c 2005-03-13 17:00:19 UTC (rev
14015)
+++ trunk/reactos/subsys/smss/smss.c 2005-03-13 17:01:59 UTC (rev
14016)
@@ -40,7 +40,6 @@
NTSTATUS Status;
PROCESS_BASIC_INFORMATION PBI = {0};
- DisplayString(L"SMSS\n");
PrintString("ReactOS Session Manager %s (Build %s)\n",
KERNEL_RELEASE_STR,
KERNEL_VERSION_BUILD_STR);
_____
Modified: trunk/reactos/subsys/smss/smss.h
--- trunk/reactos/subsys/smss/smss.h 2005-03-13 17:00:19 UTC (rev
14015)
+++ trunk/reactos/subsys/smss/smss.h 2005-03-13 17:01:59 UTC (rev
14016)
@@ -91,9 +91,9 @@
} SM_CLIENT_DATA, *PSM_CLIENT_DATA;
NTSTATUS SmInitializeClientManagement(VOID);
-NTSTATUS SmpRegisterSmss(VOID);
NTSTATUS STDCALL SmCreateClient(PSM_PORT_MESSAGE,PSM_CLIENT_DATA*);
NTSTATUS STDCALL SmDestroyClient(ULONG);
+NTSTATUS STDCALL SmCompleteClientInitialization (HANDLE hProcess);
/* debug.c */
extern HANDLE DbgSsApiPort;