SM: initial work on SM_API_QUERY_INFORMATION (client side; ROS
specific).
SM: fixed connection data in callback SM->subsystem_server during ss
registration
Modified: trunk/reactos/include/sm/api.h
Modified: trunk/reactos/include/sm/helper.h
Modified: trunk/reactos/lib/smdll/query.c
Modified: trunk/reactos/lib/smdll/smdll.def
Deleted: trunk/reactos/lib/smdll/testapi.c
Modified: trunk/reactos/lib/smlib/compses.c
Modified: trunk/reactos/lib/smlib/connect.c
Modified: trunk/reactos/lib/smlib/execpgm.c
Modified: trunk/reactos/subsys/smss/client.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/smapiquery.c
_____
Modified: trunk/reactos/include/sm/api.h
--- trunk/reactos/include/sm/api.h 2005-04-10 17:03:40 UTC (rev
14580)
+++ trunk/reactos/include/sm/api.h 2005-04-10 19:08:23 UTC (rev
14581)
@@ -12,15 +12,16 @@
#pragma pack(push,4)
-/* SmConnectApiPort */
+/* SmConnectApiPort (SS->SM) */
typedef struct _SM_CONNECT_DATA
{
- ULONG Subsystem;
+ USHORT SubSystemId;
+ WORD Unused;
WCHAR SbName [SM_SB_NAME_MAX_LENGTH];
} SM_CONNECT_DATA, *PSM_CONNECT_DATA;
-/* SmpConnectSbApiPort */
+/* SmpConnectSbApiPort (SM->SS) */
typedef struct _SB_CONNECT_DATA
{
ULONG SmApiMax;
@@ -65,6 +66,47 @@
} SM_PORT_MESSAGE_EXECPGM, *PSM_PORT_MESSAGE_EXECPGM;
+/*** 5
****************************************************************/
+
+#define SM_API_QUERY_INFORMATION 5 /* ask SM to send back
some data */
+ /* Note: this is not in
NT */
+#define SM_QRYINFO_MAX_SS_COUNT 8
+#define SM_QRYINFO_MAX_ROOT_NODE 30
+
+typedef enum {
+ SmBasicInformation = 0,
+ SmSubSystemInformation = 1,
+} SM_INFORMATION_CLASS;
+
+typedef struct _SM_BASIC_INFORMATION
+{
+ USHORT SubSystemCount;
+ WORD Unused;
+ struct {
+ WORD Id;
+ WORD Flags;
+ DWORD ProcessId;
+ } SubSystem [SM_QRYINFO_MAX_SS_COUNT];
+} SM_BASIC_INFORMATION, *PSM_BASIC_INFORMATION;
+
+typedef struct _SM_SUBSYSTEM_INFORMATION
+{
+ WORD SubSystemId;
+ WORD Flags;
+ DWORD ProcessId;
+ WCHAR NameSpaceRootNode [SM_QRYINFO_MAX_ROOT_NODE];
+} SM_SUBSYSTEM_INFORMATION, *PSM_SUBSYSTEM_INFORMATION;
+
+typedef struct _SM_PORT_MESSAGE_QRYINFO
+{
+ SM_INFORMATION_CLASS SmInformationClass;
+ ULONG DataLength;
+ union {
+ SM_BASIC_INFORMATION BasicInformation;
+ SM_SUBSYSTEM_INFORMATION SubSystemInformation;
+ };
+} SM_PORT_MESSAGE_QRYINFO, * PSM_PORT_MESSAGE_QRYINFO;
+
/*** |
****************************************************************/
typedef struct _SM_PORT_MESSAGE
@@ -72,12 +114,22 @@
/*** LPC common header ***/
LPC_MESSAGE Header;
/*** SM common header ***/
- DWORD ApiIndex;
- NTSTATUS Status;
+ struct {
+ DWORD ApiIndex;
+ NTSTATUS Status;
+ } SmHeader;
/*** SM per API arguments ***/
union {
- SM_PORT_MESSAGE_COMPSES CompSes;
- SM_PORT_MESSAGE_EXECPGM ExecPgm;
+ union {
+ SM_PORT_MESSAGE_COMPSES CompSes;
+ SM_PORT_MESSAGE_EXECPGM ExecPgm;
+ SM_PORT_MESSAGE_QRYINFO QryInfo;
+ } Request;
+ union {
+ SM_PORT_MESSAGE_COMPSES CompSes;
+ SM_PORT_MESSAGE_EXECPGM ExecPgm;
+ SM_PORT_MESSAGE_QRYINFO QryInfo;
+ } Reply;
};
} SM_PORT_MESSAGE, * PSM_PORT_MESSAGE;
@@ -86,7 +138,7 @@
/*** MACRO ***********************************************************/
-#define SM_CONNECT_DATA_SIZE(m) ((m).Header.DataSize-sizeof(ULONG))
+#define SM_CONNECT_DATA_SIZE(m)
((m).Header.DataSize-sizeof(USHORT)-sizeof(WORD))
#define SM_PORT_DATA_SIZE(c)
(sizeof(DWORD)+sizeof(NTSTATUS)+sizeof(c))
#define SM_PORT_MESSAGE_SIZE (sizeof(SM_PORT_MESSAGE))
_____
Modified: trunk/reactos/include/sm/helper.h
--- trunk/reactos/include/sm/helper.h 2005-04-10 17:03:40 UTC (rev
14580)
+++ trunk/reactos/include/sm/helper.h 2005-04-10 19:08:23 UTC (rev
14581)
@@ -1,13 +1,17 @@
#if !defined(INCLUDE_SM_HELPER_H)
#define INCLUDE_SM_HELPER_H
+#if !defined(__SM_API_H)
+#include <sm/api.h>
+#endif
+
/* $Id$ */
/* smlib/connect.c */
NTSTATUS STDCALL
SmConnectApiPort (IN PUNICODE_STRING pSbApiPortName OPTIONAL,
IN HANDLE hSbApiPort OPTIONAL,
- IN DWORD dwSubsystem OPTIONAL, /*
pe.h */
+ IN WORD wSubsystem OPTIONAL, /*
pe.h */
IN OUT PHANDLE phSmApiPort);
/* smlib/compses.c */
NTSTATUS STDCALL
@@ -20,14 +24,11 @@
IN PUNICODE_STRING Pgm
);
/* smdll/query.c */
-typedef enum {
- SM_BASE_INFORMATION
-} SM_INFORMATION_CLASS, *PSM_INFORMATION_CLASS;
-
NTSTATUS STDCALL
-SmQuery (IN HANDLE SmApiPort,
- IN SM_INFORMATION_CLASS SmInformationClass,
- IN OUT PVOID Data,
- IN OUT PULONG DataLength);
+SmQueryInformation (IN HANDLE SmApiPort,
+ IN SM_INFORMATION_CLASS SmInformationClass,
+ IN OUT PVOID Data,
+ IN ULONG DataLength,
+ IN OUT PULONG ReturnedDataLength
OPTIONAL);
#endif /* ndef INCLUDE_SM_HELPER_H */
_____
Modified: trunk/reactos/lib/smdll/query.c
--- trunk/reactos/lib/smdll/query.c 2005-04-10 17:03:40 UTC (rev
14580)
+++ trunk/reactos/lib/smdll/query.c 2005-04-10 19:08:23 UTC (rev
14581)
@@ -1,39 +1,105 @@
-/* $Id: compses.c 13731 2005-02-23 23:37:06Z ea $
+/* $Id$
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS system libraries
* FILE: lib/smdll/query.c
- * PURPOSE: Call SM API SM_API_QUERY (not in NT)
+ * PURPOSE: Call SM API SM_API_QUERY_INFORMATION (not in NT)
*/
#define NTOS_MODE_USER
#include <ntos.h>
-#include <sm/api.h>
#include <sm/helper.h>
#define NDEBUG
#include <debug.h>
+
/**********************************************************************
* NAME EXPORTED
- * SmQuery/4
+ * SmQueryInformation/5
*
* DESCRIPTION
+ * Ask the SM to collect some data from its internal data
+ * structures and send it back.
*
* ARGUMENTS
- *
+ * hSmApiPort: handle returned by SmConnectApiPort;
+ * SmInformationClass: an SM information class ID:
+ * SM_BASIC_INFORMATION: the number of registered
subsystems
+ * Data: pointer to storage for the information to request;
+ * DataLength: length in bytes of the Data buffer; it must be
+ * set and must match the SmInformationClass info size;
+ * ReturnedDataLength: optional pointer to storage to receive
+ * the size of the returnede data.
+ *
* RETURN VALUE
+ * STATUS_SUCCESS: OK you get what you asked for;
+ * STATUS_INFO_LENGTH_MISMATCH: you set DataLength to 0 or to a
+ * value that does not match whet the SmInformationClass
+ * requires;
+ * STATUS_INVALID_PARAMETER_2: bad information class;
+ * A port error.
+ *
*/
NTSTATUS STDCALL
-SmQuery (IN HANDLE SmApiPort,
- IN SM_INFORMATION_CLASS SmInformationClass,
- IN OUT PVOID Data,
- IN OUT PULONG DataLength)
+SmQueryInformation (IN HANDLE hSmApiPort,
+ IN SM_INFORMATION_CLASS SmInformationClass,
+ IN OUT PVOID Data,
+ IN ULONG DataLength,
+ IN OUT PULONG ReturnedDataLength
OPTIONAL)
{
- /* TODO */
- if(NULL != DataLength)
+ NTSTATUS Status = STATUS_SUCCESS;
+ SM_PORT_MESSAGE SmReqMsg;
+
+
+ if(0 == DataLength)
{
- *DataLength = 0;
+ return STATUS_INFO_LENGTH_MISMATCH;
}
- return STATUS_SUCCESS;
+ /* Marshal data in the port message */
+ switch (SmInformationClass)
+ {
+ case SmBasicInformation:
+ if(DataLength != sizeof (SM_BASIC_INFORMATION))
+ {
+ return STATUS_INFO_LENGTH_MISMATCH;
+ }
+ SmReqMsg.Request.QryInfo.SmInformationClass =
SmBasicInformation;
+ SmReqMsg.Request.QryInfo.DataLength =
DataLength;
+
SmReqMsg.Request.QryInfo.BasicInformation.SubSystemCount = 0;
+ break;
+ case SmSubSystemInformation:
+ if(DataLength != sizeof
(SM_SUBSYSTEM_INFORMATION))
+ {
+ return STATUS_INFO_LENGTH_MISMATCH;
+ }
+ SmReqMsg.Request.QryInfo.SmInformationClass =
SmSubSystemInformation;
+ SmReqMsg.Request.QryInfo.DataLength =
DataLength;
+
SmReqMsg.Request.QryInfo.SubSystemInformation.SubSystemId =
+
((PSM_SUBSYSTEM_INFORMATION)Data)->SubSystemId;
+ break;
+ default:
+ return STATUS_INVALID_PARAMETER_2;
+ }
+ /* SM API to invoke */
+ SmReqMsg.SmHeader.ApiIndex = SM_API_QUERY_INFORMATION;
+
+ /* Prepare the port request message */
+ SmReqMsg.Header.MessageType = LPC_NEW_MESSAGE;
+ SmReqMsg.Header.DataSize =
SM_PORT_DATA_SIZE(SmReqMsg.Request);
+ SmReqMsg.Header.MessageSize = SM_PORT_MESSAGE_SIZE;
+ Status = NtRequestWaitReplyPort (hSmApiPort, (PLPC_MESSAGE) &
SmReqMsg, (PLPC_MESSAGE) & SmReqMsg);
+ if (NT_SUCCESS(Status))
+ {
+ /* Unmarshal data */
+ RtlCopyMemory (Data, &
SmReqMsg.Reply.QryInfo.BasicInformation,
SmReqMsg.Reply.QryInfo.DataLength);
+ /* Use caller provided storage to store data size */
+ if(NULL != ReturnedDataLength)
+ {
+ *ReturnedDataLength =
SmReqMsg.Reply.QryInfo.DataLength;
+ }
+ return SmReqMsg.SmHeader.Status;
+ }
+ DPRINT("SMLIB: %s failed (Status=0x%08lx)\n", __FUNCTION__,
Status);
+ return Status;
}
/* EOF */
_____
Modified: trunk/reactos/lib/smdll/smdll.def
--- trunk/reactos/lib/smdll/smdll.def 2005-04-10 17:03:40 UTC (rev
14580)
+++ trunk/reactos/lib/smdll/smdll.def 2005-04-10 19:08:23 UTC (rev
14581)
@@ -3,4 +3,4 @@
SmCompleteSession@12
SmConnectApiPort@16
SmExecuteProgram@8
-SmQuery@16
+SmQueryInformation@20
_____
Deleted: trunk/reactos/lib/smdll/testapi.c
--- trunk/reactos/lib/smdll/testapi.c 2005-04-10 17:03:40 UTC (rev
14580)
+++ trunk/reactos/lib/smdll/testapi.c 2005-04-10 19:08:23 UTC (rev
14581)
@@ -1,20 +0,0 @@
-/* $Id$ */
-#define NTOS_MODE_USER
-#include <ntos.h>
-#include <sm/api.h>
-
-VOID STDCALL SmPrintPortMessage (PSM_PORT_MESSAGE SmMessage)
-{
- DbgPrint ("SM_PORT_MESSAGE %08lx:\n", (ULONG) SmMessage);
- DbgPrint (" Header:\n");
- DbgPrint (" MessageType = %u\n",
SmMessage->Header.MessageType);
- DbgPrint (" DataSize = %d\n", SmMessage->Header.DataSize);
- DbgPrint (" MessageSize = %d\n",
SmMessage->Header.MessageSize);
- DbgPrint (" ApiIndex = %ld\n", SmMessage->ApiIndex);
- DbgPrint (" Status = %08lx\n", SmMessage->Status);
- DbgPrint (" ExecPgm:\n");
- DbgPrint (" NameLength = %ld\n",
SmMessage->ExecPgm.NameLength);
- DbgPrint (" Name = %ls\n", (LPWSTR) &
SmMessage->ExecPgm.Name);
-}
-/* EOF */
-
_____
Modified: trunk/reactos/lib/smlib/compses.c
--- trunk/reactos/lib/smlib/compses.c 2005-04-10 17:03:40 UTC (rev
14580)
+++ trunk/reactos/lib/smlib/compses.c 2005-04-10 19:08:23 UTC (rev
14581)
@@ -7,7 +7,6 @@
*/
#define NTOS_MODE_USER
#include <ntos.h>
-#include <sm/api.h>
#include <sm/helper.h>
#define NDEBUG
@@ -42,20 +41,20 @@
DPRINT("SMLIB: %s called\n", __FUNCTION__);
/* Marshal Ses in the LPC message */
- SmReqMsg.CompSes.hApiPort = hApiPort;
- SmReqMsg.CompSes.hSbApiPort = hSbApiPort;
+ SmReqMsg.Request.CompSes.hApiPort = hApiPort;
+ SmReqMsg.Request.CompSes.hSbApiPort = hSbApiPort;
/* SM API to invoke */
- SmReqMsg.ApiIndex = SM_API_COMPLETE_SESSION;
+ SmReqMsg.SmHeader.ApiIndex = SM_API_COMPLETE_SESSION;
/* Port message */
SmReqMsg.Header.MessageType = LPC_NEW_MESSAGE;
- SmReqMsg.Header.DataSize = SM_PORT_DATA_SIZE(SmReqMsg.CompSes);
+ SmReqMsg.Header.DataSize = SM_PORT_DATA_SIZE(SmReqMsg.Request);
SmReqMsg.Header.MessageSize = SM_PORT_MESSAGE_SIZE;
Status = NtRequestWaitReplyPort (hSmApiPort, (PLPC_MESSAGE) &
SmReqMsg, (PLPC_MESSAGE) & SmReqMsg);
if (NT_SUCCESS(Status))
{
- return SmReqMsg.Status;
+ return SmReqMsg.SmHeader.Status;
}
DPRINT("SMLIB: %s failed (Status=0x%08lx)\n", __FUNCTION__, Status);
return Status;
_____
Modified: trunk/reactos/lib/smlib/connect.c
--- trunk/reactos/lib/smlib/connect.c 2005-04-10 17:03:40 UTC (rev
14580)
+++ trunk/reactos/lib/smlib/connect.c 2005-04-10 19:08:23 UTC (rev
14581)
@@ -7,7 +7,6 @@
*/
#define NTOS_MODE_USER
#include <ntos.h>
-#include <sm/api.h>
#include <sm/helper.h>
#include <pe.h>
@@ -25,26 +24,34 @@
* ARGUMENTS
* pSbApiPortName: name of the Sb port the calling subsystem
* server already created in the system name space;
- * hSbApiPort: LPC port handle (checked, but not used);
- * dwSubsystem: a valid IMAGE_SUBSYSTEM_xxx value;
+ * hSbApiPort: LPC port handle (checked, but not used: the
+ * subsystem is required to have already created
+ * the callback port before it connects to the SM);
+ * wSubsystem: a valid IMAGE_SUBSYSTEM_xxx value;
* phSmApiPort: a pointer to a HANDLE, which will be
* filled with a valid client-side LPC comm port.
+ *
+ * There should be only two ways to call this API:
+ * a) subsystems willing to register with SM will use it
+ * with full parameters (the function checks them);
+ * b) regular SM clients, will set to 0 the 1st, the 2nd,
+ * and the 3rd parameter.
*
* RETURN VALUE
* If all three optional values are omitted, an LPC status.
* STATUS_INVALID_PARAMETER_MIX if PortName is defined and
- * both hSbApiPort and dwSubsystem are 0.
+ * both hSbApiPort and wSubsystem are 0.
*/
NTSTATUS STDCALL
SmConnectApiPort (IN PUNICODE_STRING pSbApiPortName OPTIONAL,
IN HANDLE hSbApiPort OPTIONAL,
- IN DWORD dwSubsystem OPTIONAL,
+ IN WORD wSubSystemId OPTIONAL,
IN OUT PHANDLE phSmApiPort)
{
UNICODE_STRING SmApiPortName;
SECURITY_QUALITY_OF_SERVICE SecurityQos;
NTSTATUS Status = STATUS_SUCCESS;
- SM_CONNECT_DATA ConnectData = {0,{0}};
+ SM_CONNECT_DATA ConnectData = {0,0,{0}};
ULONG ConnectDataLength = 0;
DPRINT("SMLIB: %s called\n", __FUNCTION__);
@@ -55,12 +62,13 @@
{
return STATUS_INVALID_PARAMETER_1;
}
- if (NULL == hSbApiPort || IMAGE_SUBSYSTEM_UNKNOWN == dwSubsystem)
+ if (NULL == hSbApiPort || IMAGE_SUBSYSTEM_UNKNOWN == wSubSystemId)
{
return STATUS_INVALID_PARAMETER_MIX;
}
RtlZeroMemory (& ConnectData, sizeof ConnectData);
- ConnectData.Subsystem = dwSubsystem;
+ ConnectData.Unused = 0;
+ ConnectData.SubSystemId = wSubSystemId;
if (pSbApiPortName->Length > 0)
{
RtlCopyMemory (& ConnectData.SbName,
_____
Modified: trunk/reactos/lib/smlib/execpgm.c
--- trunk/reactos/lib/smlib/execpgm.c 2005-04-10 17:03:40 UTC (rev
14580)
+++ trunk/reactos/lib/smlib/execpgm.c 2005-04-10 19:08:23 UTC (rev
14581)
@@ -7,7 +7,6 @@
*/
#define NTOS_MODE_USER
#include <ntos.h>
-#include <sm/api.h>
#include <sm/helper.h>
#include <string.h>
@@ -41,7 +40,8 @@
SM_PORT_MESSAGE SmReqMsg;
- DPRINT("SMLIB: %s called\n", __FUNCTION__);
+ DPRINT("SMLIB: %s(%08lx,'%S') called\n",
+ __FUNCTION__, hSmApiPort, Pgm->Buffer);
/* Check Pgm's length */
if (Pgm->Length > (sizeof (Pgm->Buffer[0]) * SM_EXEXPGM_MAX_LENGTH))
@@ -50,24 +50,35 @@
}
/* Marshal Pgm in the LPC message */
RtlZeroMemory (& SmReqMsg, sizeof SmReqMsg);
- SmReqMsg.ExecPgm.NameLength = Pgm->Length;
- RtlCopyMemory (SmReqMsg.ExecPgm.Name,
+ SmReqMsg.Request.ExecPgm.NameLength = Pgm->Length;
+ RtlCopyMemory (SmReqMsg.Request.ExecPgm.Name,
Pgm->Buffer,
Pgm->Length);
/* SM API to invoke */
- SmReqMsg.ApiIndex = SM_API_EXECUTE_PROGRAMME;
+ SmReqMsg.SmHeader.ApiIndex = SM_API_EXECUTE_PROGRAMME;
/* LPC message */
SmReqMsg.Header.MessageType = LPC_NEW_MESSAGE;
- SmReqMsg.Header.DataSize = SM_PORT_DATA_SIZE(SmReqMsg.ExecPgm);
+ SmReqMsg.Header.DataSize = SM_PORT_DATA_SIZE(SmReqMsg.Request);
SmReqMsg.Header.MessageSize = SM_PORT_MESSAGE_SIZE;
+ DPRINT("SMLIB: %s:\n"
+ " MessageType = %d\n"
+ " DataSize = %d\n"
+ " MessageSize = %d\n"
+ " sizeof(LPC_MESSAGE)==%d\n",
+ __FUNCTION__,
+ SmReqMsg.Header.MessageType,
+ SmReqMsg.Header.DataSize,
+ SmReqMsg.Header.MessageSize,
+ sizeof(LPC_MESSAGE));
+
/* Call SM and wait for a reply */
Status = NtRequestWaitReplyPort (hSmApiPort, (PLPC_MESSAGE) &
SmReqMsg, (PLPC_MESSAGE) & SmReqMsg);
if (NT_SUCCESS(Status))
{
- return SmReqMsg.Status;
+ return SmReqMsg.SmHeader.Status;
}
DPRINT("SMLIB: %s failed (Status=0x%08lx)\n", __FUNCTION__, Status);
return Status;
_____
Modified: trunk/reactos/subsys/smss/client.c
--- trunk/reactos/subsys/smss/client.c 2005-04-10 17:03:40 UTC (rev
14580)
+++ trunk/reactos/subsys/smss/client.c 2005-04-10 19:08:23 UTC (rev
14581)
@@ -166,14 +166,14 @@
/*
* Check if a client for the ID already exist.
*/
- if (SmpLookupClient(ConnectData->Subsystem))
+ if (SmpLookupClient(ConnectData->SubSystemId))
{
DPRINT("SM: %s: attempt to register again subsystem
%d.\n",
__FUNCTION__,
- ConnectData->Subsystem);
+ ConnectData->SubSystemId);
return STATUS_UNSUCCESSFUL;
}
- DPRINT("SM: %s: registering subsystem %d \n", __FUNCTION__,
ConnectData->Subsystem);
+ DPRINT("SM: %s: registering subsystem ID=%d \n", __FUNCTION__,
ConnectData->SubSystemId);
/*
* Allocate the storage for client data
*/
@@ -188,7 +188,7 @@
/*
* Initialize the client data
*/
- pClient->SubsystemId = ConnectData->Subsystem;
+ pClient->SubsystemId = ConnectData->SubSystemId;
/* SM auto-initializes; other subsystems are required to call
* SM_API_COMPLETE_SESSION via SMDLL. */
pClient->Initialized = (IMAGE_SUBSYSTEM_NATIVE ==
pClient->SubsystemId);
_____
Modified: trunk/reactos/subsys/smss/smapi.c
--- trunk/reactos/subsys/smss/smapi.c 2005-04-10 17:03:40 UTC (rev
14580)
+++ trunk/reactos/subsys/smss/smapi.c 2005-04-10 19:08:23 UTC (rev
14581)
@@ -21,7 +21,7 @@
SMAPI(SmInvalid)
{
DPRINT("SM: %s called\n",__FUNCTION__);
- Request->Status = STATUS_NOT_IMPLEMENTED;
+ Request->SmHeader.Status = STATUS_NOT_IMPLEMENTED;
return STATUS_SUCCESS;
}
@@ -67,10 +67,12 @@
PSM_CONNECT_DATA ConnectData = SmpGetConnectData (Request);
UNICODE_STRING CallbackPortName;
ULONG CallbackPortNameLength =
SM_SB_NAME_MAX_LENGTH; /* TODO: compute length */
+ SB_CONNECT_DATA SbConnectData;
+ ULONG SbConnectDataLength = sizeof SbConnectData;
DPRINT("SM: %s called\n", __FUNCTION__);
- if(IMAGE_SUBSYSTEM_NATIVE == ConnectData->Subsystem)
+ if(IMAGE_SUBSYSTEM_NATIVE == ConnectData->SubSystemId)
{
DPRINT("SM: %s: we do not need calling back SM!\n",
__FUNCTION__);
@@ -81,14 +83,16 @@
CallbackPortNameLength);
RtlInitUnicodeString (& CallbackPortName,
ClientData->SbApiPortName);
+
+ SbConnectData.SmApiMax = (sizeof SmApi / sizeof SmApi[0]);
Status = NtConnectPort (& ClientData->SbApiPort,
& CallbackPortName,
NULL,
NULL,
NULL,
NULL,
- NULL,
- NULL);
+ & SbConnectData,
+ & SbConnectDataLength);
return Status;
}
@@ -138,13 +142,13 @@
Reply = NULL;
break;
default:
- if ((Request.ApiIndex) &&
- (Request.ApiIndex < (sizeof
SmApi / sizeof SmApi[0])))
+ if ((Request.SmHeader.ApiIndex) &&
+ (Request.SmHeader.ApiIndex <
(sizeof SmApi / sizeof SmApi[0])))
{
- Status =
SmApi[Request.ApiIndex](&Request);
+ Status =
SmApi[Request.SmHeader.ApiIndex](&Request);
Reply = (PLPC_MESSAGE) &
Request;
} else {
- Request.Status =
STATUS_NOT_IMPLEMENTED;
+ Request.SmHeader.Status =
STATUS_NOT_IMPLEMENTED;
Reply = (PLPC_MESSAGE) &
Request;
}
}
@@ -181,11 +185,11 @@
PVOID Context = NULL;
DPRINT("SM: %s called:\n SubSystemID=%d\n SbName=\"%S\"\n",
- __FUNCTION__, ConnectData->Subsystem,
ConnectData->SbName);
+ __FUNCTION__, ConnectData->SubSystemId,
ConnectData->SbName);
if(sizeof (SM_CONNECT_DATA) == Request->Header.DataSize)
{
- if(IMAGE_SUBSYSTEM_UNKNOWN == ConnectData->Subsystem)
+ if(IMAGE_SUBSYSTEM_UNKNOWN == ConnectData->SubSystemId)
{
/*
* This is not a call to register an image set,
@@ -202,9 +206,9 @@
* Reject GUIs classes: only odd subsystem IDs
are
* allowed to register here (tty mode images).
*/
- if(1 == (ConnectData->Subsystem % 2))
+ if(1 == (ConnectData->SubSystemId % 2))
{
- DPRINT("SM: %s: id = %d\n",
__FUNCTION__, ConnectData->Subsystem);
+ DPRINT("SM: %s: id = %d\n",
__FUNCTION__, ConnectData->SubSystemId);
/*
* SmCreateClient/2 is called here
explicitly to *fail*.
* If it succeeds, there is something
wrong in the
@@ -236,7 +240,7 @@
} else {
DPRINT("SM: %s:
SmpCallbackServer failed (Status=%08lx)\n",
__FUNCTION__,
Status);
- Status = SmDestroyClient
(ConnectData->Subsystem);
+ Status = SmDestroyClient
(ConnectData->SubSystemId);
}
}
}
_____
Modified: trunk/reactos/subsys/smss/smapicomp.c
--- trunk/reactos/subsys/smss/smapicomp.c 2005-04-10 17:03:40 UTC
(rev 14580)
+++ trunk/reactos/subsys/smss/smapicomp.c 2005-04-10 19:08:23 UTC
(rev 14581)
@@ -36,15 +36,12 @@
{
NTSTATUS Status = STATUS_SUCCESS;
- DPRINT("SM: %s called from [%lx|%lx]\n",
- __FUNCTION__,
- Request->ClientId.UniqueProcessId,
- Request->ClientId.UniqueThreadId);
+ DPRINT("SM: %s called\n", __FUNCTION__);
Status = SmCompleteClientInitialization
(Request->Header.ClientId.UniqueProcess);
if(!NT_SUCCESS(Status))
{
- Request->Status = STATUS_UNSUCCESSFUL;
+ Request->SmHeader.Status = STATUS_UNSUCCESSFUL;
}
return Status;
}
_____
Modified: trunk/reactos/subsys/smss/smapiexec.c
--- trunk/reactos/subsys/smss/smapiexec.c 2005-04-10 17:03:40 UTC
(rev 14580)
+++ trunk/reactos/subsys/smss/smapiexec.c 2005-04-10 19:08:23 UTC
(rev 14581)
@@ -253,7 +253,7 @@
DPRINT("SM: %s called from CID(%lx|%lx)\n",
__FUNCTION__, Request->Header.ClientId.UniqueProcess,
Request->Header.ClientId.UniqueThread);
- ExecPgm = & Request->ExecPgm;
+ ExecPgm = & Request->Request.ExecPgm;
/* Check if the name lenght is valid */
if((ExecPgm->NameLength > 0) &&
(ExecPgm->NameLength <= SM_EXEXPGM_MAX_LENGTH) &&
@@ -277,7 +277,7 @@
* independent process; now it is embedded in
the
* SM for performance or security.
*/
- Request->Status = SmInitializeDbgSs();
+ Request->SmHeader.Status = SmInitializeDbgSs();
}
else
{
@@ -299,20 +299,20 @@
wcscat (ImagePath, Data);
/* Create native process */
- Request->Status =
SmCreateUserProcess(ImagePath,
+ Request->SmHeader.Status =
SmCreateUserProcess(ImagePath,
L"", /* FIXME */
FALSE, /* wait */
NULL,
FALSE, /* terminate */
NULL);
}else{
- Request->Status = Status;
+ Request->SmHeader.Status = Status;
}
}
}
else
{
- Request->Status = Status = STATUS_INVALID_PARAMETER;
+ Request->SmHeader.Status = Status =
STATUS_INVALID_PARAMETER;
}
return Status;
}
_____
Modified: trunk/reactos/subsys/smss/smapiquery.c
--- trunk/reactos/subsys/smss/smapiquery.c 2005-04-10 17:03:40 UTC
(rev 14580)
+++ trunk/reactos/subsys/smss/smapiquery.c 2005-04-10 19:08:23 UTC
(rev 14581)
@@ -38,7 +38,7 @@
DPRINT("SM: %s called\n", __FUNCTION__);
- Request->Status = STATUS_NOT_IMPLEMENTED;
+ Request->SmHeader.Status = STATUS_NOT_IMPLEMENTED;
return Status;
}