Added some init code for the embedded DBGSS.
authorEmanuele Aliberti <ea@iol.it>
Thu, 24 Feb 2005 22:20:43 +0000 (22:20 +0000)
committerEmanuele Aliberti <ea@iol.it>
Thu, 24 Feb 2005 22:20:43 +0000 (22:20 +0000)
svn path=/trunk/; revision=13736

reactos/subsys/smss/debug.c
reactos/subsys/smss/smapi.c

index e7848df..abff160 100644 (file)
 #define NTOS_MODE_USER\r
 #include <ntos.h>\r
 #include <rosrtl/string.h>\r
-#include <sm/api.h>\r
 #include "smss.h"\r
 \r
+#define NDEBUG\r
+#include <debug.h>\r
+\r
+\r
 /* GLOBALS ***********************************************************/\r
 \r
-HANDLE DbgSsApiPort = INVALID_HANDLE_VALUE;\r
-HANDLE DbgUiApiPort = INVALID_HANDLE_VALUE;\r
+HANDLE DbgSsApiPort = (HANDLE) 0;\r
+HANDLE DbgUiApiPort = (HANDLE) 0;\r
 \r
 /* FUNCTIONS *********************************************************/\r
 \r
-NTSTATUS\r
-SmInitializeDbgSs (VOID)\r
+static VOID STDCALL\r
+DbgSsApiPortThread (PVOID dummy)\r
 {\r
-  NTSTATUS Status;\r
-  UNICODE_STRING UnicodeString;\r
-  OBJECT_ATTRIBUTES ObjectAttributes;\r
-\r
+       NTSTATUS Status = STATUS_SUCCESS;\r
+       LPC_MAX_MESSAGE Request = {{0}};\r
+    \r
+       while (TRUE)\r
+       {\r
+               Status = NtListenPort (DbgSsApiPort, & Request.Header);\r
+               if (!NT_SUCCESS(Status))\r
+               {\r
+                       DPRINT1("SM: %s: NtListenPort() failed! (Status==x%08lx)\n", __FUNCTION__, Status);\r
+                       break;\r
+               }\r
+               /* TODO */\r
+       }\r
+       NtTerminateThread(NtCurrentThread(),Status);\r
+}\r
 \r
-  /* Create the \DbgSsApiPort object (LPC) */\r
-  RtlRosInitUnicodeStringFromLiteral(&UnicodeString,\r
-                      L"\\DbgSsApiPort");\r
-  InitializeObjectAttributes(&ObjectAttributes,\r
-                            &UnicodeString,\r
-                            PORT_ALL_ACCESS,\r
-                            NULL,\r
-                            NULL);\r
+static VOID STDCALL\r
+DbgUiApiPortThread (PVOID dummy)\r
+{\r
+       NTSTATUS Status = STATUS_SUCCESS;\r
+       LPC_MAX_MESSAGE Request = {{0}};\r
+    \r
+       while (TRUE)\r
+       {\r
+               Status = NtListenPort (DbgUiApiPort, & Request.Header);\r
+               if (!NT_SUCCESS(Status))\r
+               {\r
+                       DPRINT1("SM: %s: NtListenPort() failed! (Status==x%08lx)\n", __FUNCTION__, Status);\r
+                       break;\r
+               }\r
+               /* TODO */\r
+       }\r
+       NtTerminateThread(NtCurrentThread(),Status);\r
+}\r
 \r
