From 6d095fd4bbe3b436935e83bc5ef1adae5438e352 Mon Sep 17 00:00:00 2001 From: Emanuele Aliberti Date: Fri, 12 Aug 2005 12:22:02 +0000 Subject: [PATCH] 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) svn path=/trunk/; revision=17323 --- reactos/subsys/csr/args.c | 126 ++++++++ reactos/subsys/csr/csr.h | 34 ++ reactos/subsys/csr/csr.rc | 4 + reactos/subsys/csr/csr.xml | 14 + reactos/subsys/csr/csrsrv/csrsrv.def | 37 +++ reactos/subsys/csr/csrsrv/csrsrv.rc | 5 + reactos/subsys/csr/csrsrv/csrsrv.xml | 17 + reactos/subsys/csr/csrsrv/debug.c | 53 +++ reactos/subsys/csr/csrsrv/dllmain.c | 33 ++ reactos/subsys/csr/csrsrv/init.c | 427 +++++++++++++++++++++++++ reactos/subsys/csr/csrsrv/process.c | 135 ++++++++ reactos/subsys/csr/csrsrv/server.c | 364 +++++++++++++++++++++ reactos/subsys/csr/csrsrv/session.c | 178 +++++++++++ reactos/subsys/csr/csrsrv/srv.h | 72 +++++ reactos/subsys/csr/csrsrv/thread.c | 115 +++++++ reactos/subsys/csr/csrsrv/wait.c | 72 +++++ reactos/subsys/csr/main.c | 104 ++++++ reactos/subsys/win/basesrv/basesrv.def | 6 + reactos/subsys/win/basesrv/basesrv.h | 14 + reactos/subsys/win/basesrv/basesrv.rc | 5 + reactos/subsys/win/basesrv/basesrv.xml | 12 + reactos/subsys/win/basesrv/init.c | 74 +++++ reactos/subsys/win/basesrv/main.c | 45 +++ reactos/subsys/win/basesrv/server.c | 43 +++ reactos/subsys/win/directory.xml | 6 + reactos/subsys/win/winsrv/dllmain.c | 45 +++ reactos/subsys/win/winsrv/init.c | 131 ++++++++ reactos/subsys/win/winsrv/server.c | 32 ++ reactos/subsys/win/winsrv/winsrv.def | 6 + reactos/subsys/win/winsrv/winsrv.h | 15 + reactos/subsys/win/winsrv/winsrv.rc | 4 + reactos/subsys/win/winsrv/winsrv.xml | 16 + 32 files changed, 2244 insertions(+) create mode 100644 reactos/subsys/csr/args.c create mode 100644 reactos/subsys/csr/csr.h create mode 100644 reactos/subsys/csr/csr.rc create mode 100644 reactos/subsys/csr/csr.xml create mode 100644 reactos/subsys/csr/csrsrv/csrsrv.def create mode 100644 reactos/subsys/csr/csrsrv/csrsrv.rc create mode 100644 reactos/subsys/csr/csrsrv/csrsrv.xml create mode 100644 reactos/subsys/csr/csrsrv/debug.c create mode 100644 reactos/subsys/csr/csrsrv/dllmain.c create mode 100644 reactos/subsys/csr/csrsrv/init.c create mode 100644 reactos/subsys/csr/csrsrv/process.c create mode 100644 reactos/subsys/csr/csrsrv/server.c create mode 100644 reactos/subsys/csr/csrsrv/session.c create mode 100644 reactos/subsys/csr/csrsrv/srv.h create mode 100644 reactos/subsys/csr/csrsrv/thread.c create mode 100644 reactos/subsys/csr/csrsrv/wait.c create mode 100644 reactos/subsys/csr/main.c create mode 100644 reactos/subsys/win/basesrv/basesrv.def create mode 100644 reactos/subsys/win/basesrv/basesrv.h create mode 100644 reactos/subsys/win/basesrv/basesrv.rc create mode 100644 reactos/subsys/win/basesrv/basesrv.xml create mode 100644 reactos/subsys/win/basesrv/init.c create mode 100644 reactos/subsys/win/basesrv/main.c create mode 100644 reactos/subsys/win/basesrv/server.c create mode 100644 reactos/subsys/win/directory.xml create mode 100644 reactos/subsys/win/winsrv/dllmain.c create mode 100644 reactos/subsys/win/winsrv/init.c create mode 100644 reactos/subsys/win/winsrv/server.c create mode 100644 reactos/subsys/win/winsrv/winsrv.def create mode 100644 reactos/subsys/win/winsrv/winsrv.h create mode 100644 reactos/subsys/win/winsrv/winsrv.rc create mode 100644 reactos/subsys/win/winsrv/winsrv.xml diff --git a/reactos/subsys/csr/args.c b/reactos/subsys/csr/args.c new file mode 100644 index 00000000000..15b2f6d1ad0 --- /dev/null +++ b/reactos/subsys/csr/args.c @@ -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 + +/********************************************************************** + * 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; iCount; 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 */ diff --git a/reactos/subsys/csr/csr.h b/reactos/subsys/csr/csr.h new file mode 100644 index 00000000000..5b6a33aecce --- /dev/null +++ b/reactos/subsys/csr/csr.h @@ -0,0 +1,34 @@ +#if !defined(_INCLUDE_CSR_H) +#define _INCLUDE_CSR_H + +/* PSDK/NDK Headers */ +#include +#include + +#define NTOS_MODE_USER +#include + +#include + + +#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 */ + diff --git a/reactos/subsys/csr/csr.rc b/reactos/subsys/csr/csr.rc new file mode 100644 index 00000000000..c5d32a1013d --- /dev/null +++ b/reactos/subsys/csr/csr.rc @@ -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 diff --git a/reactos/subsys/csr/csr.xml b/reactos/subsys/csr/csr.xml new file mode 100644 index 00000000000..fc4534b00d9 --- /dev/null +++ b/reactos/subsys/csr/csr.xml @@ -0,0 +1,14 @@ + + . + + 0x0600 + 0x0501 + ntdll + csrsrv + main.c + args.c + csr.rc + + + + diff --git a/reactos/subsys/csr/csrsrv/csrsrv.def b/reactos/subsys/csr/csrsrv/csrsrv.def new file mode 100644 index 00000000000..1a1f066b93f --- /dev/null +++ b/reactos/subsys/csr/csrsrv/csrsrv.def @@ -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 diff --git a/reactos/subsys/csr/csrsrv/csrsrv.rc b/reactos/subsys/csr/csrsrv/csrsrv.rc new file mode 100644 index 00000000000..658072d09b8 --- /dev/null +++ b/reactos/subsys/csr/csrsrv/csrsrv.rc @@ -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 diff --git a/reactos/subsys/csr/csrsrv/csrsrv.xml b/reactos/subsys/csr/csrsrv/csrsrv.xml new file mode 100644 index 00000000000..727f78d605a --- /dev/null +++ b/reactos/subsys/csr/csrsrv/csrsrv.xml @@ -0,0 +1,17 @@ + + + . + . + + + ntdll + debug.c + dllmain.c + init.c + process.c + server.c + session.c + thread.c + wait.c + csrsrv.rc + diff --git a/reactos/subsys/csr/csrsrv/debug.c b/reactos/subsys/csr/csrsrv/debug.c new file mode 100644 index 00000000000..c5c9abdc881 --- /dev/null +++ b/reactos/subsys/csr/csrsrv/debug.c @@ -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 + +/*===================================================================== + * 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 */ diff --git a/reactos/subsys/csr/csrsrv/dllmain.c b/reactos/subsys/csr/csrsrv/dllmain.c new file mode 100644 index 00000000000..483aacfac82 --- /dev/null +++ b/reactos/subsys/csr/csrsrv/dllmain.c @@ -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 + +HANDLE CsrSrvDllHandle = 0; + +/* FUNCTIONS *****************************************************************/ + +BOOL STDCALL +DllMain(HANDLE hDll, + DWORD dwReason, + LPVOID lpReserved) +{ + if (DLL_PROCESS_ATTACH == dwReason) + { + CsrSrvDllHandle = hDll; + } + + return TRUE; +} + +/* EOF */ diff --git a/reactos/subsys/csr/csrsrv/init.c b/reactos/subsys/csr/csrsrv/init.c new file mode 100644 index 00000000000..2b287626452 --- /dev/null +++ b/reactos/subsys/csr/csrsrv/init.c @@ -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 + + +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 */ diff --git a/reactos/subsys/csr/csrsrv/process.c b/reactos/subsys/csr/csrsrv/process.c new file mode 100644 index 00000000000..6ccaa24ac36 --- /dev/null +++ b/reactos/subsys/csr/csrsrv/process.c @@ -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 + +/* 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 */ diff --git a/reactos/subsys/csr/csrsrv/server.c b/reactos/subsys/csr/csrsrv/server.c new file mode 100644 index 00000000000..543aaced35f --- /dev/null +++ b/reactos/subsys/csr/csrsrv/server.c @@ -0,0 +1,364 @@ +/* $Id$ + * + * subsys/csr/csrsrv/server.c - CSR server - subsystem default server + * + * 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 + +typedef struct _CSRSRV_SERVER_DLL +{ + USHORT ServerIndex; + USHORT Sequence; // initialization order + UNICODE_STRING DllName; + UNICODE_STRING DllEntryPoint; + CSR_SERVER_THREAD ServerThread; // NULL ==> inactive + +} CSRSRV_SERVER_DLL, *PCSRSRV_SERVER_DLL; + +/*===================================================================== + * GLOBALS + *===================================================================*/ + +CSRSRV_OPTION CsrSrvOption; + +HANDLE CsrSrvApiPortHandle = (HANDLE) 0; + +/*===================================================================== + * LOCALS + *===================================================================*/ + +static HANDLE CsrSrvSbApiPortHandle = (HANDLE) 0; + +static CSRSRV_SERVER_DLL ServerThread [CSR_SERVER_DLL_MAX]; + +VOID CALLBACK CsrSrvServerThread (PVOID); + +/********************************************************************** + * CsrSrvRegisterServerDll/1 + */ +NTSTATUS STDCALL CsrSrvRegisterServerDll (PCSR_SERVER_DLL pServerDll) +{ + static USHORT NextInSequence = 0; + USHORT ServerIndex = 0; + + // 1st call? + if (0 == NextInSequence) + { + RtlZeroMemory (ServerThread, sizeof ServerThread); + } + // We can not register more than CSR_SERVER_DLL_MAX servers. + // Note: # servers >= # DLLs (MS Win32 has 3 servers in 2 DLLs). + if (NextInSequence >= CSR_SERVER_DLL_MAX) + { + return STATUS_NO_MEMORY; + } + // Validate the ServerIndex from the command line: + // it may be 0, 1, 2, or 3. + ServerIndex = pServerDll->ServerIndex; + if (ServerIndex >= CSR_SERVER_DLL_MAX) + { + return STATUS_INVALID_PARAMETER; + } + // Register the DLL server. + ServerThread [ServerIndex].ServerIndex = ServerIndex; + ServerThread [ServerIndex].Sequence = NextInSequence ++; + if (0 != ServerIndex) + { + RtlDuplicateUnicodeString (1, & pServerDll->DllName, & ServerThread [ServerIndex].DllName); + RtlDuplicateUnicodeString (1, & pServerDll->DllEntryPoint, & ServerThread [ServerIndex].DllEntryPoint); + } else { + // CSRSRV.DLL own static server thread + ServerThread [ServerIndex].ServerThread = CsrSrvServerThread; + } + return STATUS_SUCCESS; +} +/********************************************************************** + * CsrpCreateObjectDirectory/1 PRIVATE + */ +NTSTATUS STDCALL CsrpCreateObjectDirectory (PUNICODE_STRING pObjectDirectory) +{ + NTSTATUS Status = STATUS_SUCCESS; + OBJECT_ATTRIBUTES DirectoryAttributes; + + DPRINT("CSRSRV:%s(%S) called\n", __FUNCTION__, pObjectDirectory->Buffer); + + InitializeObjectAttributes (& DirectoryAttributes, + pObjectDirectory, + OBJ_OPENIF, + NULL, + NULL); + + Status = NtCreateDirectoryObject (& CsrSrvOption.NameSpace.RootHandle, + (DIRECTORY_CREATE_OBJECT|DIRECTORY_CREATE_SUBDIRECTORY), + & DirectoryAttributes); + if (NT_SUCCESS(Status)) + { + Status = RtlDuplicateUnicodeString (0, pObjectDirectory, & CsrSrvOption.NameSpace.Root); + if (!NT_SUCCESS(Status)) + { + DPRINT1("CSRSRV:%s: RtlDuplicateUnicodeString failed (Status=0x%08lx)\n", + __FUNCTION__, Status); + } + } else { + DPRINT1("CSRSRV:%s: fatal: NtCreateDirectoryObject failed (Status=0x%08lx)\n", + __FUNCTION__, Status); + } + return Status; +} +/********************************************************************** + * CsrSrvBootstrap/0 + * + * DESCRIPTION + * This is where a subsystem begins living. + */ +NTSTATUS STDCALL CsrSrvBootstrap (VOID) +{ + NTSTATUS Status = STATUS_SUCCESS; + ULONG ServerIndex = 0; + ULONG ServerSequence = 0; + + DPRINT("CSRSRV: %s called\n", __FUNCTION__); + + CsrSrvSbApiPortHandle = CsrSrvSbApiPortHandle; //FIXME + + // OBJECT DIRECTORY + Status = CsrpCreateObjectDirectory (& CsrSrvOption.NameSpace.Root); + if(!NT_SUCCESS(Status)) + { + DPRINT1("CSRSRV:%s: CsrpCreateObjectDirectory failed (Status=%08lx)\n", + __FUNCTION__, Status); + return Status; + } + // SESSIONS + Status = CsrSrvInitializeSession (); + if(!NT_SUCCESS(Status)) + { + DPRINT1("CSRSRV:%s: CsrSrvInitializeSession failed (Status=%08lx)\n", + __FUNCTION__, Status); + return Status; + } + // PROCESSES + // TODO + // THREADS + // TODO + // WAITS + // TODO + // Hosted servers + for (ServerSequence = 0; ServerSequence < CSR_SERVER_DLL_MAX; ServerSequence ++) + { + for (ServerIndex = 0; (ServerIndex < CSR_SERVER_DLL_MAX); ++ ServerIndex) + { + if (ServerSequence == ServerThread [ServerIndex].Sequence) + { + if (NULL == ServerThread [ServerIndex].ServerThread) + { + //TODO: load DLL and call ServerDllInitialize + } + } + } + } + return Status; +} +/********************************************************************** + * CsrSrvServerThread/1 + * + * DESCRIPTION + * This is actually a function called by the CsrSrvMainServerThread + * when the server index is 0. Other server DLLs register their + * function with CsrAddStaticServerThread. + */ +VOID STDCALL CsrSrvServerThread (PVOID x) +{ + NTSTATUS Status = STATUS_SUCCESS; + PPORT_MESSAGE Request = (PPORT_MESSAGE) x; + PPORT_MESSAGE Reply = NULL; + ULONG MessageType = 0; + + DPRINT("CSRSRV: %s called\n", __FUNCTION__); + + MessageType = Request->u2.s2.Type; + DPRINT("CSRSRV: %s received a message (Type=%d)\n", + __FUNCTION__, MessageType); + switch (MessageType) + { + //TODO + default: + Reply = Request; + Status = NtReplyPort (CsrSrvApiPortHandle, Reply); + break; + } +} + +/********************************************************************** + * PUBLIC API + *********************************************************************/ + +/********************************************************************** + * CsrAddStaticServerThread/1 + */ +NTSTATUS STDCALL CsrAddStaticServerThread (CSR_SERVER_THREAD ServerThread) +{ + static ULONG StaticServerThreadCount = 0; + NTSTATUS Status = STATUS_NOT_IMPLEMENTED; + + DPRINT("CSRSRV: %s(%08lx) called\n", __FUNCTION__, ServerThread); + + if (StaticServerThreadCount > CSR_SERVER_DLL_MAX) + { + DPRINT1("CSRSRV: subsystem tries to add mode than %d static threads!\n", + CSR_SERVER_DLL_MAX); + return STATUS_NO_MEMORY; + } + if (NT_SUCCESS(Status)) + { + // FIXME: do we need to make it reentrant? + ++ StaticServerThreadCount; + } + return Status; +} + +/********************************************************************** + * CsrCallServerFromServer + */ +NTSTATUS STDCALL CsrCallServerFromServer () +{ + NTSTATUS Status = STATUS_NOT_IMPLEMENTED; + + DPRINT("CSRSRV: %s called\n", __FUNCTION__); + return Status; +} + +/********************************************************************** + * CsrExecServerThread + */ +NTSTATUS STDCALL CsrExecServerThread () +{ + NTSTATUS Status = STATUS_NOT_IMPLEMENTED; + + DPRINT("CSRSRV: %s called\n", __FUNCTION__); + return Status; +} + +/********************************************************************** + * CsrImpersonateClient + */ +NTSTATUS STDCALL CsrImpersonateClient () +{ + NTSTATUS Status = STATUS_NOT_IMPLEMENTED; + + DPRINT("CSRSRV: %s called\n", __FUNCTION__); + return Status; +} + +/********************************************************************** + * CsrQueryApiPort/0 + * + * @implemented + */ +HANDLE STDCALL CsrQueryApiPort (VOID) +{ + DPRINT("CSRSRV: %s called\n", __FUNCTION__); + return CsrSrvApiPortHandle; +} + +/********************************************************************** + * CsrRevertToSelf + */ +NTSTATUS STDCALL CsrRevertToSelf () +{ + NTSTATUS Status = STATUS_NOT_IMPLEMENTED; + + DPRINT("CSRSRV: %s called\n", __FUNCTION__); + return Status; +} + +/********************************************************************** + * CsrSetBackgroundPriority + */ +NTSTATUS STDCALL CsrSetBackgroundPriority () +{ + NTSTATUS Status = STATUS_NOT_IMPLEMENTED; + + DPRINT("CSRSRV: %s called\n", __FUNCTION__); + return Status; +} + +/********************************************************************** + * CsrSetCallingSpooler + */ +NTSTATUS STDCALL CsrSetCallingSpooler () +{ + NTSTATUS Status = STATUS_NOT_IMPLEMENTED; + + DPRINT("CSRSRV: %s called\n", __FUNCTION__); + return Status; +} + +/********************************************************************** + * CsrSetForegroundPriority + */ +NTSTATUS STDCALL CsrSetForegroundPriority () +{ + NTSTATUS Status = STATUS_NOT_IMPLEMENTED; + + DPRINT("CSRSRV: %s called\n", __FUNCTION__); + return Status; +} + +/********************************************************************** + * CsrUnhandledExceptionFilter + */ +NTSTATUS STDCALL CsrUnhandledExceptionFilter () +{ + NTSTATUS Status = STATUS_NOT_IMPLEMENTED; + + DPRINT("CSRSRV: %s called\n", __FUNCTION__); + return Status; +} + +/********************************************************************** + * CsrValidateMessageBuffer + */ +NTSTATUS STDCALL CsrValidateMessageBuffer () +{ + NTSTATUS Status = STATUS_NOT_IMPLEMENTED; + + DPRINT("CSRSRV: %s called\n", __FUNCTION__); + return Status; +} + +/********************************************************************** + * CsrValidateMessageString + */ +NTSTATUS STDCALL CsrValidateMessageString () +{ + NTSTATUS Status = STATUS_NOT_IMPLEMENTED; + + DPRINT("CSRSRV: %s called\n", __FUNCTION__); + return Status; +} + +/* EOF */ diff --git a/reactos/subsys/csr/csrsrv/session.c b/reactos/subsys/csr/csrsrv/session.c new file mode 100644 index 00000000000..59c4eae3709 --- /dev/null +++ b/reactos/subsys/csr/csrsrv/session.c @@ -0,0 +1,178 @@ +/* $Id$ + * + * subsys/csr/csrsrv/session.c - CSR server - session 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 + +//TODO: when CsrSrvSessionsFlag is FALSE, create just one session and +//TODO: fail for more sessions requests. + +/* LOCALS */ + +struct { + RTL_CRITICAL_SECTION Lock; + HANDLE Heap; + ULONG LastUnusedId; +} Session; + + + +NTSTATUS STDCALL CsrSrvInitializeSession (VOID) +{ + NTSTATUS Status = STATUS_NOT_IMPLEMENTED; + + DPRINT("CSRSRV: %s called\n", __FUNCTION__); + + Status = RtlInitializeCriticalSection (& Session.Lock); + if (NT_SUCCESS(Status)) + { + Session.Heap = RtlCreateHeap (HEAP_GROWABLE, + NULL, + 65536, + 65536, + NULL, + NULL); + if (NULL == Session.Heap) + { + RtlDeleteCriticalSection (& Session.Lock); + Status = STATUS_NO_MEMORY; + } + Session.LastUnusedId = 0; + } + return Status; +} + +static NTSTATUS STDCALL CsrpCreateSessionDirectories (PCSR_SESSION pCsrSession) +{ + NTSTATUS Status = STATUS_SUCCESS; + CHAR SessionIdBuffer [8]; + ANSI_STRING SessionIdNameA; + UNICODE_STRING SessionIdNameW; + UNICODE_STRING SessionDirectoryName; + OBJECT_ATTRIBUTES DirectoryAttributes; + HANDLE DirectoryHAndle; + + DPRINT("CSRSRV: %s(%08lx) called\n", __FUNCTION__, pCsrSession); + + sprintf (SessionIdBuffer, "\\Sessions\\%ld", pCsrSession->SessionId); + RtlInitAnsiString (& SessionIdNameA, SessionIdBuffer); + RtlAnsiStringToUnicodeString (& SessionIdNameW, & SessionIdNameA, TRUE); + RtlCopyUnicodeString (& SessionDirectoryName, & CsrSrvOption.NameSpace.Root); + RtlAppendUnicodeStringToString (& SessionDirectoryName, & SessionIdNameW); + + DPRINT("CSRSRV: %s(%08lx): %S\n", __FUNCTION__, pCsrSession, + SessionDirectoryName.Buffer); + + InitializeObjectAttributes (& DirectoryAttributes, + & SessionDirectoryName, + OBJ_OPENIF, + NULL, + NULL); + Status = NtCreateDirectoryObject (& DirectoryHAndle, + (DIRECTORY_CREATE_OBJECT|DIRECTORY_CREATE_SUBDIRECTORY), + & DirectoryAttributes); + if (NT_SUCCESS(Status)) + { + DPRINT1("CSRSRV: session %ld root directory not created (Status=%08lx)\n", + pCsrSession->SessionId, Status); + } + // TODO + return Status; +} + +static NTSTATUS STDCALL CsrpDestroySessionDirectories (PCSR_SESSION pCsrSession) +{ + DPRINT("CSRSRV: %s called\n", __FUNCTION__); + + return STATUS_NOT_IMPLEMENTED; +} + +/*===================================================================== + * PUBLIC API + *===================================================================*/ + +NTSTATUS STDCALL CsrDestroySession (PCSR_SESSION pCsrSession) +{ + NTSTATUS Status = STATUS_SUCCESS; + + DPRINT("CSRSRV: %s(%08lx) called\n", __FUNCTION__, pCsrSession); + + if (NULL == pCsrSession) + { + Status = STATUS_INVALID_PARAMETER; + } else { + Status = CsrShutdownProcesses (pCsrSession); + Status = CsrpDestroySessionDirectories (pCsrSession); + RtlDestroyHeap (pCsrSession->Heap); + RtlFreeHeap (Session.Heap, 0, pCsrSession); + } + return Status; +} + +NTSTATUS STDCALL CsrCreateSession (PCSR_SESSION * ppCsrSession) +{ + NTSTATUS Status = STATUS_SUCCESS; + PCSR_SESSION pCsrSession = NULL; + + DPRINT("CSRSRV: %s called\n", __FUNCTION__); + + if (NULL == ppCsrSession) + { + Status = STATUS_INVALID_PARAMETER; + } else { + RtlEnterCriticalSection (& Session.Lock); + pCsrSession = RtlAllocateHeap (Session.Heap, + HEAP_ZERO_MEMORY, + sizeof (CSR_SESSION)); + if (NULL == pCsrSession) + { + Status = STATUS_NO_MEMORY; + } else { + pCsrSession->SessionId = Session.LastUnusedId ++; + Status = CsrpCreateSessionDirectories (pCsrSession); + if(NT_SUCCESS(Status)) + { + pCsrSession->Heap = RtlCreateHeap(HEAP_GROWABLE, + NULL, + 65536, + 65536, + NULL, + NULL); + if (NULL == pCsrSession->Heap) + { + Status = STATUS_NO_MEMORY; + CsrpDestroySessionDirectories (pCsrSession); + -- Session.LastUnusedId; + } + } + } + RtlLeaveCriticalSection (& Session.Lock); + } + return Status; +} + +/* EOF */ diff --git a/reactos/subsys/csr/csrsrv/srv.h b/reactos/subsys/csr/csrsrv/srv.h new file mode 100644 index 00000000000..283e8f5ff7e --- /dev/null +++ b/reactos/subsys/csr/csrsrv/srv.h @@ -0,0 +1,72 @@ +#if !defined(_INCLUDE_CSR_CSRSRV_SRV_H) +#define _INCLUDE_CSR_CSRSRV_SRV_H + +/* PSDK/NDK Headers */ +#include +#include + +#define NTOS_MODE_USER +#include + +/* CSR Headers */ +#include + +/* Maximum number of hosted servers, included the one in csrsrv.dll */ +#define CSR_SERVER_DLL_MAX 4 + +typedef enum { + CSRSST_NONE=0, + CSRSST_TEXT, + CSRSST_WINDOWS, + CSRSST_MAX + +} CSR_SUBSYSTEM_TYPE, * PCSR_SUBSYSTEM_TYPE; + +typedef struct _CSR_SERVER_DLL +{ + USHORT ServerIndex; + USHORT Unused; + UNICODE_STRING DllName; + UNICODE_STRING DllEntryPoint; +} CSR_SERVER_DLL, * PCSR_SERVER_DLL; + +/* dllmain.c */ +extern HANDLE CsrSrvDllHandle; + +/* process.c */ + +/* server.c */ +typedef struct +{ + struct { + UNICODE_STRING Root; + HANDLE RootHandle; + } NameSpace; + CSR_SUBSYSTEM_TYPE SubSystemType; + struct { + USHORT RequestCount; + USHORT MaxRequestCount; + } Threads; + struct { + BOOL ProfileControl; + BOOL Windows; + BOOL Sessions; + } Flag; + USHORT PortSharedSectionSize; + struct { + USHORT InteractiveDesktopHeapSize; + USHORT NonInteractiveDesktopHeapSize; + } Heap; +} CSRSRV_OPTION, * PCSRSRV_OPTION; + +extern CSRSRV_OPTION CsrSrvOption; +extern HANDLE CsrSrvApiPortHandle; + +NTSTATUS STDCALL CsrSrvRegisterServerDll (PCSR_SERVER_DLL); +NTSTATUS STDCALL CsrSrvBootstrap (VOID); + +/* session.c */ +NTSTATUS STDCALL CsrSrvInitializeSession (VOID); + + +#endif /* !def _INCLUDE_CSR_CSRSRV_SRV_H */ diff --git a/reactos/subsys/csr/csrsrv/thread.c b/reactos/subsys/csr/csrsrv/thread.c new file mode 100644 index 00000000000..c4dddef54b7 --- /dev/null +++ b/reactos/subsys/csr/csrsrv/thread.c @@ -0,0 +1,115 @@ +/* $Id$ + * + * subsys/csr/csrsrv/thread.c - CSR server - thread 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 + +/*===================================================================== + * PUBLIC API + *===================================================================*/ + +NTSTATUS STDCALL CsrCreateRemoteThread () +{ + NTSTATUS Status = STATUS_NOT_IMPLEMENTED; + + DPRINT("CSRSRV: %s called\n", __FUNCTION__); + + return Status; +} + +NTSTATUS STDCALL CsrCreateThread (PCSR_PROCESS pCsrProcess, PCSR_THREAD *ppCsrThread) +{ + NTSTATUS Status = STATUS_NOT_IMPLEMENTED; + PCSR_THREAD pCsrThread = NULL; + PCSR_SESSION pCsrSession = NULL; + + DPRINT("CSRSRV: %s called\n", __FUNCTION__); + + if (NULL == pCsrProcess || NULL == ppCsrThread) + { + return STATUS_INVALID_PARAMETER; + } + pCsrSession = pCsrProcess->CsrSession; + pCsrThread = RtlAllocateHeap (pCsrSession->Heap, + HEAP_ZERO_MEMORY, + sizeof (CSR_THREAD)); + if (NULL == pCsrThread) + { + DPRINT1("CSRSRV:%s: out of memory!\n", __FUNCTION__); + return STATUS_NO_MEMORY; + } + pCsrThread->CsrSession = pCsrSession; + pCsrThread->CsrProcess = pCsrProcess; + return Status; +} + +NTSTATUS STDCALL CsrDereferenceThread (PCSR_THREAD pCsrThread) +{ + NTSTATUS Status = STATUS_NOT_IMPLEMENTED; + + DPRINT("CSRSRV: %s called\n", __FUNCTION__); + + return Status; +} + +NTSTATUS STDCALL CsrDestroyThread (PCSR_THREAD pCsrThread) +{ + NTSTATUS Status = STATUS_NOT_IMPLEMENTED; + + DPRINT("CSRSRV: %s called\n", __FUNCTION__); + + return Status; +} + +NTSTATUS STDCALL CsrLockThreadByClientId () +{ + NTSTATUS Status = STATUS_NOT_IMPLEMENTED; + + DPRINT("CSRSRV: %s called\n", __FUNCTION__); + + return Status; +} + +NTSTATUS STDCALL CsrReferenceThread (PCSR_THREAD pCsrThread) +{ + NTSTATUS Status = STATUS_NOT_IMPLEMENTED; + + DPRINT("CSRSRV: %s called\n", __FUNCTION__); + + return Status; +} + +NTSTATUS STDCALL CsrUnlockThread (PCSR_THREAD pCsrThread) +{ + NTSTATUS Status = STATUS_NOT_IMPLEMENTED; + + DPRINT("CSRSRV: %s called\n", __FUNCTION__); + + return Status; +} + +/* EOF */ diff --git a/reactos/subsys/csr/csrsrv/wait.c b/reactos/subsys/csr/csrsrv/wait.c new file mode 100644 index 00000000000..e836407ba9d --- /dev/null +++ b/reactos/subsys/csr/csrsrv/wait.c @@ -0,0 +1,72 @@ +/* $Id$ + * + * subsys/csr/csrsrv/wait.c - CSR server - wait 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 + +/*===================================================================== + * PUBLIC API + *===================================================================*/ + +NTSTATUS STDCALL CsrCreateWait (PCSR_THREAD pCsrThread, PCSR_WAIT * ppCsrWait) +{ + NTSTATUS Status = STATUS_NOT_IMPLEMENTED; + + DPRINT("CSRSRV: %s called\n", __FUNCTION__); + + return Status; +} + +NTSTATUS STDCALL CsrDereferenceWait (PCSR_WAIT pCsrWait) +{ + NTSTATUS Status = STATUS_NOT_IMPLEMENTED; + + DPRINT("CSRSRV: %s called\n", __FUNCTION__); + + return Status; +} + +NTSTATUS STDCALL CsrMoveSatisfiedWait (PCSR_WAIT pCsrWait) +{ + NTSTATUS Status = STATUS_NOT_IMPLEMENTED; + + DPRINT("CSRSRV: %s called\n", __FUNCTION__); + + return Status; +} + +NTSTATUS STDCALL CsrNotifyWait (PCSR_WAIT pCsrWait) +{ + NTSTATUS Status = STATUS_NOT_IMPLEMENTED; + + DPRINT("CSRSRV: %s called\n", __FUNCTION__); + + return Status; +} + + +/* EOF */ diff --git a/reactos/subsys/csr/main.c b/reactos/subsys/csr/main.c new file mode 100644 index 00000000000..bbb96de7292 --- /dev/null +++ b/reactos/subsys/csr/main.c @@ -0,0 +1,104 @@ +/* $Id$ + * + * main.c - Client/Server Runtime - entry point + * + * 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. + * + * -------------------------------------------------------------------- + * + * 19990417 (Emanuele Aliberti) + * Do nothing native application skeleton + * 19990528 (Emanuele Aliberti) + * Compiled successfully with egcs 1.1.2 + * 19990605 (Emanuele Aliberti) + * First standalone run under ReactOS (it + * actually does nothing but running). + * 20050329 (Emanuele Aliberti) + * C/S run-time moved to CSRSRV.DLL + * Win32 emulation moved to server DLLs basesrv+winsrv + * (previously code was already in win32csr.dll) + */ +#include "csr.h" + +#define NDEBUG +#include + +COMMAND_LINE_ARGUMENT Argument; + +/* never fail or so */ + +VOID STDCALL CsrpSetDefaultProcessHardErrorMode (VOID) +{ + DWORD DefaultHardErrorMode = 0; + NtSetInformationProcess (NtCurrentProcess(), + ProcessDefaultHardErrorMode, + & DefaultHardErrorMode, + sizeof DefaultHardErrorMode); +} + +/* Native process' entry point */ + +VOID STDCALL NtProcessStartup (PPEB Peb) +{ + NTSTATUS Status = STATUS_SUCCESS; + + /* + * Parse the command line. + */ + Status = CsrParseCommandLine (Peb, & Argument); + if (STATUS_SUCCESS != Status) + { + DPRINT1("CSR: %s: CsrParseCommandLine failed (Status=0x%08lx)\n", + __FUNCTION__, Status); + } + /* + * Initialize the environment subsystem server. + */ + Status = CsrServerInitialization (Argument.Count, Argument.Vector); + if (!NT_SUCCESS(Status)) + { + /* FATAL! */ + DPRINT1("CSR: %s: CSRSRV!CsrServerInitialization failed (Status=0x%08lx)\n", + __FUNCTION__, Status); + + CsrFreeCommandLine (Peb, & Argument); + /* + * Tell the SM we failed. If we are a required + * subsystem, SM will halt the system. + */ + NtTerminateProcess (NtCurrentProcess(), Status); + } + /* + * The server booted OK: never stop on error! + */ + CsrpSetDefaultProcessHardErrorMode (); + /* + * Cleanup command line + */ + CsrFreeCommandLine (Peb, & Argument); + /* + * Terminate the current thread only (server's + * threads that serve the LPC port continue + * running and keep the process alive). + */ + NtTerminateThread (NtCurrentThread(), Status); +} + +/* EOF */ diff --git a/reactos/subsys/win/basesrv/basesrv.def b/reactos/subsys/win/basesrv/basesrv.def new file mode 100644 index 00000000000..ae74aeaf3b6 --- /dev/null +++ b/reactos/subsys/win/basesrv/basesrv.def @@ -0,0 +1,6 @@ +; $Id$ +LIBRARY basesrv.dll +EXPORTS +BaseSetProcessCreateNotify@4 +ServerDllInitialization@8 +; EOF diff --git a/reactos/subsys/win/basesrv/basesrv.h b/reactos/subsys/win/basesrv/basesrv.h new file mode 100644 index 00000000000..20b17d02a8a --- /dev/null +++ b/reactos/subsys/win/basesrv/basesrv.h @@ -0,0 +1,14 @@ +#ifndef _BASESRV_H_INCLUDED_ +#define _BASESRV_H_INCLUDED_ + +/* PSDK/NDK Headers */ +#include +#include + +#define NTOS_MODE_USER +#include + +#include +#include + +#endif /* ndef _BASESRV_H_INCLUDED_ */ diff --git a/reactos/subsys/win/basesrv/basesrv.rc b/reactos/subsys/win/basesrv/basesrv.rc new file mode 100644 index 00000000000..a6032596fc9 --- /dev/null +++ b/reactos/subsys/win/basesrv/basesrv.rc @@ -0,0 +1,5 @@ +#define REACTOS_VERSION_DLL +#define REACTOS_STR_FILE_DESCRIPTION "ReactOS/Win32 base usermode server\0" +#define REACTOS_STR_INTERNAL_NAME "basesrv\0" +#define REACTOS_STR_ORIGINAL_FILENAME "basesrv.dll\0" +#include diff --git a/reactos/subsys/win/basesrv/basesrv.xml b/reactos/subsys/win/basesrv/basesrv.xml new file mode 100644 index 00000000000..e1c3df76345 --- /dev/null +++ b/reactos/subsys/win/basesrv/basesrv.xml @@ -0,0 +1,12 @@ + + + . + include + + ntdll + csrsrv + main.c + init.c + server.c + basesrv.rc + diff --git a/reactos/subsys/win/basesrv/init.c b/reactos/subsys/win/basesrv/init.c new file mode 100644 index 00000000000..1f117e71cb9 --- /dev/null +++ b/reactos/subsys/win/basesrv/init.c @@ -0,0 +1,74 @@ +/* $Id$ + * + * init.c - ReactOS/Win32 base enviroment subsystem server + * + * 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 + * 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 "basesrv.h" + +#define NDEBUG +#include + +HANDLE BaseApiPort = (HANDLE) 0; + +/********************************************************************** + * NAME PRIVATE + * BaseStaticServerThread/1 + */ +VOID STDCALL BaseStaticServerThread (PVOID x) +{ + NTSTATUS Status = STATUS_SUCCESS; + PPORT_MESSAGE Request = (PPORT_MESSAGE) x; + PPORT_MESSAGE Reply = NULL; + ULONG MessageType = 0; + + DPRINT("BASESRV: %s called\n", __FUNCTION__); + + MessageType = Request->u2.s2.Type; + DPRINT("BASESRV: %s received a message (Type=%d)\n", + __FUNCTION__, MessageType); + switch (MessageType) + { + default: + Reply = Request; + Status = NtReplyPort (BaseApiPort, Reply); + break; + } +} + + +NTSTATUS STDCALL ServerDllInitialization (ULONG ArgumentCount, LPWSTR *Argument) +{ + NTSTATUS Status = STATUS_SUCCESS; + + DPRINT("BASSRV: %s(%ld,...) called\n", __FUNCTION__, ArgumentCount); + + BaseApiPort = CsrQueryApiPort (); + Status = CsrAddStaticServerThread (BaseStaticServerThread); + if (NT_SUCCESS(Status)) + { + //TODO initialize the BASE server + } + return STATUS_SUCCESS; +} + +/* EOF */ diff --git a/reactos/subsys/win/basesrv/main.c b/reactos/subsys/win/basesrv/main.c new file mode 100644 index 00000000000..7c719f28ff7 --- /dev/null +++ b/reactos/subsys/win/basesrv/main.c @@ -0,0 +1,45 @@ +/* $Id$ + * + * dllmain.c - ReactOS/Win32 base enviroment subsystem server + * + * 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 + * 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 "basesrv.h" + +#define NDEBUG +#include + +HANDLE DllHandle = 0; + +/* FUNCTIONS *****************************************************************/ + +BOOL STDCALL DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) +{ + if (DLL_PROCESS_ATTACH == dwReason) + { + DllHandle = hDll; + } + + return TRUE; +} + +/* EOF */ diff --git a/reactos/subsys/win/basesrv/server.c b/reactos/subsys/win/basesrv/server.c new file mode 100644 index 00000000000..8e020739981 --- /dev/null +++ b/reactos/subsys/win/basesrv/server.c @@ -0,0 +1,43 @@ +/* $Id$ + * + * server.c - ReactOS/Win32 base enviroment subsystem server + * + * 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 + * 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 "basesrv.h" + +#define NDEBUG +#include + +/*===================================================================== + * PUBLIC API + *===================================================================*/ + +NTSTATUS STDCALL BaseSetProcessCreateNotify (BASE_PROCESS_CREATE_NOTIFY_ROUTINE ProcessCreateNotifyProc) +{ + NTSTATUS Status = STATUS_NOT_IMPLEMENTED; + + DPRINT("BASESRV: %s(%08lx) called\n", __FUNCTION__, ProcessCreateNotifyProc); + return Status; +} + +/* EOF */ diff --git a/reactos/subsys/win/directory.xml b/reactos/subsys/win/directory.xml new file mode 100644 index 00000000000..f87dfb7bbed --- /dev/null +++ b/reactos/subsys/win/directory.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/reactos/subsys/win/winsrv/dllmain.c b/reactos/subsys/win/winsrv/dllmain.c new file mode 100644 index 00000000000..3c1ad7c3b33 --- /dev/null +++ b/reactos/subsys/win/winsrv/dllmain.c @@ -0,0 +1,45 @@ +/* $Id$ + * + * dllmain.c - ReactOS/Win32 Console+User Enviroment Subsystem Server + * + * 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 + * 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 "winsrv.h" + +#define NDEBUG +#include + +HANDLE DllHandle = 0; + +/* FUNCTIONS *****************************************************************/ + +BOOL STDCALL DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) +{ + if (DLL_PROCESS_ATTACH == dwReason) + { + DllHandle = hDll; + } + + return TRUE; +} + +/* EOF */ diff --git a/reactos/subsys/win/winsrv/init.c b/reactos/subsys/win/winsrv/init.c new file mode 100644 index 00000000000..6d1973ff294 --- /dev/null +++ b/reactos/subsys/win/winsrv/init.c @@ -0,0 +1,131 @@ +/* $Id$ + * + * init.c - ReactOS/Win32 Console+User Enviroment Subsystem 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 + * 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 "winsrv.h" + +//#define NDEBUG +#include + +HANDLE WinSrvApiPort = NULL; + +/********************************************************************** + * NAME PRIVATE + * ConStaticServerThread/1 + */ +VOID STDCALL ConStaticServerThread (PVOID x) +{ + NTSTATUS Status = STATUS_SUCCESS; + PPORT_MESSAGE Request = (PPORT_MESSAGE) x; + PPORT_MESSAGE Reply = NULL; + ULONG MessageType = 0; + + DPRINT("WINSRV: %s(%08lx) called\n", __FUNCTION__, x); + + MessageType = Request->u2.s2.Type; + DPRINT("WINSRV: %s(%08lx) received a message (Type=%d)\n", + __FUNCTION__, x, MessageType); + switch (MessageType) + { + default: + Reply = Request; + Status = NtReplyPort (WinSrvApiPort, Reply); + break; + } +} + +/********************************************************************** + * NAME PRIVATE + * UserStaticServerThread/1 + */ +VOID STDCALL UserStaticServerThread (PVOID x) +{ + NTSTATUS Status = STATUS_SUCCESS; + PPORT_MESSAGE Request = (PPORT_MESSAGE) x; + PPORT_MESSAGE Reply = NULL; + ULONG MessageType = 0; + + DPRINT("WINSRV: %s(%08lx) called\n", __FUNCTION__, x); + + MessageType = Request->u2.s2.Type; + DPRINT("WINSRV: %s(%08lx) received a message (Type=%d)\n", + __FUNCTION__, x, MessageType); + switch (MessageType) + { + default: + Reply = Request; + Status = NtReplyPort (WinSrvApiPort, Reply); + break; + } +} + +/*===================================================================== + * PUBLIC API + *===================================================================*/ + +NTSTATUS STDCALL ConServerDllInitialization (ULONG ArgumentCount, + LPWSTR *Argument) +{ + NTSTATUS Status = STATUS_SUCCESS; + + DPRINT("WINSRV: %s called\n", __FUNCTION__); + + // Get the listening port from csrsrv.dll + WinSrvApiPort = CsrQueryApiPort (); + if (NULL == WinSrvApiPort) + { + return STATUS_UNSUCCESSFUL; + } + // Register our message dispatcher + Status = CsrAddStaticServerThread (ConStaticServerThread); + if (NT_SUCCESS(Status)) + { + //TODO: perform the real console server internal initialization here + } + return Status; +} + +NTSTATUS STDCALL UserServerDllInitialization (ULONG ArgumentCount, + LPWSTR *Argument) +{ + NTSTATUS Status = STATUS_SUCCESS; + + DPRINT("WINSRV: %s called\n", __FUNCTION__); + + // Get the listening port from csrsrv.dll + WinSrvApiPort = CsrQueryApiPort (); + if (NULL == WinSrvApiPort) + { + return STATUS_UNSUCCESSFUL; + } + // Register our message dispatcher + Status = CsrAddStaticServerThread (UserStaticServerThread); + if (NT_SUCCESS(Status)) + { + //TODO: perform the real user server internal initialization here + } + return Status; +} + +/* EOF */ diff --git a/reactos/subsys/win/winsrv/server.c b/reactos/subsys/win/winsrv/server.c new file mode 100644 index 00000000000..a82a669ab4b --- /dev/null +++ b/reactos/subsys/win/winsrv/server.c @@ -0,0 +1,32 @@ +/* $Id$ + * + * server.c - ReactOS/Win32 Console+User Enviroment Subsystem 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 + * 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 "winsrv.h" + +//#define NDEBUG +#include + + +/* EOF */ diff --git a/reactos/subsys/win/winsrv/winsrv.def b/reactos/subsys/win/winsrv/winsrv.def new file mode 100644 index 00000000000..90684149e7d --- /dev/null +++ b/reactos/subsys/win/winsrv/winsrv.def @@ -0,0 +1,6 @@ +; $Id$ +LIBRARY winsrv.dll +EXPORTS +ConServerDllInitialization@8 +UserServerDllInitialization@8 +; EOF diff --git a/reactos/subsys/win/winsrv/winsrv.h b/reactos/subsys/win/winsrv/winsrv.h new file mode 100644 index 00000000000..7d475ecf1a9 --- /dev/null +++ b/reactos/subsys/win/winsrv/winsrv.h @@ -0,0 +1,15 @@ +#ifndef _WINSRV_H_INCLUDED_ +#define _WINSRV_H_INCLUDED_ + +/* PSDK/NDK Headers */ +#include +#include + +#define NTOS_MODE_USER +#include + +#include +#include +#include + +#endif /* ndef _WINSRV_H_INCLUDED_ */ diff --git a/reactos/subsys/win/winsrv/winsrv.rc b/reactos/subsys/win/winsrv/winsrv.rc new file mode 100644 index 00000000000..86aedb2e833 --- /dev/null +++ b/reactos/subsys/win/winsrv/winsrv.rc @@ -0,0 +1,4 @@ +#define REACTOS_STR_FILE_DESCRIPTION "ReactOS/VMS Environment Subsystem Server\0" +#define REACTOS_STR_INTERNAL_NAME "vmsss\0" +#define REACTOS_STR_ORIGINAL_FILENAME "vmsss.exe\0" +#include diff --git a/reactos/subsys/win/winsrv/winsrv.xml b/reactos/subsys/win/winsrv/winsrv.xml new file mode 100644 index 00000000000..565e2e2c946 --- /dev/null +++ b/reactos/subsys/win/winsrv/winsrv.xml @@ -0,0 +1,16 @@ + + + . + include + + ntdll + csrsrv + kernel32 + user32 + gdi32 + dllmain.c + init.c + server.c + winsrv.rc + +