/* $Id$
- *
+ *
* reactos/subsys/csrss/init.c
*
* Initialize the CSRSS subsystem server process.
/* INCLUDES ******************************************************************/
-#include <csrss/csrss.h>
-#include <ddk/ntddk.h>
-#include <ntdll/csr.h>
-#include <ntdll/rtl.h>
-#include <ntdll/ldr.h>
-#include <win32k/win32k.h>
-#include <rosrtl/string.h>
-#include <sm/helper.h>
-
-#include "api.h"
-#include "csrplugin.h"
+#include <csrss.h>
#define NDEBUG
#include <debug.h>
InitializeVideoAddressSpace(VOID);
/**********************************************************************
- * CsrpParseCommandLine/2
+ * CsrpCreateObjectDirectory/3
*/
static NTSTATUS
-CsrpParseCommandLine (
- ULONG ArgumentCount,
- PWSTR *ArgumentArray
- )
+CsrpCreateObjectDirectory (int argc, char ** argv, char ** envp)
{
NTSTATUS Status;
OBJECT_ATTRIBUTES Attributes;
DPRINT("CSR: %s called\n", __FUNCTION__);
- /* DbgPrint ("Arguments: %ld\n", ArgumentCount);
- for (i = 0; i < ArgumentCount; i++)
- {
- DbgPrint ("Argument %ld: %S\n", i, ArgumentArray[i]);
- }*/
-
-
/* create object directory ('\Windows') */
RtlCreateUnicodeString (&CsrDirectoryName,
L"\\Windows");
InitializeObjectAttributes (&Attributes,
&CsrDirectoryName,
- 0,
+ OBJ_OPENIF,
NULL,
NULL);
- Status = NtCreateDirectoryObject(&CsrObjectDirectory,
- 0xF000F, /* ea:??? */
- &Attributes);
-
+ Status = NtOpenDirectoryObject(&CsrObjectDirectory,
+ 0xF000F, /* ea:??? */
+ &Attributes);
return Status;
}
/**********************************************************************
- * CsrpInitVideo/0
+ * CsrpInitVideo/3
*
* TODO: we need a virtual device for sessions other than
* TODO: the console one
*/
static NTSTATUS
-CsrpInitVideo (ULONG argc, PWSTR* argv)
+CsrpInitVideo (int argc, char ** argv, char ** envp)
{
OBJECT_ATTRIBUTES ObjectAttributes;
- UNICODE_STRING DeviceName;
+ UNICODE_STRING DeviceName = RTL_CONSTANT_STRING(L"\\??\\DISPLAY1");
IO_STATUS_BLOCK Iosb;
HANDLE VideoHandle = (HANDLE) 0;
NTSTATUS Status = STATUS_SUCCESS;
InitializeVideoAddressSpace();
- RtlRosInitUnicodeStringFromLiteral(&DeviceName, L"\\??\\DISPLAY1");
InitializeObjectAttributes(&ObjectAttributes,
&DeviceName,
0,
}
/**********************************************************************
- * CsrpInitWin32Csr/0
+ * CsrpInitWin32Csr/3
*
* TODO: this function should be turned more general to load an
* TODO: hosted server DLL as received from the command line;
* TODO: DWORD ServerId)
*/
static NTSTATUS
-CsrpInitWin32Csr (ULONG argc, PWSTR* argv)
+CsrpInitWin32Csr (int argc, char ** argv, char ** envp)
{
NTSTATUS Status;
UNICODE_STRING DllName;
CSRSS_API_DEFINITION NativeDefinitions[] =
{
- CSRSS_DEFINE_API(CSRSS_CREATE_PROCESS, CsrCreateProcess),
- CSRSS_DEFINE_API(CSRSS_TERMINATE_PROCESS, CsrTerminateProcess),
- CSRSS_DEFINE_API(CSRSS_CONNECT_PROCESS, CsrConnectProcess),
- CSRSS_DEFINE_API(CSRSS_REGISTER_SERVICES_PROCESS, CsrRegisterServicesProcess),
- CSRSS_DEFINE_API(CSRSS_GET_SHUTDOWN_PARAMETERS, CsrGetShutdownParameters),
- CSRSS_DEFINE_API(CSRSS_SET_SHUTDOWN_PARAMETERS, CsrSetShutdownParameters),
- CSRSS_DEFINE_API(CSRSS_GET_INPUT_HANDLE, CsrGetInputHandle),
- CSRSS_DEFINE_API(CSRSS_GET_OUTPUT_HANDLE, CsrGetOutputHandle),
- CSRSS_DEFINE_API(CSRSS_CLOSE_HANDLE, CsrCloseHandle),
- CSRSS_DEFINE_API(CSRSS_VERIFY_HANDLE, CsrVerifyHandle),
- CSRSS_DEFINE_API(CSRSS_DUPLICATE_HANDLE, CsrDuplicateHandle),
- CSRSS_DEFINE_API(CSRSS_GET_INPUT_WAIT_HANDLE, CsrGetInputWaitHandle),
- { 0, 0, 0, NULL }
+ CSRSS_DEFINE_API(CREATE_PROCESS, CsrCreateProcess),
+ CSRSS_DEFINE_API(TERMINATE_PROCESS, CsrTerminateProcess),
+ CSRSS_DEFINE_API(CONNECT_PROCESS, CsrConnectProcess),
+ CSRSS_DEFINE_API(REGISTER_SERVICES_PROCESS, CsrRegisterServicesProcess),
+ CSRSS_DEFINE_API(GET_SHUTDOWN_PARAMETERS, CsrGetShutdownParameters),
+ CSRSS_DEFINE_API(SET_SHUTDOWN_PARAMETERS, CsrSetShutdownParameters),
+ CSRSS_DEFINE_API(GET_INPUT_HANDLE, CsrGetInputHandle),
+ CSRSS_DEFINE_API(GET_OUTPUT_HANDLE, CsrGetOutputHandle),
+ CSRSS_DEFINE_API(CLOSE_HANDLE, CsrCloseHandle),
+ CSRSS_DEFINE_API(VERIFY_HANDLE, CsrVerifyHandle),
+ CSRSS_DEFINE_API(DUPLICATE_HANDLE, CsrDuplicateHandle),
+ CSRSS_DEFINE_API(GET_INPUT_WAIT_HANDLE, CsrGetInputWaitHandle),
+ { 0, 0, NULL }
};
static NTSTATUS STDCALL
NULL);
Status = NtCreatePort ( Port,
& PortAttributes,
- 260, /* TODO: make caller set it*/
- 328, /* TODO: make caller set it*/
+ LPC_MAX_DATA_LENGTH, /* TODO: make caller set it*/
+ LPC_MAX_MESSAGE_LENGTH, /* TODO: make caller set it*/
0); /* TODO: make caller set it*/
if(!NT_SUCCESS(Status))
{
NULL,
FALSE,
0,
- NULL,
- NULL,
+ 0,
+ 0,
(PTHREAD_START_ROUTINE) ListenThread,
Port,
NULL,
/* === INIT ROUTINES === */
/**********************************************************************
- * CsrpCreateCallbackPort/0
+ * CsrpCreateHeap/3
*/
static NTSTATUS
-CsrpCreateHeap (ULONG argc, PWSTR* argv)
+CsrpCreateHeap (int argc, char ** argv, char ** envp)
{
DPRINT("CSR: %s called\n", __FUNCTION__);
}
/**********************************************************************
- * CsrpCreateCallbackPort/0
+ * CsrpCreateCallbackPort/3
*/
static NTSTATUS
-CsrpCreateCallbackPort (ULONG argc, PWSTR* argv)
+CsrpCreateCallbackPort (int argc, char ** argv, char ** envp)
{
DPRINT("CSR: %s called\n", __FUNCTION__);
}
/**********************************************************************
- * CsrpRegisterSubsystem/2
+ * CsrpRegisterSubsystem/3
*/
static NTSTATUS
-CsrpRegisterSubsystem (ULONG argc, PWSTR* argv)
+CsrpRegisterSubsystem (int argc, char ** argv, char ** envp)
{
NTSTATUS Status = STATUS_SUCCESS;
OBJECT_ATTRIBUTES BootstrapOkAttributes;
FALSE,
NULL);
NtClose (hBootstrapOk);
- return Status;
+ return Status;
+}
+
+/**********************************************************************
+ * EnvpToUnicodeString/2
+ */
+static ULONG FASTCALL
+EnvpToUnicodeString (char ** envp, PUNICODE_STRING UnicodeEnv)
+{
+ ULONG CharCount = 0;
+ ULONG Index = 0;
+ ANSI_STRING AnsiEnv;
+
+ UnicodeEnv->Buffer = NULL;
+
+ for (Index=0; NULL != envp[Index]; Index++)
+ {
+ CharCount += strlen (envp[Index]);
+ ++ CharCount;
+ }
+ ++ CharCount;
+
+ AnsiEnv.Buffer = RtlAllocateHeap (RtlGetProcessHeap(), 0, CharCount);
+ if (NULL != AnsiEnv.Buffer)
+ {
+
+ PCHAR WritePos = AnsiEnv.Buffer;
+
+ for (Index=0; NULL != envp[Index]; Index++)
+ {
+ strcpy (WritePos, envp[Index]);
+ WritePos += strlen (envp[Index]) + 1;
+ }
+
+ /* FIXME: the last (double) nullterm should perhaps not be included in Length
+ * but only in MaximumLength. -Gunnar */
+ AnsiEnv.Buffer [CharCount-1] = '\0';
+ AnsiEnv.Length = CharCount;
+ AnsiEnv.MaximumLength = CharCount;
+
+ RtlAnsiStringToUnicodeString (UnicodeEnv, & AnsiEnv, TRUE);
+ RtlFreeHeap (RtlGetProcessHeap(), 0, AnsiEnv.Buffer);
+ }
+ return CharCount;
+}
+/**********************************************************************
+ * CsrpLoadKernelModeDriver/3
+ */
+static NTSTATUS
+CsrpLoadKernelModeDriver (int argc, char ** argv, char ** envp)
+{
+ NTSTATUS Status = STATUS_SUCCESS;
+ WCHAR Data [MAX_PATH + 1];
+ ULONG DataLength = sizeof Data;
+ ULONG DataType = 0;
+ UNICODE_STRING Environment;
+
+
+ DPRINT("SM: %s called\n", __FUNCTION__);
+
+
+ EnvpToUnicodeString (envp, & Environment);
+ Status = SmLookupSubsystem (L"Kmode",
+ Data,
+ & DataLength,
+ & DataType,
+ Environment.Buffer);
+ RtlFreeUnicodeString (& Environment);
+ if((STATUS_SUCCESS == Status) && (DataLength > sizeof Data[0]))
+ {
+ WCHAR ImagePath [MAX_PATH + 1] = {0};
+ UNICODE_STRING ModuleName;
+
+ wcscpy (ImagePath, L"\\??\\");
+ wcscat (ImagePath, Data);
+ RtlInitUnicodeString (& ModuleName, ImagePath);
+ Status = NtSetSystemInformation(/* FIXME: SystemLoadAndCallImage */
+ SystemExtendServiceTableInformation,
+ & ModuleName,
+ sizeof ModuleName);
+ if(!NT_SUCCESS(Status))
+ {
+ DPRINT("WIN: %s: loading Kmode failed (Status=0x%08lx)\n",
+ __FUNCTION__, Status);
+ }
+ }
+ return Status;
}
/**********************************************************************
- * CsrpCreateApiPort/0
+ * CsrpCreateApiPort/2
*/
static NTSTATUS
-CsrpCreateApiPort (ULONG argc, PWSTR* argv)
+CsrpCreateApiPort (int argc, char ** argv, char ** envp)
{
DPRINT("CSR: %s called\n", __FUNCTION__);
* CsrpApiRegisterDef/0
*/
static NTSTATUS
-CsrpApiRegisterDef (ULONG argc, PWSTR* argv)
+CsrpApiRegisterDef (int argc, char ** argv, char ** envp)
{
return CsrApiRegisterDefinitions(NativeDefinitions);
}
* CsrpCCTS/2
*/
static NTSTATUS
-CsrpCCTS (ULONG argc, PWSTR* argv)
+CsrpCCTS (int argc, char ** argv, char ** envp)
{
- return CsrClientConnectToServer();
+ ULONG Dummy;
+ ULONG DummyLength = sizeof(Dummy);
+ return CsrClientConnectToServer(L"\\Windows",
+ 0, &Dummy, &DummyLength, NULL);
}
/**********************************************************************
* TODO: in its own desktop (one logon desktop per winstation).
*/
static NTSTATUS
-CsrpRunWinlogon (ULONG argc, PWSTR* argv)
+CsrpRunWinlogon (int argc, char ** argv, char ** envp)
{
NTSTATUS Status = STATUS_SUCCESS;
UNICODE_STRING ImagePath;
UNICODE_STRING CommandLine;
PRTL_USER_PROCESS_PARAMETERS ProcessParameters = NULL;
- RTL_PROCESS_INFO ProcessInfo;
+ RTL_USER_PROCESS_INFORMATION ProcessInfo;
DPRINT("CSR: %s called\n", __FUNCTION__);
-typedef NTSTATUS (* CSR_INIT_ROUTINE)(ULONG, PWSTR*);
+typedef NTSTATUS (* CSR_INIT_ROUTINE)(int,char**,char**);
struct {
BOOL Required;
CSR_INIT_ROUTINE EntryPoint;
PCHAR ErrorMessage;
} InitRoutine [] = {
- {TRUE, CsrpCreateCallbackPort, "create the callback port \\Windows\\SbApiPort"},
- {TRUE, CsrpRegisterSubsystem, "register with SM"},
- {TRUE, CsrpCreateHeap, "create the CSR heap"},
- {TRUE, CsrpCreateApiPort, "create the api port \\Windows\\ApiPort"},
- {TRUE, CsrpParseCommandLine, "parse the command line"},
- {TRUE, CsrpInitVideo, "initialize video"},
- {TRUE, CsrpApiRegisterDef, "initialize api definitions"},
- {TRUE, CsrpCCTS, "connect client to server"},
- {TRUE, CsrpInitWin32Csr, "load usermode dll"},
- {TRUE, CsrpRunWinlogon, "run WinLogon"},
+ {TRUE, CsrpCreateCallbackPort, "create the callback port \\Windows\\SbApiPort"},
+ {TRUE, CsrpRegisterSubsystem, "register with SM"},
+ {TRUE, CsrpCreateHeap, "create the CSR heap"},
+ {TRUE, CsrpCreateApiPort, "create the api port \\Windows\\ApiPort"},
+ {TRUE, CsrpCreateObjectDirectory,"create the object directory \\Windows"},
+ {TRUE, CsrpLoadKernelModeDriver, "load Kmode driver"},
+ {TRUE, CsrpInitVideo, "initialize video"},
+ {TRUE, CsrpApiRegisterDef, "initialize api definitions"},
+ {TRUE, CsrpCCTS, "connect client to server"},
+ {TRUE, CsrpInitWin32Csr, "load usermode dll"},
+ {TRUE, CsrpRunWinlogon, "run WinLogon"},
};
/**********************************************************************
*/
BOOL STDCALL
CsrServerInitialization (
- ULONG ArgumentCount,
- PWSTR *ArgumentArray
+ int argc,
+ char ** argv,
+ char ** envp
)
{
- INT i = 0;
+ UINT i = 0;
NTSTATUS Status = STATUS_SUCCESS;
DPRINT("CSR: %s called\n", __FUNCTION__);
for (i=0; i < (sizeof InitRoutine / sizeof InitRoutine[0]); i++)
{
- Status = InitRoutine[i].EntryPoint(ArgumentCount,ArgumentArray);
+ Status = InitRoutine[i].EntryPoint(argc,argv,envp);
if(!NT_SUCCESS(Status))
{
- DPRINT1("CSR: %s: failed to %s (Status=%08lx)\n",
+ DPRINT1("CSR: %s: failed to %s (Status=%08lx)\n",
__FUNCTION__,
InitRoutine[i].ErrorMessage,
Status);