Fix startup code for native NT processes.

smss, autocheck, csrss use new startup code.

svn path=/trunk/; revision=18365
This commit is contained in:
Emanuele Aliberti 2005-10-08 22:41:49 +00:00
parent 4aa4442880
commit 320979be58
6 changed files with 92 additions and 191 deletions

View file

@ -22,14 +22,6 @@
* MA 02139, USA. * 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).
*/ */
#include <csrss.h> #include <csrss.h>
@ -37,158 +29,35 @@
#define NDEBUG #define NDEBUG
#include <debug.h> #include <debug.h>
#define CSRP_MAX_ARGUMENT_COUNT 512 int _cdecl _main(int argc,
char *argv[],
typedef struct _COMMAND_LINE_ARGUMENT char *envp[],
int DebugFlag)
{ {
ULONG Count; NTSTATUS Status = STATUS_SUCCESS;
UNICODE_STRING Buffer;
PWSTR * Vector; PrintString("ReactOS Client/Server Run-Time (Build %s)\n",
} COMMAND_LINE_ARGUMENT, *PCOMMAND_LINE_ARGUMENT;
PRTL_USER_PROCESS_PARAMETERS RtlProcessParameters = NULL;
/**********************************************************************
* NAME PRIVATE
* CsrpParseCommandLine/3
*/
static NTSTATUS STDCALL
CsrpParseCommandLine (HANDLE ProcessHeap,
PRTL_USER_PROCESS_PARAMETERS RtlProcessParameters,
PCOMMAND_LINE_ARGUMENT Argument)
{
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]);
}
return STATUS_SUCCESS;
}
/**********************************************************************
* NAME PRIVATE
* CsrpFreeCommandLine/2
*/
static VOID STDCALL
CsrpFreeCommandLine (HANDLE ProcessHeap,
PCOMMAND_LINE_ARGUMENT Argument)
{
DPRINT("CSR: %s called\n", __FUNCTION__);
RtlFreeHeap (ProcessHeap,
0,
Argument->Vector);
RtlFreeHeap (ProcessHeap,
0,
Argument->Buffer.Buffer);
}
/* Native process' entry point */
VOID STDCALL NtProcessStartup(PPEB Peb)
{
COMMAND_LINE_ARGUMENT CmdLineArg = {0};
NTSTATUS Status = STATUS_SUCCESS;
PrintString("ReactOS Client/Server Run-Time %s (Build %s)\n",
KERNEL_RELEASE_STR,
KERNEL_VERSION_BUILD_STR); KERNEL_VERSION_BUILD_STR);
RtlProcessParameters = RtlNormalizeProcessParams (Peb->ProcessParameters);
/*==================================================================
* Parse the command line: TODO actually parse the cl, because
* it is required to load hosted server DLLs.
*================================================================*/
Status = CsrpParseCommandLine (Peb->ProcessHeap,
RtlProcessParameters,
& CmdLineArg);
if(STATUS_SUCCESS != Status)
{
DPRINT1("CSR: %s: CsrpParseCommandLine failed (Status=0x%08lx)\n",
__FUNCTION__, Status);
}
/*================================================================== /*==================================================================
* Initialize the Win32 environment subsystem server. * Initialize the Win32 environment subsystem server.
*================================================================*/ *================================================================*/
if (CsrServerInitialization (CmdLineArg.Count, CmdLineArg.Vector) == TRUE) if (CsrServerInitialization (argc, argv, envp) == TRUE)
{ {
CsrpFreeCommandLine (Peb->ProcessHeap, & CmdLineArg);
/* /*
* Terminate the current thread only. * Terminate the current thread only.
*/ */
NtTerminateThread (NtCurrentThread(), 0); Status = NtTerminateThread (NtCurrentThread(), 0);
} }
else else
{ {
DisplayString (L"CSR: CsrServerInitialization failed.\n"); DisplayString (L"CSR: CsrServerInitialization failed.\n");
CsrpFreeCommandLine (Peb->ProcessHeap, & CmdLineArg);
/* /*
* Tell the SM we failed. * Tell the SM we failed.
*/ */
NtTerminateProcess (NtCurrentProcess(), 0); Status = NtTerminateProcess (NtCurrentProcess(), 0);
} }
return (int) Status;
} }
/* EOF */ /* EOF */

