#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