mirror of
https://github.com/reactos/reactos.git
synced 2024-10-22 22:09:47 +00:00
Fix startup code for native NT processes.
smss, autocheck, csrss use new startup code. svn path=/trunk/; revision=18365
This commit is contained in:
parent
4aa4442880
commit
320979be58
|
@ -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;
|
|
||||||
|
|
||||||
} COMMAND_LINE_ARGUMENT, *PCOMMAND_LINE_ARGUMENT;
|
PrintString("ReactOS Client/Server Run-Time (Build %s)\n",
|
||||||
|
|
||||||
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 */
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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 );
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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>
|
||||||
|
|
Loading…
Reference in a new issue