From 320979be5897817850a36d5d6573f72ca3908856 Mon Sep 17 00:00:00 2001 From: Emanuele Aliberti Date: Sat, 8 Oct 2005 22:41:49 +0000 Subject: [PATCH] Fix startup code for native NT processes. smss, autocheck, csrss use new startup code. svn path=/trunk/; revision=18365 --- reactos/subsys/csrss/csrss.c | 153 +++-------------------------- reactos/subsys/csrss/csrss.xml | 3 +- reactos/subsys/csrss/include/api.h | 2 +- reactos/subsys/csrss/init.c | 109 ++++++++++++-------- reactos/subsys/smss/smss.c | 13 ++- reactos/subsys/smss/smss.xml | 3 +- 6 files changed, 92 insertions(+), 191 deletions(-) diff --git a/reactos/subsys/csrss/csrss.c b/reactos/subsys/csrss/csrss.c index bab1b3afd59..b5d73037c5f 100644 --- a/reactos/subsys/csrss/csrss.c +++ b/reactos/subsys/csrss/csrss.c @@ -22,14 +22,6 @@ * 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 @@ -37,158 +29,35 @@ #define NDEBUG #include -#define CSRP_MAX_ARGUMENT_COUNT 512 - -typedef struct _COMMAND_LINE_ARGUMENT +int _cdecl _main(int argc, + char *argv[], + char *envp[], + int DebugFlag) { - ULONG Count; - UNICODE_STRING Buffer; - PWSTR * Vector; - -} 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, + NTSTATUS Status = STATUS_SUCCESS; + + PrintString("ReactOS Client/Server Run-Time (Build %s)\n", 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. *================================================================*/ - if (CsrServerInitialization (CmdLineArg.Count, CmdLineArg.Vector) == TRUE) + if (CsrServerInitialization (argc, argv, envp) == TRUE) { - CsrpFreeCommandLine (Peb->ProcessHeap, & CmdLineArg); /* * Terminate the current thread only. */ - NtTerminateThread (NtCurrentThread(), 0); + Status = NtTerminateThread (NtCurrentThread(), 0); } else { DisplayString (L"CSR: CsrServerInitialization failed.\n"); - - CsrpFreeCommandLine (Peb->ProcessHeap, & CmdLineArg); /* * Tell the SM we failed. */ - NtTerminateProcess (NtCurrentProcess(), 0); + Status = NtTerminateProcess (NtCurrentProcess(), 0); } + return (int) Status; } /* EOF */ diff --git a/reactos/subsys/csrss/csrss.xml b/reactos/subsys/csrss/csrss.xml index 33b5610b558..668b4ff9e64 100644 --- a/reactos/subsys/csrss/csrss.xml +++ b/reactos/subsys/csrss/csrss.xml @@ -4,6 +4,7 @@ 0x0600 0x0501 + nt intrlck ntdll smdll @@ -13,7 +14,7 @@ user.c wapi.c - csrss.h + csrss.h csrss.c init.c print.c diff --git a/reactos/subsys/csrss/include/api.h b/reactos/subsys/csrss/include/api.h index 9d31035f861..610c65cc3b6 100644 --- a/reactos/subsys/csrss/include/api.h +++ b/reactos/subsys/csrss/include/api.h @@ -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 CsrDuplicateHandleTable(PCSRSS_PROCESS_DATA SourceProcessData, PCSRSS_PROCESS_DATA TargetProcessData); 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 CsrReleaseObject( PCSRSS_PROCESS_DATA ProcessData, HANDLE Object ); NTSTATUS STDCALL CsrVerifyObject( PCSRSS_PROCESS_DATA ProcessData, HANDLE Object ); diff --git a/reactos/subsys/csrss/init.c b/reactos/subsys/csrss/init.c index fede65d6a3b..9bc8e7de5c0 100644 --- a/reactos/subsys/csrss/init.c +++ b/reactos/subsys/csrss/init.c @@ -24,7 +24,6 @@ HANDLE CsrObjectDirectory = (HANDLE) 0; UNICODE_STRING CsrDirectoryName; extern HANDLE CsrssApiHeap; -extern PRTL_USER_PROCESS_PARAMETERS RtlProcessParameters; static unsigned InitCompleteProcCount; static CSRPLUGIN_INIT_COMPLETE_PROC *InitCompleteProcs = NULL; @@ -95,13 +94,10 @@ ULONG 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; @@ -109,13 +105,6 @@ CsrpParseCommandLine ( 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"); @@ -133,13 +122,13 @@ CsrpParseCommandLine ( } /********************************************************************** - * 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"); @@ -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: hosted server DLL as received from the command line; @@ -182,7 +171,7 @@ CsrpInitVideo (ULONG argc, PWSTR* argv) * TODO: DWORD ServerId) */ static NTSTATUS -CsrpInitWin32Csr (ULONG argc, PWSTR* argv) +CsrpInitWin32Csr (int argc, char ** argv, char ** envp) { NTSTATUS Status; UNICODE_STRING DllName; @@ -296,10 +285,10 @@ CsrpCreateListenPort (IN LPWSTR Name, /* === 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__); @@ -317,10 +306,10 @@ CsrpCreateHeap (ULONG argc, PWSTR* argv) } /********************************************************************** - * CsrpCreateCallbackPort/2 + * CsrpCreateCallbackPort/3 */ static NTSTATUS -CsrpCreateCallbackPort (ULONG argc, PWSTR* argv) +CsrpCreateCallbackPort (int argc, char ** argv, char ** envp) { DPRINT("CSR: %s called\n", __FUNCTION__); @@ -330,10 +319,10 @@ CsrpCreateCallbackPort (ULONG argc, PWSTR* argv) } /********************************************************************** - * 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; @@ -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 -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}; @@ -434,7 +464,7 @@ CsrpLoadKernelModeDriver (ULONG argc, PWSTR* argv) * CsrpCreateApiPort/2 */ static NTSTATUS -CsrpCreateApiPort (ULONG argc, PWSTR* argv) +CsrpCreateApiPort (int argc, char ** argv, char ** envp) { DPRINT("CSR: %s called\n", __FUNCTION__); @@ -447,7 +477,7 @@ CsrpCreateApiPort (ULONG argc, PWSTR* argv) * CsrpApiRegisterDef/0 */ static NTSTATUS -CsrpApiRegisterDef (ULONG argc, PWSTR* argv) +CsrpApiRegisterDef (int argc, char ** argv, char ** envp) { return CsrApiRegisterDefinitions(NativeDefinitions); } @@ -456,7 +486,7 @@ CsrpApiRegisterDef (ULONG argc, PWSTR* argv) * CsrpCCTS/2 */ static NTSTATUS -CsrpCCTS (ULONG argc, PWSTR* argv) +CsrpCCTS (int argc, char ** argv, char ** envp) { ULONG Dummy; ULONG DummyLength = sizeof(Dummy); @@ -473,7 +503,7 @@ CsrpCCTS (ULONG argc, PWSTR* argv) * 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; @@ -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 { BOOL Required; @@ -532,7 +562,7 @@ struct { {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"}, @@ -553,8 +583,9 @@ struct { */ BOOL STDCALL CsrServerInitialization ( - ULONG ArgumentCount, - PWSTR *ArgumentArray + int argc, + char ** argv, + char ** envp ) { UINT i = 0; @@ -564,7 +595,7 @@ CsrServerInitialization ( 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", diff --git a/reactos/subsys/smss/smss.c b/reactos/subsys/smss/smss.c index 715539edc8d..0258d7419eb 100644 --- a/reactos/subsys/smss/smss.c +++ b/reactos/subsys/smss/smss.c @@ -33,16 +33,15 @@ ULONG SmSsProcessId = 0; /* Native image's entry point */ -VOID STDCALL -NtProcessStartup(PPEB Peb) +NTSTATUS __cdecl _main(int argc, + char *argv[], + char *envp[], + ULONG DebugFlag) { NTSTATUS Status = STATUS_SUCCESS; PROCESS_BASIC_INFORMATION PBI = {0}; -PrintString("*** EXPERIMENTAL ***\n"); - - PrintString("ReactOS Session Manager %s (Build %s)\n", - KERNEL_RELEASE_STR, + PrintString("ReactOS Session Manager (Build %s)\n", KERNEL_VERSION_BUILD_STR); /* Lookup yourself */ @@ -94,7 +93,7 @@ ByeBye: // NtTerminateProcess(NtCurrentProcess(), 0); #endif - NtTerminateThread(NtCurrentThread(), Status); + return NtTerminateThread(NtCurrentThread(), Status); } /* EOF */ diff --git a/reactos/subsys/smss/smss.xml b/reactos/subsys/smss/smss.xml index 4b9b1602625..5f2ef3270dc 100644 --- a/reactos/subsys/smss/smss.xml +++ b/reactos/subsys/smss/smss.xml @@ -2,10 +2,11 @@ . + nt smlib ntdll -lgcc - smss.h + smss.h client.c debug.c init.c