#include <ntos.h>\r
#include "smss.h"\r
\r
-/* Private ADT */\r
+#define NDEBUG\r
+#include <debug.h>\r
\r
-typedef struct _SM_CLIENT_DATA\r
-{\r
- USHORT SubsystemId;\r
- BOOL Initialized;\r
- HANDLE ServerProcess;\r
- HANDLE ApiPort;\r
- HANDLE SbApiPort;\r
- struct _SM_CLIENT_DATA * Next;\r
- \r
-} SM_CLIENT_DATA, *PSM_CLIENT_DATA;\r
+/* Private ADT */\r
\r
\r
struct _SM_CLIENT_DIRECTORY\r
NTSTATUS\r
SmInitializeClientManagement (VOID)\r
{\r
+ DPRINT("SM: %s called\n", __FUNCTION__);\r
RtlInitializeCriticalSection(& SmpClientDirectory.Lock);\r
SmpClientDirectory.Count = 0;\r
SmpClientDirectory.Client = NULL;\r
/**********************************************************************\r
* SmpLookupClient/1\r
*/\r
-PSM_CLIENT_DATA STDCALL\r
+static PSM_CLIENT_DATA STDCALL\r
SmpLookupClient (USHORT SubsystemId)\r
{\r
PSM_CLIENT_DATA Client = NULL;\r
\r
+ DPRINT("SM: %s called\n", __FUNCTION__);\r
+\r
+ RtlEnterCriticalSection (& SmpClientDirectory.Lock);\r
if (SmpClientDirectory.Count > 0)\r
{\r
- RtlEnterCriticalSection (& SmpClientDirectory.Lock);\r
Client = SmpClientDirectory.Client;\r
- while (NULL != Client->Next)\r
+ while (NULL != Client)\r
{\r
if (SubsystemId == Client->SubsystemId) break;\r
Client = Client->Next;\r
}\r
- RtlLeaveCriticalSection (& SmpClientDirectory.Lock);\r
}\r
+ RtlLeaveCriticalSection (& SmpClientDirectory.Lock);\r
return Client;\r
}\r
\r
* SmpCreateClient/1\r
*/\r
NTSTATUS STDCALL\r
-SmpCreateClient(SM_PORT_MESSAGE Request)\r
+SmCreateClient(PSM_PORT_MESSAGE Request, PSM_CLIENT_DATA * ClientData)\r
{\r
PSM_CLIENT_DATA pClient = NULL;\r
+ PSM_CONNECT_DATA ConnectData = (PSM_CONNECT_DATA) ((PBYTE) Request) + sizeof (LPC_REQUEST);\r
+\r
+ DPRINT("SM: %s called\n", __FUNCTION__);\r
\r
/*\r
* Check if a client for the ID already exist.\r
*/\r
- if (SmpLookupClient(0)) //FIXME\r
+ if (SmpLookupClient(ConnectData->Subsystem))\r
{\r
DbgPrint("SMSS: %s: attempt to register again subsystem %d.\n",__FUNCTION__,0);\r
return STATUS_UNSUCCESSFUL;\r
pClient = RtlAllocateHeap (SmpHeap,\r
HEAP_ZERO_MEMORY,\r
sizeof (SM_CLIENT_DATA));\r
- if (NULL == pClient) return STATUS_NO_MEMORY;\r
+ if (NULL == pClient)\r
+ {\r
+ DPRINT("SM: %s: out of memory!\n",__FUNCTION__);\r
+ return STATUS_NO_MEMORY;\r
+ }\r
/*\r
* Initialize the client data\r
*/\r
-// pClient->SubsystemId = Request->Subsystem;\r
+ pClient->SubsystemId = ConnectData->Subsystem;\r
pClient->Initialized = FALSE;\r
// TODO\r
/*\r
pCD = pCD->Next);\r
pCD->Next = pClient;\r
}\r
+ pClient->Next = NULL;\r
++ SmpClientDirectory.Count;\r
RtlLeaveCriticalSection (& SmpClientDirectory.Lock);\r
+ if (ClientData) *ClientData = pClient;\r
return STATUS_SUCCESS;\r
}\r
\r
* SmpDestroyClient/1\r
*/\r
NTSTATUS STDCALL\r
-SmpDestroyClient (ULONG SubsystemId)\r
+SmDestroyClient (ULONG SubsystemId)\r
{\r
+ DPRINT("SM: %s called\n", __FUNCTION__);\r
+\r
RtlEnterCriticalSection (& SmpClientDirectory.Lock);\r
/* TODO */\r
RtlLeaveCriticalSection (& SmpClientDirectory.Lock);\r
};
NTSTATUS
-InitSessionManager(HANDLE Children[])
+InitSessionManager(VOID)
{
int i;
NTSTATUS Status;
/* $Id$
*
- * Reactos Session Manager
+ * smapi.c - \SmApiPort LPC port message management
*
+ * Reactos Session Manager
*
*/
-/*#include <ddk/ntddk.h>
-#include <ntdll/rtl.h>*/
-#define NTOS_MODE_USER
-#include <ntos.h>
-#include <sm/api.h>
-#include <rosrtl/string.h>
#include "smss.h"
+#include <rosrtl/string.h>
#define NDEBUG
+#include <debug.h>
/* GLOBAL VARIABLES *********************************************************/
SMAPI(SmInvalid)
{
- DbgPrint("SMSS: %s called\n",__FUNCTION__);
+ DPRINT("SM: %s called\n",__FUNCTION__);
Request->Status = STATUS_NOT_IMPLEMENTED;
return STATUS_SUCCESS;
}
SMAPI(SmCompSes)
{
- DbgPrint("SMSS: %s called\n",__FUNCTION__);
+ DPRINT("SM: %s called\n",__FUNCTION__);
Request->Status = STATUS_NOT_IMPLEMENTED;
return STATUS_SUCCESS;
}
SMAPI(SmExecPgm)
{
- DbgPrint("SMSS: %s called\n",__FUNCTION__);
+ DPRINT("SM: %s called\n",__FUNCTION__);
Request->Status = STATUS_NOT_IMPLEMENTED;
return STATUS_SUCCESS;
}
NTSTATUS STDCALL
SmpHandleConnectionRequest (HANDLE Port, PSM_PORT_MESSAGE Request)
{
- DbgPrint("SMSS: %s called\n",__FUNCTION__);
- return STATUS_SUCCESS;
+ NTSTATUS Status = STATUS_SUCCESS;
+ PSM_CLIENT_DATA ClientData = NULL;
+ PVOID Context = NULL;
+
+ DPRINT("SM: %s called\n",__FUNCTION__);
+
+ Status = SmCreateClient (Request, & ClientData);
+ if(STATUS_SUCCESS == Status)
+ {
+#ifdef __USE_NT_LPC__
+ Status = NtAcceptConnectPort (& ClientData->ApiPort,
+ Context,
+ SmApiPort,
+ TRUE, //accept
+ NULL,
+ NULL);
+#else
+ Status = NtAcceptConnectPort (& ClientData->ApiPort,
+ Context,
+ (PLPC_MESSAGE) Request,
+ TRUE, //accept
+ NULL,
+ NULL);
+#endif
+ if(NT_SUCCESS(Status))
+ {
+ Status = NtCompleteConnectPort(ClientData->ApiPort);
+ }
+ return STATUS_SUCCESS;
+ } else {
+ /* Reject the subsystem */
+#ifdef __USE_NT_LPC__
+ Status = NtAcceptConnectPort (& ClientData->ApiPort,
+ Context,
+ SmApiPort,
+ FALSE, //reject
+ NULL,
+ NULL);
+#else
+ Status = NtAcceptConnectPort (& ClientData->ApiPort,
+ Context,
+ (PLPC_MESSAGE) Request,
+ FALSE, //reject
+ NULL,
+ NULL);
+#endif
+ }
+ return Status;
}
/**********************************************************************
SmpApiThread(HANDLE Port)
{
NTSTATUS Status = STATUS_SUCCESS;
- ULONG Unknown = 0;
+ PVOID Unknown = NULL;
PLPC_MESSAGE Reply = NULL;
SM_PORT_MESSAGE Request = {{0}};
- DbgPrint("SMSS: %s running.\n",__FUNCTION__);
+ DPRINT("SM: %s running\n",__FUNCTION__);
while (TRUE)
{
- DbgPrint("SMSS: %s: waiting for message\n",__FUNCTION__);
+ DPRINT("SM: %s: waiting for message\n",__FUNCTION__);
Status = NtReplyWaitReceivePort(Port,
- & Unknown,
+ (PULONG) & Unknown,
Reply,
(PLPC_MESSAGE) & Request);
if (NT_SUCCESS(Status))
{
- DbgPrint("SMSS: %s: message received\n",__FUNCTION__);
+ DPRINT("SM: %s: message received (type=%d)\n",
+ __FUNCTION__,
+ PORT_MESSAGE_TYPE(Request));
switch (Request.Header.MessageType)
{
{
NTSTATUS Status;
- Status = InitSessionManager(Children);
+ Status = InitSessionManager();
if (!NT_SUCCESS(Status))
{
int i;
#define NTOS_MODE_USER
#include <ntos.h>
#include <sm/api.h>
+#include <sm/helper.h>
#define CHILD_CSRSS 0
#define CHILD_WINLOGON 1
/* init.c */
-extern HANDLE SmpHeap;
-NTSTATUS InitSessionManager(HANDLE Children[]);
+NTSTATUS InitSessionManager(VOID);
/* initheap.c */
+extern HANDLE SmpHeap;
NTSTATUS SmCreateHeap(VOID);
/* initenv.c */
VOID STDCALL SmpApiThread(HANDLE Port);
/* client.c */
+typedef struct _SM_CLIENT_DATA
+{
+ USHORT SubsystemId;
+ BOOL Initialized;
+ HANDLE ServerProcess;
+ HANDLE ApiPort;
+ HANDLE SbApiPort;
+ WCHAR SbApiPortName [SM_SB_NAME_MAX_LENGTH];
+ struct _SM_CLIENT_DATA * Next;
+
+} SM_CLIENT_DATA, *PSM_CLIENT_DATA;
NTSTATUS SmInitializeClientManagement(VOID);
-NTSTATUS STDCALL SmpCreateClient(SM_PORT_MESSAGE);
-NTSTATUS STDCALL SmpDestroyClient(ULONG);
+NTSTATUS STDCALL SmCreateClient(PSM_PORT_MESSAGE,PSM_CLIENT_DATA*);
+NTSTATUS STDCALL SmDestroyClient(ULONG);
/* debug.c */
extern HANDLE DbgSsApiPort;