UNICODE_STRING CsrDirectoryName;
extern HANDLE CsrssApiHeap;
-extern PRTL_USER_PROCESS_PARAMETERS RtlProcessParameters;
static unsigned InitCompleteProcCount;
static CSRPLUGIN_INIT_COMPLETE_PROC *InitCompleteProcs = NULL;
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");
}
/**********************************************************************
- * 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 = RTL_CONSTANT_STRING(L"\\??\\DISPLAY1");
}
/**********************************************************************
- * 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;
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))
{
/* === INIT ROUTINES === */
/**********************************************************************
- * CsrpCreateHeap/2
+ * CsrpCreateHeap/3
*/
static NTSTATUS
-CsrpCreateHeap (ULONG argc, PWSTR* argv)
+CsrpCreateHeap (int argc, char ** argv, char ** envp)
{
DPRINT("CSR: %s called\n", __FUNCTION__);
}
/**********************************************************************
- * CsrpCreateCallbackPort/2
+ * 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;
}
/**********************************************************************
- * CsrpLoadKernelModeDriver/2
+ * 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 (ULONG argc, PWSTR* argv)
+CsrpLoadKernelModeDriver (int argc, char ** argv, char ** envp)
{
- NTSTATUS Status = STATUS_SUCCESS;
- WCHAR Data [MAX_PATH + 1];
- ULONG DataLength = sizeof Data;
- ULONG DataType = 0;
+ 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,
- RtlProcessParameters->Environment);
+ Environment.Buffer);
+ RtlFreeUnicodeString (& Environment);
if((STATUS_SUCCESS == Status) && (DataLength > sizeof Data[0]))
{
WCHAR ImagePath [MAX_PATH + 1] = {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(NULL, 0, NULL, NULL, 0, NULL);
+ 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;
-typedef NTSTATUS (* CSR_INIT_ROUTINE)(ULONG, PWSTR*);
+typedef NTSTATUS (* CSR_INIT_ROUTINE)(int,char**,char**);
struct {
BOOL Required;
{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, CsrpCreateObjectDirectory,"create the object directory \\Windows"},
{TRUE, CsrpLoadKernelModeDriver, "load Kmode driver"},
{TRUE, CsrpInitVideo, "initialize video"},
{TRUE, CsrpApiRegisterDef, "initialize api definitions"},
*/
BOOL STDCALL
CsrServerInitialization (
- ULONG ArgumentCount,
- PWSTR *ArgumentArray
+ int argc,
+ char ** argv,
+ char ** envp
)
{
UINT i = 0;
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",