View file

@ -4,6 +4,7 @@
<define name="__USE_W32API" /> <define name="__USE_W32API" />
<define name="_WIN32_WINNT">0x0600</define> <define name="_WIN32_WINNT">0x0600</define>
<define name="WINVER">0x0501</define> <define name="WINVER">0x0501</define>
<library>nt</library>
<library>intrlck</library> <library>intrlck</library>
<library>ntdll</library> <library>ntdll</library>
<library>smdll</library> <library>smdll</library>
@ -13,7 +14,7 @@
<file>user.c</file> <file>user.c</file>
<file>wapi.c</file> <file>wapi.c</file>
</directory> </directory>
<pch>csrss.h</pch> <pch>csrss.h</pch>
<file>csrss.c</file> <file>csrss.c</file>
<file>init.c</file> <file>init.c</file>
<file>print.c</file> <file>print.c</file>

View file

@ -120,7 +120,7 @@ NTSTATUS FASTCALL CsrRegisterObjectDefinitions(PCSRSS_OBJECT_DEFINITION NewDefin
NTSTATUS STDCALL CsrInsertObject( PCSRSS_PROCESS_DATA ProcessData, PHANDLE Handle, Object_t *Object ); NTSTATUS STDCALL CsrInsertObject( PCSRSS_PROCESS_DATA ProcessData, PHANDLE Handle, Object_t *Object );
NTSTATUS STDCALL CsrDuplicateHandleTable(PCSRSS_PROCESS_DATA SourceProcessData, PCSRSS_PROCESS_DATA TargetProcessData); NTSTATUS STDCALL CsrDuplicateHandleTable(PCSRSS_PROCESS_DATA SourceProcessData, PCSRSS_PROCESS_DATA TargetProcessData);
NTSTATUS STDCALL CsrGetObject( PCSRSS_PROCESS_DATA ProcessData, HANDLE Handle, Object_t **Object ); NTSTATUS STDCALL CsrGetObject( PCSRSS_PROCESS_DATA ProcessData, HANDLE Handle, Object_t **Object );
BOOL STDCALL CsrServerInitialization (ULONG ArgumentCount, PWSTR *ArgumentArray); BOOL STDCALL CsrServerInitialization (int,char**,char**);
NTSTATUS STDCALL CsrReleaseObjectByPointer(Object_t *Object); NTSTATUS STDCALL CsrReleaseObjectByPointer(Object_t *Object);
NTSTATUS STDCALL CsrReleaseObject( PCSRSS_PROCESS_DATA ProcessData, HANDLE Object ); NTSTATUS STDCALL CsrReleaseObject( PCSRSS_PROCESS_DATA ProcessData, HANDLE Object );
NTSTATUS STDCALL CsrVerifyObject( PCSRSS_PROCESS_DATA ProcessData, HANDLE Object ); NTSTATUS STDCALL CsrVerifyObject( PCSRSS_PROCESS_DATA ProcessData, HANDLE Object );

View file

@ -24,7 +24,6 @@ HANDLE CsrObjectDirectory = (HANDLE) 0;
UNICODE_STRING CsrDirectoryName; UNICODE_STRING CsrDirectoryName;
extern HANDLE CsrssApiHeap; extern HANDLE CsrssApiHeap;
extern PRTL_USER_PROCESS_PARAMETERS RtlProcessParameters;
static unsigned InitCompleteProcCount; static unsigned InitCompleteProcCount;
static CSRPLUGIN_INIT_COMPLETE_PROC *InitCompleteProcs = NULL; static CSRPLUGIN_INIT_COMPLETE_PROC *InitCompleteProcs = NULL;
@ -95,13 +94,10 @@ ULONG
InitializeVideoAddressSpace(VOID); InitializeVideoAddressSpace(VOID);
/********************************************************************** /**********************************************************************
* CsrpParseCommandLine/2 * CsrpCreateObjectDirectory/3
*/ */
static NTSTATUS static NTSTATUS
CsrpParseCommandLine ( CsrpCreateObjectDirectory (int argc, char ** argv, char ** envp)
ULONG ArgumentCount,
PWSTR *ArgumentArray
)
{ {
NTSTATUS Status; NTSTATUS Status;
OBJECT_ATTRIBUTES Attributes; OBJECT_ATTRIBUTES Attributes;
@ -109,13 +105,6 @@ CsrpParseCommandLine (
DPRINT("CSR: %s called\n", __FUNCTION__); 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') */ /* create object directory ('\Windows') */
RtlCreateUnicodeString (&CsrDirectoryName, RtlCreateUnicodeString (&CsrDirectoryName,
L"\\Windows"); L"\\Windows");
@ -133,13 +122,13 @@ CsrpParseCommandLine (
} }
/********************************************************************** /**********************************************************************
* CsrpInitVideo/0 * CsrpInitVideo/3
* *
* TODO: we need a virtual device for sessions other than * TODO: we need a virtual device for sessions other than
* TODO: the console one * TODO: the console one
*/ */
static NTSTATUS static NTSTATUS
CsrpInitVideo (ULONG argc, PWSTR* argv) CsrpInitVideo (int argc, char ** argv, char ** envp)
{ {
OBJECT_ATTRIBUTES ObjectAttributes; OBJECT_ATTRIBUTES ObjectAttributes;
UNICODE_STRING DeviceName = RTL_CONSTANT_STRING(L"\\??\\DISPLAY1"); UNICODE_STRING DeviceName = RTL_CONSTANT_STRING(L"\\??\\DISPLAY1");
@ -170,7 +159,7 @@ CsrpInitVideo (ULONG argc, PWSTR* argv)
} }
/********************************************************************** /**********************************************************************
* CsrpInitWin32Csr/0 * CsrpInitWin32Csr/3
* *
* TODO: this function should be turned more general to load an * TODO: this function should be turned more general to load an
* TODO: hosted server DLL as received from the command line; * TODO: hosted server DLL as received from the command line;
@ -182,7 +171,7 @@ CsrpInitVideo (ULONG argc, PWSTR* argv)
* TODO: DWORD ServerId) * TODO: DWORD ServerId)
*/ */
static NTSTATUS static NTSTATUS
CsrpInitWin32Csr (ULONG argc, PWSTR* argv) CsrpInitWin32Csr (int argc, char ** argv, char ** envp)
{ {
NTSTATUS Status; NTSTATUS Status;
UNICODE_STRING DllName; UNICODE_STRING DllName;
@ -296,10 +285,10 @@ CsrpCreateListenPort (IN LPWSTR Name,
/* === INIT ROUTINES === */ /* === INIT ROUTINES === */
/********************************************************************** /**********************************************************************
* CsrpCreateHeap/2 * CsrpCreateHeap/3
*/ */
static NTSTATUS static NTSTATUS
CsrpCreateHeap (ULONG argc, PWSTR* argv) CsrpCreateHeap (int argc, char ** argv, char ** envp)
{ {
DPRINT("CSR: %s called\n", __FUNCTION__); DPRINT("CSR: %s called\n", __FUNCTION__);
@ -317,10 +306,10 @@ CsrpCreateHeap (ULONG argc, PWSTR* argv)
} }
/********************************************************************** /**********************************************************************
* CsrpCreateCallbackPort/2 * CsrpCreateCallbackPort/3
*/ */
static NTSTATUS static NTSTATUS
CsrpCreateCallbackPort (ULONG argc, PWSTR* argv) CsrpCreateCallbackPort (int argc, char ** argv, char ** envp)
{ {
DPRINT("CSR: %s called\n", __FUNCTION__); DPRINT("CSR: %s called\n", __FUNCTION__);
@ -330,10 +319,10 @@ CsrpCreateCallbackPort (ULONG argc, PWSTR* argv)
} }
/********************************************************************** /**********************************************************************
* CsrpRegisterSubsystem/2 * CsrpRegisterSubsystem/3
*/ */
static NTSTATUS static NTSTATUS
CsrpRegisterSubsystem (ULONG argc, PWSTR* argv) CsrpRegisterSubsystem (int argc, char ** argv, char ** envp)
{ {
NTSTATUS Status = STATUS_SUCCESS; NTSTATUS Status = STATUS_SUCCESS;
OBJECT_ATTRIBUTES BootstrapOkAttributes; OBJECT_ATTRIBUTES BootstrapOkAttributes;
@ -391,24 +380,65 @@ CsrpRegisterSubsystem (ULONG argc, PWSTR* argv)
} }
/********************************************************************** /**********************************************************************
* 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++)
{
strcat (WritePos, envp[Index]);
WritePos += strlen (envp[Index]) + 1;
}
AnsiEnv.Buffer [CharCount] = '\0';
AnsiEnv.Length = CharCount;
AnsiEnv.MaximumLength = CharCount;
RtlAnsiStringToUnicodeString (UnicodeEnv, & AnsiEnv, TRUE);
RtlFreeHeap (RtlGetProcessHeap(), 0, AnsiEnv.Buffer);
}
return CharCount;
}
/**********************************************************************
* CsrpLoadKernelModeDriver/3
*/ */
static NTSTATUS static NTSTATUS
CsrpLoadKernelModeDriver (ULONG argc, PWSTR* argv) CsrpLoadKernelModeDriver (int argc, char ** argv, char ** envp)
{ {
NTSTATUS Status = STATUS_SUCCESS; NTSTATUS Status = STATUS_SUCCESS;
WCHAR Data [MAX_PATH + 1]; WCHAR Data [MAX_PATH + 1];
ULONG DataLength = sizeof Data; ULONG DataLength = sizeof Data;
ULONG DataType = 0; ULONG DataType = 0;
UNICODE_STRING Environment;
DPRINT("SM: %s called\n", __FUNCTION__); DPRINT("SM: %s called\n", __FUNCTION__);
EnvpToUnicodeString (envp, & Environment);
Status = SmLookupSubsystem (L"Kmode", Status = SmLookupSubsystem (L"Kmode",
Data, Data,
& DataLength, & DataLength,
& DataType, & DataType,
RtlProcessParameters->Environment); Environment.Buffer);
RtlFreeUnicodeString (& Environment);
if((STATUS_SUCCESS == Status) && (DataLength > sizeof Data[0])) if((STATUS_SUCCESS == Status) && (DataLength > sizeof Data[0]))
{ {
WCHAR ImagePath [MAX_PATH + 1] = {0}; WCHAR ImagePath [MAX_PATH + 1] = {0};
@ -434,7 +464,7 @@ CsrpLoadKernelModeDriver (ULONG argc, PWSTR* argv)
* CsrpCreateApiPort/2 * CsrpCreateApiPort/2
*/ */
static NTSTATUS static NTSTATUS
CsrpCreateApiPort (ULONG argc, PWSTR* argv) CsrpCreateApiPort (int argc, char ** argv, char ** envp)
{ {
DPRINT("CSR: %s called\n", __FUNCTION__); DPRINT("CSR: %s called\n", __FUNCTION__);
@ -447,7 +477,7 @@ CsrpCreateApiPort (ULONG argc, PWSTR* argv)
* CsrpApiRegisterDef/0 * CsrpApiRegisterDef/0
*/ */
static NTSTATUS static NTSTATUS
CsrpApiRegisterDef (ULONG argc, PWSTR* argv) CsrpApiRegisterDef (int argc, char ** argv, char ** envp)
{ {
return CsrApiRegisterDefinitions(NativeDefinitions); return CsrApiRegisterDefinitions(NativeDefinitions);
} }
@ -456,7 +486,7 @@ CsrpApiRegisterDef (ULONG argc, PWSTR* argv)
* CsrpCCTS/2 * CsrpCCTS/2
*/ */
static NTSTATUS static NTSTATUS
CsrpCCTS (ULONG argc, PWSTR* argv) CsrpCCTS (int argc, char ** argv, char ** envp)
{ {
ULONG Dummy; ULONG Dummy;
ULONG DummyLength = sizeof(Dummy); ULONG DummyLength = sizeof(Dummy);
@ -473,7 +503,7 @@ CsrpCCTS (ULONG argc, PWSTR* argv)
* TODO: in its own desktop (one logon desktop per winstation). * TODO: in its own desktop (one logon desktop per winstation).
*/ */
static NTSTATUS static NTSTATUS
CsrpRunWinlogon (ULONG argc, PWSTR* argv) CsrpRunWinlogon (int argc, char ** argv, char ** envp)
{ {
NTSTATUS Status = STATUS_SUCCESS; NTSTATUS Status = STATUS_SUCCESS;
UNICODE_STRING ImagePath; UNICODE_STRING ImagePath;
@ -521,7 +551,7 @@ CsrpRunWinlogon (ULONG argc, PWSTR* argv)
typedef NTSTATUS (* CSR_INIT_ROUTINE)(ULONG, PWSTR*); typedef NTSTATUS (* CSR_INIT_ROUTINE)(int,char**,char**);
struct { struct {
BOOL Required; BOOL Required;
@ -532,7 +562,7 @@ struct {
{TRUE, CsrpRegisterSubsystem, "register with SM"}, {TRUE, CsrpRegisterSubsystem, "register with SM"},
{TRUE, CsrpCreateHeap, "create the CSR heap"}, {TRUE, CsrpCreateHeap, "create the CSR heap"},
{TRUE, CsrpCreateApiPort, "create the api port \\Windows\\ApiPort"}, {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, CsrpLoadKernelModeDriver, "load Kmode driver"},
{TRUE, CsrpInitVideo, "initialize video"}, {TRUE, CsrpInitVideo, "initialize video"},
{TRUE, CsrpApiRegisterDef, "initialize api definitions"}, {TRUE, CsrpApiRegisterDef, "initialize api definitions"},
@ -553,8 +583,9 @@ struct {
*/ */
BOOL STDCALL BOOL STDCALL
CsrServerInitialization ( CsrServerInitialization (
ULONG ArgumentCount, int argc,
PWSTR *ArgumentArray char ** argv,
char ** envp
) )
{ {
UINT i = 0; UINT i = 0;
@ -564,7 +595,7 @@ CsrServerInitialization (
for (i=0; i < (sizeof InitRoutine / sizeof InitRoutine[0]); i++) 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)) if(!NT_SUCCESS(Status))
{ {
DPRINT1("CSR: %s: failed to %s (Status=%08lx)\n", DPRINT1("CSR: %s: failed to %s (Status=%08lx)\n",

View file

@ -33,16 +33,15 @@ ULONG SmSsProcessId = 0;
/* Native image's entry point */ /* Native image's entry point */
VOID STDCALL NTSTATUS __cdecl _main(int argc,
NtProcessStartup(PPEB Peb) char *argv[],
char *envp[],
ULONG DebugFlag)
{ {
NTSTATUS Status = STATUS_SUCCESS; NTSTATUS Status = STATUS_SUCCESS;
PROCESS_BASIC_INFORMATION PBI = {0}; PROCESS_BASIC_INFORMATION PBI = {0};
PrintString("*** EXPERIMENTAL ***\n"); PrintString("ReactOS Session Manager (Build %s)\n",
PrintString("ReactOS Session Manager %s (Build %s)\n",
KERNEL_RELEASE_STR,
KERNEL_VERSION_BUILD_STR); KERNEL_VERSION_BUILD_STR);
/* Lookup yourself */ /* Lookup yourself */
@ -94,7 +93,7 @@ ByeBye:
// NtTerminateProcess(NtCurrentProcess(), 0); // NtTerminateProcess(NtCurrentProcess(), 0);
#endif #endif
NtTerminateThread(NtCurrentThread(), Status); return NtTerminateThread(NtCurrentThread(), Status);
} }
/* EOF */ /* EOF */

View file

@ -2,10 +2,11 @@
<include base="smss">.</include> <include base="smss">.</include>
<define name="__USE_W32API" /> <define name="__USE_W32API" />
<define name="_DISABLE_TIDENTS" /> <define name="_DISABLE_TIDENTS" />
<library>nt</library>
<library>smlib</library> <library>smlib</library>
<library>ntdll</library> <library>ntdll</library>
<linkerflag>-lgcc</linkerflag> <linkerflag>-lgcc</linkerflag>
<pch>smss.h</pch> <pch>smss.h</pch>
<file>client.c</file> <file>client.c</file>
<file>debug.c</file> <file>debug.c</file>
<file>init.c</file> <file>init.c</file>