-  Status = NtCreatePort(&DbgSsApiPort,\r
-                       &ObjectAttributes,\r
-                       0,\r
-                       0,\r
-                       0);\r
+static NTSTATUS STDCALL\r
+SmpCreatePT (IN OUT PHANDLE hPort,\r
+            IN     LPWSTR  wcPortName,\r
+            IN     ULONG   ulMaxDataSize,\r
+            IN     ULONG   ulMaxMessageSize,\r
+            IN     ULONG   ulPoolCharge OPTIONAL,\r
+            IN     VOID    (STDCALL * procServingThread)(PVOID) OPTIONAL,\r
+            IN OUT PHANDLE phServingThread OPTIONAL)\r
+{\r
+       NTSTATUS          Status = STATUS_SUCCESS;\r
+       UNICODE_STRING    PortName = {0};\r
+       OBJECT_ATTRIBUTES ObjectAttributes;\r
+       HANDLE            Thread = (HANDLE) 0;\r
+       CLIENT_ID         Cid = {0, 0};\r
 \r
-  if (!NT_SUCCESS(Status))\r
-    {\r
-      return(Status);\r
-    }\r
-  DbgPrint("SMSS: %s: \\DbgSsApiPort created\n",__FUNCTION__);\r
+       RtlInitUnicodeString (& PortName, wcPortName);\r
+       InitializeObjectAttributes (& ObjectAttributes,\r
+                                   & PortName,\r
+                                   PORT_ALL_ACCESS,\r
+                                   NULL,\r
+                                           NULL);\r
+       Status = NtCreatePort (hPort,\r
+                              & ObjectAttributes,\r
+                                      ulMaxDataSize,\r
+                                      ulMaxMessageSize,\r
+                                      ulPoolCharge);\r
+       if(STATUS_SUCCESS != Status)\r
+       {\r
+               return Status;\r
+       }\r
+       /* Create thread for DbgSsApiPort */\r
+       RtlCreateUserThread(NtCurrentProcess(),\r
+                           NULL,\r
+                           FALSE,\r
+                           0,\r
+                           NULL,\r
+                           NULL,\r
+                           (PTHREAD_START_ROUTINE) procServingThread,\r
+                           hPort,\r
+                           & Thread,\r
+                           & Cid);\r
+       if((HANDLE) 0 == Thread)\r
+       {\r
+               NtClose(*hPort);\r
+               Status = STATUS_UNSUCCESSFUL;\r
+       }\r
+       if(NULL != phServingThread)\r
+       {\r
+               *phServingThread = Thread;\r
+       }\r
+       return Status;\r
+}\r
 \r
-  /* Create the \DbgUiApiPort object (LPC) */\r
-  RtlRosInitUnicodeStringFromLiteral(&UnicodeString,\r
-                      L"\\DbgUiApiPort");\r
-  InitializeObjectAttributes(&ObjectAttributes,\r
-                            &UnicodeString,\r
-                            PORT_ALL_ACCESS,\r
-                            NULL,\r
-                            NULL);\r
+NTSTATUS\r
+SmInitializeDbgSs (VOID)\r
+{\r
+       NTSTATUS  Status = STATUS_SUCCESS;\r
+       HANDLE    hDbgSsApiPortThread = (HANDLE) 0;\r
 \r
-  Status = NtCreatePort(&DbgUiApiPort,\r
-                       &ObjectAttributes,\r
-                       0,\r
-                       0,\r
-                       0);\r
-  if (!NT_SUCCESS(Status))\r
-    {\r
-      return(Status);\r
-    }\r
-  DbgPrint("SMSS: %s: \\DbgUiApiPort created\n",__FUNCTION__);\r
+       DPRINT("SM: %s called\n", __FUNCTION__);\r
 \r
-  return STATUS_SUCCESS;\r
+       /* Create the \DbgSsApiPort object (LPC) */\r
+       Status = SmpCreatePT(& DbgSsApiPort,\r
+                            SM_DBGSS_PORT_NAME,\r
+                            0, /* MaxDataSize */\r
+                            0, /* MaxMessageSize */\r
+                            0, /* PoolCharge */\r
+                            DbgSsApiPortThread,\r
+                            & hDbgSsApiPortThread);\r
+       if(!NT_SUCCESS(Status))\r
+       {\r
+               DPRINT("SM: %s: DBGSS port not created\n",__FUNCTION__);\r
+               return Status;\r
+       }\r
+       /* Create the \DbgUiApiPort object (LPC) */\r
+       Status = SmpCreatePT(& DbgUiApiPort,\r
+                            SM_DBGUI_PORT_NAME,\r
+                            0, /* MaxDataSize */\r
+                            0, /* MaxMessageSize */\r
+                            0, /* PoolCharge */\r
+                            DbgUiApiPortThread,\r
+                            NULL);\r
+       if(!NT_SUCCESS(Status))\r
+       {\r
+               DPRINT("SM: %s: DBGUI port not created\n",__FUNCTION__);\r
+               NtClose (hDbgSsApiPortThread);\r
+               NtClose (DbgSsApiPort);\r
+               return Status;\r
+       }\r
+       return STATUS_SUCCESS;\r
 }\r
 \r
 /* EOF */\r
index 33a062d..78cac41 100644 (file)
@@ -9,7 +9,7 @@
 #include "smss.h"
 #include <rosrtl/string.h>
 
-//#define NDEBUG
+#define NDEBUG
 #include <debug.h>
 
 /* GLOBAL VARIABLES *********************************************************/