CSR Reloaded... well, split.
- almost do-nothing base source code for new CSR server DLLs host
- base source code for the core CSR server DLL 'csrsrv.dll' (server 0)
- base source code for the base WIN server DLL 'basesrv.dll' (server 1)
- base source code for the console+user WIN server DLL 'winsrv.dll'
(servers 3 and 2)
NOTES
- At present, nothing works, but compilation is OK, sorry.
- The program is temporarily named 'csr.exe' to coexist with current
monolithic 'csrss.exe'.
- Code, hints, suggestions, and migration plans welcome! (post 0.3)
Added: trunk/reactos/subsys/csr/
Added: trunk/reactos/subsys/csr/args.c
Added: trunk/reactos/subsys/csr/csr.h
Added: trunk/reactos/subsys/csr/csr.rc
Added: trunk/reactos/subsys/csr/csr.xml
Added: trunk/reactos/subsys/csr/csrsrv/
Added: trunk/reactos/subsys/csr/csrsrv/csrsrv.def
Added: trunk/reactos/subsys/csr/csrsrv/csrsrv.rc
Added: trunk/reactos/subsys/csr/csrsrv/csrsrv.xml
Added: trunk/reactos/subsys/csr/csrsrv/debug.c
Added: trunk/reactos/subsys/csr/csrsrv/dllmain.c
Added: trunk/reactos/subsys/csr/csrsrv/init.c
Added: trunk/reactos/subsys/csr/csrsrv/process.c
Added: trunk/reactos/subsys/csr/csrsrv/server.c
Added: trunk/reactos/subsys/csr/csrsrv/session.c
Added: trunk/reactos/subsys/csr/csrsrv/srv.h
Added: trunk/reactos/subsys/csr/csrsrv/thread.c
Added: trunk/reactos/subsys/csr/csrsrv/wait.c
Added: trunk/reactos/subsys/csr/main.c
Added: trunk/reactos/subsys/win/
Added: trunk/reactos/subsys/win/basesrv/
Added: trunk/reactos/subsys/win/basesrv/basesrv.def
Added: trunk/reactos/subsys/win/basesrv/basesrv.h
Added: trunk/reactos/subsys/win/basesrv/basesrv.rc
Added: trunk/reactos/subsys/win/basesrv/basesrv.xml
Added: trunk/reactos/subsys/win/basesrv/init.c
Added: trunk/reactos/subsys/win/basesrv/main.c
Added: trunk/reactos/subsys/win/basesrv/server.c
Added: trunk/reactos/subsys/win/directory.xml
Added: trunk/reactos/subsys/win/winsrv/
Added: trunk/reactos/subsys/win/winsrv/dllmain.c
Added: trunk/reactos/subsys/win/winsrv/init.c
Added: trunk/reactos/subsys/win/winsrv/server.c
Added: trunk/reactos/subsys/win/winsrv/winsrv.def
Added: trunk/reactos/subsys/win/winsrv/winsrv.h
Added: trunk/reactos/subsys/win/winsrv/winsrv.rc
Added: trunk/reactos/subsys/win/winsrv/winsrv.xml
_____
Added: trunk/reactos/subsys/csr/args.c
--- trunk/reactos/subsys/csr/args.c 2005-08-12 12:10:33 UTC (rev
17322)
+++ trunk/reactos/subsys/csr/args.c 2005-08-12 12:22:02 UTC (rev
17323)
@@ -0,0 +1,126 @@
+/* $Id$
+ *
+ * args.c - Client/Server Runtime - command line parsing
+ *
+ * ReactOS Operating System
+ *
+ * --------------------------------------------------------------------
+ *
+ * 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
+ * Library 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 "csr.h"
+
+#define NDEBUG
+#include <debug.h>
+
+/**********************************************************************
+ * NAME PRIVATE
+ * CsrParseCommandLine/2
+ */
+NTSTATUS FASTCALL CsrParseCommandLine (PPEB Peb,
+ PCOMMAND_LINE_ARGUMENT Argument)
+{
+ HANDLE ProcessHeap = Peb->ProcessHeap;
+ PRTL_USER_PROCESS_PARAMETERS RtlProcessParameters =
RtlNormalizeProcessParams (Peb->ProcessParameters);
+ INT i = 0;
+ INT afterlastspace = 0;
+
+
+ DPRINT("CSR: %s called\n", __FUNCTION__);
+
+ RtlZeroMemory (Argument, sizeof (COMMAND_LINE_ARGUMENT));
+
+ Argument->Vector = (PWSTR *) RtlAllocateHeap (ProcessHeap,
+ 0,
+
(CSRP_MAX_ARGUMENT_COUNT * sizeof Argument->Vector[0]));
+ if(NULL == Argument->Vector)
+ {
+ DPRINT("CSR: %s: no memory for Argument->Vector\n",
__FUNCTION__);
+ return STATUS_NO_MEMORY;
+ }
+
+ Argument->Buffer.Length =
+ Argument->Buffer.MaximumLength =
+ RtlProcessParameters->CommandLine.Length
+ + sizeof Argument->Buffer.Buffer [0]; /* zero terminated */
+ Argument->Buffer.Buffer =
+ (PWSTR) RtlAllocateHeap (ProcessHeap,
+ 0,
+ Argument->Buffer.MaximumLength);
+ if(NULL == Argument->Buffer.Buffer)
+ {
+ DPRINT("CSR: %s: no memory for Argument->Buffer.Buffer\n",
__FUNCTION__);
+ return STATUS_NO_MEMORY;
+ }
+
+ RtlCopyMemory (Argument->Buffer.Buffer,
+ RtlProcessParameters->CommandLine.Buffer,
+ RtlProcessParameters->CommandLine.Length);
+
+ while (Argument->Buffer.Buffer [i])
+ {
+ if (Argument->Buffer.Buffer[i] == L' ')
+ {
+ Argument->Count ++;
+ Argument->Buffer.Buffer [i] = L'\0';
+ Argument->Vector [Argument->Count - 1] = &
(Argument->Buffer.Buffer [afterlastspace]);
+ i++;
+ while (Argument->Buffer.Buffer [i] == L' ')
+ {
+ i++;
+ }
+ afterlastspace = i;
+ }
+ else
+ {
+ i++;
+ }
+ }
+
+ if (Argument->Buffer.Buffer [afterlastspace] != L'\0')
+ {
+ Argument->Count ++;
+ Argument->Buffer.Buffer [i] = L'\0';
+ Argument->Vector [Argument->Count - 1] = &
(Argument->Buffer.Buffer [afterlastspace]);
+ }
+#if !defined(NDEBUG)
+ for (i=0; i<Argument->Count; i++)
+ {
+ DPRINT("CSR: Argument[%d] = '%S'\n", i, Argument->Vector
[i]);
+ }
+#endif
+ return STATUS_SUCCESS;
+}
+/**********************************************************************
+ * NAME PRIVATE
+ * CsrFreeCommandLine/2
+ */
+
+VOID FASTCALL CsrFreeCommandLine (PPEB Peb,
+ PCOMMAND_LINE_ARGUMENT Argument)
+{
+ DPRINT("CSR: %s called\n", __FUNCTION__);
+
+ RtlFreeHeap (Peb->ProcessHeap,
+ 0,
+ Argument->Vector);
+ RtlFreeHeap (Peb->ProcessHeap,
+ 0,
+ Argument->Buffer.Buffer);
+}
+/* EOF */
Property changes on: trunk/reactos/subsys/csr/args.c
___________________________________________________________________
Name: svn:keywords
+ author date id revision
Name: svn:eol-style
+ native
_____
Added: trunk/reactos/subsys/csr/csr.h
--- trunk/reactos/subsys/csr/csr.h 2005-08-12 12:10:33 UTC (rev
17322)
+++ trunk/reactos/subsys/csr/csr.h 2005-08-12 12:22:02 UTC (rev
17323)
@@ -0,0 +1,34 @@
+#if !defined(_INCLUDE_CSR_H)
+#define _INCLUDE_CSR_H
+
+/* PSDK/NDK Headers */
+#include <stdio.h>
+#include <windows.h>
+
+#define NTOS_MODE_USER
+#include <ndk/ntndk.h>
+
+#include <csr/server.h>
+
+
+#define CSRSS_ARGUMENT_SIZE 16
+
+/* args.c */
+#define CSRP_MAX_ARGUMENT_COUNT 512
+
+typedef struct _COMMAND_LINE_ARGUMENT
+{
+ ULONG Count;
+ UNICODE_STRING Buffer;
+ PWSTR * Vector;
+
+} COMMAND_LINE_ARGUMENT, *PCOMMAND_LINE_ARGUMENT;
+
+NTSTATUS FASTCALL CsrParseCommandLine (PPEB,PCOMMAND_LINE_ARGUMENT);
+VOID FASTCALL CsrFreeCommandLine (PPEB,PCOMMAND_LINE_ARGUMENT);
+
+/* csrsrv.dll */
+NTSTATUS STDCALL CsrServerInitialization (ULONG,LPWSTR*);
+
+#endif /* !def _INCLUDE_CSR_H */
+
Property changes on: trunk/reactos/subsys/csr/csr.h
___________________________________________________________________
Name: svn:keywords
+ author date id revision
Name: svn:eol-style
+ native
_____
Added: trunk/reactos/subsys/csr/csr.rc
--- trunk/reactos/subsys/csr/csr.rc 2005-08-12 12:10:33 UTC (rev
17322)
+++ trunk/reactos/subsys/csr/csr.rc 2005-08-12 12:22:02 UTC (rev
17323)
@@ -0,0 +1,4 @@
+#define REACTOS_STR_FILE_DESCRIPTION "Client/Server Runtime
Process\0"
+#define REACTOS_STR_INTERNAL_NAME "csrss\0"
+#define REACTOS_STR_ORIGINAL_FILENAME "csrss.exe\0"
+#include <reactos/version.rc>
Property changes on: trunk/reactos/subsys/csr/csr.rc
___________________________________________________________________
Name: svn:keywords
+ author date id revision
Name: svn:eol-style
+ native
_____
Added: trunk/reactos/subsys/csr/csr.xml
--- trunk/reactos/subsys/csr/csr.xml 2005-08-12 12:10:33 UTC (rev
17322)
+++ trunk/reactos/subsys/csr/csr.xml 2005-08-12 12:22:02 UTC (rev
17323)
@@ -0,0 +1,14 @@
+<module name="csr" type="nativecui"
installbase="system32"
installname="csr.exe">
+ <include base="csr">.</include>
+ <define name="__USE_W32API" />
+ <define name="_WIN32_WINNT">0x0600</define>
+ <define name="WINVER">0x0501</define>
+ <library>ntdll</library>
+ <library>csrsrv</library>
+ <file>main.c</file>
+ <file>args.c</file>
+ <file>csr.rc</file>
+</module>
+<directory name="csrsrv">
+ <xi:include href="csrsrv/csrsrv.xml" />
+</directory>
Property changes on: trunk/reactos/subsys/csr/csr.xml
___________________________________________________________________
Name: svn:keywords
+ author date id revision
Name: svn:eol-style
+ native
_____
Added: trunk/reactos/subsys/csr/csrsrv/csrsrv.def
--- trunk/reactos/subsys/csr/csrsrv/csrsrv.def 2005-08-12 12:10:33 UTC
(rev 17322)
+++ trunk/reactos/subsys/csr/csrsrv/csrsrv.def 2005-08-12 12:22:02 UTC
(rev 17323)
@@ -0,0 +1,37 @@
+; $Id$
+LIBRARY csrsrv.dll
+EXPORTS
+CsrAddStaticServerThread@4
+CsrCallServerFromServer@0
+CsrCreateProcess@8
+CsrCreateRemoteThread@0
+CsrCreateThread@8
+CsrCreateWait@8
+CsrDebugProcess@4
+CsrDebugProcessStop@4
+CsrDereferenceProcess@4
+CsrDereferenceThread@4
+CsrDereferenceWait@4
+CsrDestroyProcess@4
+CsrDestroyThread@4
+CsrExecServerThread@0
+CsrGetProcessLuid@8
+CsrImpersonateClient@0
+CsrLockProcessByClientId@0
+CsrLockThreadByClientId@0
+CsrMoveSatisfiedWait@4
+CsrNotifyWait@4
+CsrQueryApiPort@0
+CsrReferenceThread@4
+CsrRevertToSelf@0
+CsrServerInitialization@8
+CsrSetBackgroundPriority@0
+CsrSetCallingSpooler@0
+CsrSetForegroundPriority@0
+CsrShutdownProcesses@4
+CsrUnhandledExceptionFilter@0
+CsrUnlockProcess@4
+CsrUnlockThread@4
+CsrValidateMessageBuffer@0
+CsrValidateMessageString@0
+; EOF
Property changes on: trunk/reactos/subsys/csr/csrsrv/csrsrv.def
___________________________________________________________________
Name: svn:keywords
+ author date id revision
Name: svn:eol-style
+ native
_____
Added: trunk/reactos/subsys/csr/csrsrv/csrsrv.rc
--- trunk/reactos/subsys/csr/csrsrv/csrsrv.rc 2005-08-12 12:10:33 UTC
(rev 17322)
+++ trunk/reactos/subsys/csr/csrsrv/csrsrv.rc 2005-08-12 12:22:02 UTC
(rev 17323)
@@ -0,0 +1,5 @@
+#define REACTOS_VERSION_DLL
+#define REACTOS_STR_FILE_DESCRIPTION "ReactOS CSR Core Server\0"
+#define REACTOS_STR_INTERNAL_NAME "csrsrv\0"
+#define REACTOS_STR_ORIGINAL_FILENAME "csrsrv.dll\0"
+#include <reactos/version.rc>
Property changes on: trunk/reactos/subsys/csr/csrsrv/csrsrv.rc
___________________________________________________________________
Name: svn:keywords
+ author date id revision
Name: svn:eol-style
+ native
_____
Added: trunk/reactos/subsys/csr/csrsrv/csrsrv.xml
--- trunk/reactos/subsys/csr/csrsrv/csrsrv.xml 2005-08-12 12:10:33 UTC
(rev 17322)
+++ trunk/reactos/subsys/csr/csrsrv/csrsrv.xml 2005-08-12 12:22:02 UTC
(rev 17323)
@@ -0,0 +1,17 @@
+<module name="csrsrv" type="nativedll">
+ <importlibrary definition="csrsrv.def" />
+ <include base="csrsrv">.</include>
+ <include base="csr">.</include>
+ <define name="_DISABLE_TIDENTS" />
+ <define name="__USE_W32API" />
+ <library>ntdll</library>
+ <file>debug.c</file>
+ <file>dllmain.c</file>
+ <file>init.c</file>
+ <file>process.c</file>
+ <file>server.c</file>
+ <file>session.c</file>
+ <file>thread.c</file>
+ <file>wait.c</file>
+ <file>csrsrv.rc</file>
+</module>
Property changes on: trunk/reactos/subsys/csr/csrsrv/csrsrv.xml
___________________________________________________________________
Name: svn:keywords
+ author date id revision
Name: svn:eol-style
+ native
_____
Added: trunk/reactos/subsys/csr/csrsrv/debug.c
--- trunk/reactos/subsys/csr/csrsrv/debug.c 2005-08-12 12:10:33 UTC
(rev 17322)
+++ trunk/reactos/subsys/csr/csrsrv/debug.c 2005-08-12 12:22:02 UTC
(rev 17323)
@@ -0,0 +1,53 @@
+/* $Id$
+ *
+ * subsys/csr/csrsrv/debug.c - CSR server - debugging management
+ *
+ * ReactOS Operating System
+ *
+ * --------------------------------------------------------------------
+ *
+ * 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
+ * Library 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 "srv.h"
+
+//#define NDEBUG
+#include <debug.h>
+
+/*=====================================================================
+ * PUBLIC API
+ *===================================================================*/
+
+NTSTATUS STDCALL CsrDebugProcess (PCSR_PROCESS pCsrProcess)
+{
+ NTSTATUS Status = STATUS_NOT_IMPLEMENTED;
+
+ DPRINT("CSRSRV: %s(%08lx) called\n", __FUNCTION__, pCsrProcess);
+
+ return Status;
+}
+
+NTSTATUS STDCALL CsrDebugProcessStop (PCSR_PROCESS pCsrProcess)
+{
+ NTSTATUS Status = STATUS_NOT_IMPLEMENTED;
+
+ DPRINT("CSRSRV: %s(%08lx) called\n", __FUNCTION__, pCsrProcess);
+
+ return Status;
+}
+
+/* EOF */
Property changes on: trunk/reactos/subsys/csr/csrsrv/debug.c
___________________________________________________________________
Name: svn:keywords
+ author date id revision
Name: svn:eol-style
+ native
_____
Added: trunk/reactos/subsys/csr/csrsrv/dllmain.c
--- trunk/reactos/subsys/csr/csrsrv/dllmain.c 2005-08-12 12:10:33 UTC
(rev 17322)
+++ trunk/reactos/subsys/csr/csrsrv/dllmain.c 2005-08-12 12:22:02 UTC
(rev 17323)
@@ -0,0 +1,33 @@
+/* $Id$
+ *
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS system libraries
+ * FILE: subsys/csr/csrsrv/dllmain.c
+ * PURPOSE: DLL entry point
+ */
+
+/* INCLUDES
******************************************************************/
+
+#include "srv.h"
+
+#define NDEBUG
+#include <debug.h>
+
+HANDLE CsrSrvDllHandle = 0;
+
+/* FUNCTIONS
*****************************************************************/
+
+BOOL STDCALL
+DllMain(HANDLE hDll,
+ DWORD dwReason,
+ LPVOID lpReserved)
+{
+ if (DLL_PROCESS_ATTACH == dwReason)
+ {
+ CsrSrvDllHandle = hDll;
+ }
+
+ return TRUE;
+}
+
+/* EOF */
Property changes on: trunk/reactos/subsys/csr/csrsrv/dllmain.c
___________________________________________________________________
Name: svn:keywords
+ author date id revision
Name: svn:eol-style
+ native
_____
Added: trunk/reactos/subsys/csr/csrsrv/init.c
--- trunk/reactos/subsys/csr/csrsrv/init.c 2005-08-12 12:10:33 UTC
(rev 17322)
+++ trunk/reactos/subsys/csr/csrsrv/init.c 2005-08-12 12:22:02 UTC
(rev 17323)
@@ -0,0 +1,427 @@
+/* $Id$
+ *
+ * subsys/csr/csrsrv/init.c - CSR server - initialization
+ *
+ * ReactOS Operating System
+ *
+ * --------------------------------------------------------------------
+ *
+ * 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
+ * Library 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 "srv.h"
+
+//#define NDEBUG
+#include <debug.h>
+
+
+typedef enum {
+ CSRAT_UNKNOWN=0,
+ CSRAT_OBJECT_DIRECTORY,
+ CSRAT_SUBSYSTEM_TYPE,
+ CSRAT_REQUEST_THREADS, /* ReactOS extension */
+ CSRAT_REQUEST_THREADS_MAX,
+ CSRAT_PROFILE_CONTROL,
+ CSRAT_SHARED_SECTION,
+ CSRAT_SERVER_DLL,
+ CSRAT_WINDOWS,
+ CSRAT_SESSIONS, /* ReactOS extension */
+ CSRAT_MAX
+} CSR_ARGUMENT_TYPE, *PCSR_ARGUMENT_TYPE;
+
+typedef struct _CSR_ARGUMENT_ITEM
+{
+ CSR_ARGUMENT_TYPE Type;
+ UNICODE_STRING Data;
+ union {
+ UNICODE_STRING ObjectDirectory;
+ CSR_SUBSYSTEM_TYPE SubSystemType;
+ USHORT RequestThreads;
+ USHORT MaxRequestThreads;
+ BOOL ProfileControl;
+ BOOL Windows;
+ BOOL Sessions;
+ CSR_SERVER_DLL ServerDll;
+ struct {
+ USHORT PortSectionSize;
// 1024k; 128k..?
+ USHORT InteractiveDesktopHeapSize;
// 3072k; 128k..
+ USHORT NonInteractiveDesktopHeapSize;
// (InteractiveDesktopHeapSize); 128k..
+ USHORT Reserved; /* unused */
+ } SharedSection;
+ } Item;
+
+} CSR_ARGUMENT_ITEM, * PCSR_ARGUMENT_ITEM;
+
+/**********************************************************************
+ * CsrpStringToBool/3 PRIVATE
+ */
+static BOOL STDCALL CsrpStringToBool (LPWSTR TestString, LPWSTR
TrueString, LPWSTR FalseString)
+{
+ if((0 == wcscmp(TestString, TrueString)))
+ {
+ return TRUE;
+ }
+ if((0 == wcscmp(TestString, FalseString)))
+ {
+ return FALSE;
+ }
+ DPRINT1("CSRSRV:%s: replacing invalid value '%S' with
'%S'!\n",
+ __FUNCTION__, TestString, FalseString);
+ return FALSE;
+}
+/**********************************************************************
+ * CsrpSplitServerDll/2
PRIVATE
+ *
+ * RETURN VALUE
+ * 0: syntax error
+ * 2: ServerDll=="basesrv,1"
+ * 3: ServerDll=="winsrv:UserServerDllInitialization,3"
+ */
+static INT STDCALL CsrpSplitServerDll (LPWSTR ServerDll,
PCSR_ARGUMENT_ITEM pItem)
+{
+ LPWSTR DllName = NULL;
+ LPWSTR DllEntryPoint = NULL;
+ LPWSTR DllId = NULL;
+ static LPWSTR DefaultDllEntryPoint = L"ServerDllInitialization";
+ LPWSTR tmp = NULL;
+ INT rc = 0;
+ PCSR_SERVER_DLL pCsrServerDll = & pItem->Item.ServerDll;
+
+ if (L'\0' == *ServerDll)
+ {
+ return 0;
+ }
+ /*
+ * DllName (required)
+ */
+ DllName = ServerDll;
+ if (NULL == DllName)
+ {
+ return 0;
+ }
+ /*
+ * DllEntryPoint (optional)
+ */
+ DllEntryPoint = wcschr (ServerDll, L':');
+ if (NULL == DllEntryPoint)
+ {
+ DllEntryPoint = DefaultDllEntryPoint;
+ tmp = ServerDll;
+ rc = 2;
+ } else {
+ tmp = ++DllEntryPoint;
+ rc = 3;
+ }
+ /*
+ * DllId (required)
+ */
+ DllId = wcschr (tmp, L',');
+ if (NULL == DllId)
+ {
+ return 0;
+ }
+ *DllId++ = L'\0';
+ // OK
+ pCsrServerDll->ServerIndex = wcstoul (DllId, NULL, 10);
+ pCsrServerDll->Unused = 0;
+ RtlInitUnicodeString (& pCsrServerDll->DllName, DllName);
+ RtlInitUnicodeString (& pCsrServerDll->DllEntryPoint,
DllEntryPoint);
+ return rc;
+}
+/**********************************************************************
+ * CsrpSplitSharedSection/2 PRIVATE
+ *
+ * RETURN VALUE
+ * 0: syntax error
+ * 1: PortSectionSize (required)
+ * 2: PortSection,InteractiveDesktopHeap
+ * 3: PortSection,InteractiveDesktopHeap,NonInteractiveDesktopHeap
+ */
+static INT STDCALL CsrpSplitSharedSection (LPWSTR SharedSection,
PCSR_ARGUMENT_ITEM pItem)
+{
+ LPWSTR PortSectionSize = NULL;
+ LPWSTR InteractiveDesktopHeapSize = NULL;
+ LPWSTR NonInteractiveDesktopHeapSize = NULL;
+ INT rc = 1;
+
+ DPRINT("CSRSRV:%s(%S) called\n", __FUNCTION__, SharedSection);
+
+ if(L'\0' == *SharedSection)
+ {
+ DPRINT("CSRSRV:%s(%S): *SharedSection == L'\\0'\n",
__FUNCTION__, SharedSection);
+ return 0;
+ }
+
+ // PortSectionSize (required)
+ PortSectionSize = SharedSection;
+ // InteractiveDesktopHeapSize (optional)
+ InteractiveDesktopHeapSize = wcschr (PortSectionSize, L',');
+ if (NULL == InteractiveDesktopHeapSize)
+ {
+ // Default value is 128k
+ InteractiveDesktopHeapSize = L"128";
+ } else {
+ rc = 2;
+ }
+ // NonInteractiveDesktopHeapSize (optional)
+ NonInteractiveDesktopHeapSize = wcschr
(InteractiveDesktopHeapSize, L',');
+ if (NULL == NonInteractiveDesktopHeapSize)
+ {
+ // Default value equals interactive one
+ NonInteractiveDesktopHeapSize =
InteractiveDesktopHeapSize;
+ } else {
+ rc = 3;
+ }
+ // OK - normalization
+ pItem->Item.SharedSection.PortSectionSize = wcstoul
(PortSectionSize, NULL, 10);
+ if (pItem->Item.SharedSection.PortSectionSize < 64)
+ {
+ pItem->Item.SharedSection.PortSectionSize = 64;
+ }
+ pItem->Item.SharedSection.InteractiveDesktopHeapSize = wcstoul
(InteractiveDesktopHeapSize, NULL, 10);
+ if (pItem->Item.SharedSection.InteractiveDesktopHeapSize < 128)
+ {
+ pItem->Item.SharedSection.InteractiveDesktopHeapSize =
128;
+ }
+ pItem->Item.SharedSection.NonInteractiveDesktopHeapSize =
wcstoul (NonInteractiveDesktopHeapSize, NULL, 10);
+ if (pItem->Item.SharedSection.NonInteractiveDesktopHeapSize <
128)
+ {
+ pItem->Item.SharedSection.NonInteractiveDesktopHeapSize
= 128;
+ }
+ // done
+ return rc;
+}
+/**********************************************************************
+ * CsrpParseArgumentItem/1 PRIVATE
+ *
+ * DESCRIPTION
+ *
+ * ARGUMENTS
+ * Argument: argument to decode;
+ *
+ * RETURN VALUE
+ * STATUS_SUCCESS; otherwise, STATUS_UNSUCCESSFUL and
+ * pItem->Type = CSRAT_UNKNOWN.
+ *
+ * NOTE
+ * The command line could be as complex as the following one,
+ * which is the original command line for the Win32 subsystem
+ * in NT 5.1:
+ *
+ * %SystemRoot%\system32\csrss.exe
+ * ObjectDirectory=\Windows
+ * SharedSection=1024,3072,512
+ * Windows=On
+ * SubSystemType=Windows
+ * ServerDll=basesrv,1
+ * ServerDll=winsrv:UserServerDllInitialization,3
+ * ServerDll=winsrv:ConServerDllInitialization,2
+ * ProfileControl=Off
+ * MaxRequestThreads=16
+ */
+static NTSTATUS FASTCALL CsrpParseArgumentItem (IN OUT
PCSR_ARGUMENT_ITEM pItem)
+{
+ NTSTATUS Status = STATUS_SUCCESS;
+ LPWSTR ParameterName = NULL;
+ LPWSTR ParameterValue = NULL;
+
+ pItem->Type = CSRAT_UNKNOWN;
+
+ if(0 == pItem->Data.Length)
+ {
+ DPRINT1("CSRSRV:%s: (0 == Data.Length)!\n",
__FUNCTION__);
+ return STATUS_INVALID_PARAMETER;
+ }
+ //--- Seek '=' to split name and value
+ ParameterName = pItem->Data.Buffer;
+ ParameterValue = wcschr (ParameterName, L'=');
+ if (NULL == ParameterValue)
+ {
+ DPRINT1("CSRSRV:%s: (NULL == ParameterValue)!\n",
__FUNCTION__);
+ return STATUS_INVALID_PARAMETER;
+ }
+ *ParameterValue++ = L'\0';
+ DPRINT("Name=%S, Value=%S\n", ParameterName, ParameterValue);
+ //---
+ if(0 == wcscmp(ParameterName, L"ObjectDirectory"))
+ {
+ RtlInitUnicodeString (& pItem->Item.ObjectDirectory,
ParameterValue);
+ pItem->Type = CSRAT_OBJECT_DIRECTORY;
+ }
+ else if(0 == wcscmp(ParameterName, L"SubSystemType"))
+ {
+ pItem->Type = CSRAT_SUBSYSTEM_TYPE;
+ pItem->Item.Windows = CsrpStringToBool (ParameterValue,
L"Windows", L"Text");
+ }
+ else if(0 == wcscmp(ParameterName, L"MaxRequestThreads"))
+ {
+ pItem->Item.MaxRequestThreads = (USHORT) wcstoul
(ParameterValue, NULL, 10);
+ pItem->Type = CSRAT_REQUEST_THREADS_MAX;
+ }
+ else if(0 == wcscmp(ParameterName, L"RequestThreads"))
+ {
+ // ROS Extension
+ pItem->Item.RequestThreads = (USHORT) wcstoul
(ParameterValue, NULL, 10);
+ pItem->Type = CSRAT_REQUEST_THREADS;
+ }
+ else if(0 == wcscmp(ParameterName, L"ProfileControl"))
+ {
+ pItem->Item.ProfileControl = CsrpStringToBool
(ParameterValue, L"On", L"Off");
+ pItem->Type = CSRAT_PROFILE_CONTROL;
+ }
+ else if(0 == wcscmp(ParameterName, L"SharedSection"))
+ {
+ if (0 != CsrpSplitSharedSection(ParameterValue, pItem))
+ {
+ pItem->Type = CSRAT_SHARED_SECTION;
+ } else {
+ pItem->Type = CSRAT_UNKNOWN;
+ return STATUS_INVALID_PARAMETER;
+ }
+ }
+ else if(0 == wcscmp(ParameterName, L"ServerDll"))
+ {
+ if (0 != CsrpSplitServerDll(ParameterValue, pItem))
+ {
+ pItem->Type = CSRAT_SERVER_DLL;
+ } else {
+ pItem->Type = CSRAT_UNKNOWN;
+ return STATUS_INVALID_PARAMETER;
+ }
+ }
+ else if(0 == wcscmp(ParameterName, L"Windows"))
+ {
+ pItem->Item.Windows = CsrpStringToBool (ParameterValue,
L"On", L"Off");
+ pItem->Type = CSRAT_WINDOWS;
+ }
+ else if(0 == wcscmp(ParameterName, L"Sessions"))
+ {
+ // ROS Extension
+ pItem->Item.Sessions = CsrpStringToBool (ParameterValue,
L"On", L"Off");
+ pItem->Type = CSRAT_SESSIONS;
+ }
+ else
+ {
+ DPRINT1("CSRSRV:%s: unknown parameter '%S'!\n",
__FUNCTION__, ParameterName);
+ pItem->Type = CSRAT_UNKNOWN;
+ Status = STATUS_INVALID_PARAMETER;
+ }
+ return Status;
+}
+/**********************************************************************
+ * CsrServerInitialization/2
+ *
+ * DESCRIPTION
+ * Every environment subsystem implicitly starts where this
+ * routines stops. This routine is called by CSR on startup
+ * and then it calls the entry points in the following server
+ * DLLs, as per command line.
+ *
+ * ARGUMENTS
+ * ArgumentCount:
+ * Argument:
+ *
+ * RETURN VALUE
+ * STATUS_SUCCESS if it succeeds. Otherwise a status code.
+ *
+ * NOTE
+ * This is the only function explicitly called by csr.exe.
+ */
+NTSTATUS STDCALL CsrServerInitialization (ULONG ArgumentCount,
+ LPWSTR *Argument)
+{
+ NTSTATUS Status = STATUS_SUCCESS;
+ ULONG ArgumentIndex = 0;
+ CSR_ARGUMENT_ITEM ArgumentItem = {CSRAT_UNKNOWN,};
+
+ // get registry bootstrap options
+ for (ArgumentIndex = 0; ArgumentIndex < ArgumentCount;
ArgumentIndex++)
+ {
+ RtlInitUnicodeString (& ArgumentItem.Data,
Argument[ArgumentIndex]);
+ Status = CsrpParseArgumentItem (& ArgumentItem);
+ if (NT_SUCCESS(Status))
+ {
+ switch (ArgumentItem.Type)
+ {
+ case CSRAT_UNKNOWN:
+ // ignore unknown parameters
+ DPRINT1("CSRSRV: ignoring param '%s'\n",
Argument[ArgumentIndex]);
+ break;
+ case CSRAT_OBJECT_DIRECTORY:
+ RtlDuplicateUnicodeString (1, &
ArgumentItem.Item.ObjectDirectory, & CsrSrvOption.NameSpace.Root);
+ DPRINT("ObjectDirectory: '%S'\n",
CsrSrvOption.NameSpace.Root.Buffer);
+ break;
+ case CSRAT_SUBSYSTEM_TYPE:
+ CsrSrvOption.SubSystemType =
ArgumentItem.Item.SubSystemType;
+ DPRINT("SubSystemType: %u\n",
CsrSrvOption.SubSystemType);
+ break;
+ case CSRAT_REQUEST_THREADS:
+ CsrSrvOption.Threads.RequestCount =
ArgumentItem.Item.RequestThreads;
+ DPRINT("RequestThreads: %u\n",
CsrSrvOption.Threads.RequestCount);
+ break;
+ case CSRAT_REQUEST_THREADS_MAX:
+ CsrSrvOption.Threads.MaxRequestCount =
ArgumentItem.Item.MaxRequestThreads;
+ DPRINT("MaxRequestThreads: %u\n",
CsrSrvOption.Threads.MaxRequestCount);
+ break;
+ case CSRAT_PROFILE_CONTROL:
+ CsrSrvOption.Flag.ProfileControl =
ArgumentItem.Item.ProfileControl;
+ DPRINT("ProfileControl: %u \n",
CsrSrvOption.Flag.ProfileControl);
+ break;
+ case CSRAT_SHARED_SECTION:
+ CsrSrvOption.PortSharedSectionSize
= ArgumentItem.Item.SharedSection.PortSectionSize;
+
CsrSrvOption.Heap.InteractiveDesktopHeapSize =
ArgumentItem.Item.SharedSection.InteractiveDesktopHeapSize;
+
CsrSrvOption.Heap.NonInteractiveDesktopHeapSize =
ArgumentItem.Item.SharedSection.NonInteractiveDesktopHeapSize;
+ DPRINT("SharedSection: %u-%u-%u\n",
+
CsrSrvOption.PortSharedSectionSize,
+
CsrSrvOption.Heap.InteractiveDesktopHeapSize,
+
CsrSrvOption.Heap.NonInteractiveDesktopHeapSize);
+ break;
+ case CSRAT_SERVER_DLL:
+ Status = CsrSrvRegisterServerDll (&
ArgumentItem.Item.ServerDll);
+ if(!NT_SUCCESS(Status))
+ {
+ DPRINT1("CSRSRV:
CsrSrvRegisterServerDll(%S) failed!\n",
+
Argument[ArgumentIndex]);
+ } else {
+ DPRINT("ServerDll: DLL='%S'
Entrypoint='%S' ID=%u\n",
+
ArgumentItem.Item.ServerDll.DllName.Buffer,
+
ArgumentItem.Item.ServerDll.DllEntryPoint.Buffer,
+
ArgumentItem.Item.ServerDll.ServerIndex);
+ }
+ break;
+ case CSRAT_WINDOWS:
+ CsrSrvOption.Flag.Windows =
ArgumentItem.Item.Windows;
+ DPRINT("Windows: %d\n",
CsrSrvOption.Flag.Windows);
+ break;
+ case CSRAT_SESSIONS:
+ CsrSrvOption.Flag.Sessions =
ArgumentItem.Item.Sessions;
+ DPRINT("Sessions: %d\n",
CsrSrvOption.Flag.Sessions);
+ break;
+ default:
+ DPRINT("CSRSRV: unknown
ArgumentItem->Type=%ld!\n", ArgumentItem.Type);
+ }
+ } else {
+ DPRINT1("CSRSRV:%s: CsrpParseArgumentItem(%S)
failed with Status = %08lx\n",
+ __FUNCTION__,
Argument[ArgumentIndex], Status);
+ }
+ }
+ // TODO: verify required
+ Status = CsrSrvBootstrap ();
+ return Status;
+}
+/* EOF */
Property changes on: trunk/reactos/subsys/csr/csrsrv/init.c
___________________________________________________________________
Name: svn:keywords
+ author date id revision
Name: svn:eol-style
+ native
_____
Added: trunk/reactos/subsys/csr/csrsrv/process.c
--- trunk/reactos/subsys/csr/csrsrv/process.c 2005-08-12 12:10:33 UTC
(rev 17322)
+++ trunk/reactos/subsys/csr/csrsrv/process.c 2005-08-12 12:22:02 UTC
(rev 17323)
@@ -0,0 +1,135 @@
+/* $Id$
+ *
+ * subsys/csr/csrsrv/process.c - CSR server - process management
+ *
+ * ReactOS Operating System
+ *
+ * --------------------------------------------------------------------
+ *
+ * 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
+ * Library 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 "srv.h"
+
+//#define NDEBUG
+#include <debug.h>
+
+/* LOCALS */
+
+struct {
+ RTL_CRITICAL_SECTION Lock;
+} Process;
+
+
+
+NTSTATUS STDCALL CsrSrvInitializeProcess (VOID)
+{
+ NTSTATUS Status = STATUS_NOT_IMPLEMENTED;
+
+ DPRINT("CSRSRV: %s called\n", __FUNCTION__);
+
+ Status = RtlInitializeCriticalSection (& Process.Lock);
+ if(NT_SUCCESS(Status))
+ {
+ // more process management initialization
+ }
+ return Status;
+}
+
+/*=====================================================================
+ * PUBLIC API
+ *===================================================================*/
+
+NTSTATUS STDCALL CsrCreateProcess (PCSR_SESSION pCsrSession,
PCSR_PROCESS * ppCsrProcess)
+{
+ NTSTATUS Status = STATUS_SUCCESS;
+ PCSR_PROCESS pCsrProcess = NULL;
+
+ DPRINT("CSRSRV: %s called\n", __FUNCTION__);
+
+ pCsrProcess = RtlAllocateHeap (pCsrSession->Heap,
+ HEAP_ZERO_MEMORY,
+ sizeof (CSR_PROCESS));
+ if (NULL == pCsrProcess)
+ {
+ Status = STATUS_NO_MEMORY;
+ } else {
+ pCsrProcess->CsrSession = pCsrSession;
+ if (NULL != ppCsrProcess)
+ {
+ *ppCsrProcess = pCsrProcess;
+ }
+ }
+ return Status;
+}
+
+NTSTATUS STDCALL CsrDereferenceProcess (PCSR_PROCESS pCsrProcess)
+{
+ NTSTATUS Status = STATUS_NOT_IMPLEMENTED;
+
+ DPRINT("CSRSRV: %s called\n", __FUNCTION__);
+ return Status;
+}
+
+NTSTATUS STDCALL CsrDestroyProcess (PCSR_PROCESS pCsrProcess)
+{
+ NTSTATUS Status = STATUS_NOT_IMPLEMENTED;
+
+ DPRINT("CSRSRV: %s called\n", __FUNCTION__);
+ return Status;
+}
+
+NTSTATUS STDCALL CsrGetProcessLuid (PCSR_PROCESS pCsrProcess, PLUID
pLuid)
+{
+ NTSTATUS Status = STATUS_NOT_IMPLEMENTED;
+
+ DPRINT("CSRSRV: %s called\n", __FUNCTION__);
+ return Status;
+}
+
+NTSTATUS STDCALL CsrLockProcessByClientId ()
+{
+ NTSTATUS Status = STATUS_NOT_IMPLEMENTED;
+
+ DPRINT("CSRSRV: %s called\n", __FUNCTION__);
+ return Status;
+}
+
+NTSTATUS STDCALL CsrShutdownProcesses (PCSR_SESSION pCsrSession
OPTIONAL)
+{
+ NTSTATUS Status = STATUS_NOT_IMPLEMENTED;
+
+ DPRINT("CSRSRV: %s called\n", __FUNCTION__);
+
+ if (NULL == pCsrSession)
+ {
+ // TODO: shutdown every session
+ } else {
+ // TODO: shutdown every process in pCsrSession
+ }
+ return Status;
+}
+
+NTSTATUS STDCALL CsrUnlockProcess (PCSR_PROCESS pCsrProcess)
+{
+ NTSTATUS Status = STATUS_NOT_IMPLEMENTED;
+
+ DPRINT("CSRSRV: %s called\n", __FUNCTION__);
+ return Status;
+}
+
+/* EOF */
[truncated at 1000 lines; 1596 more skipped]