mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 01:55:19 +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
6 changed files with 92 additions and 191 deletions
|
@ -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 <csrss.h>
|
||||
|
@ -37,158 +29,35 @@
|
|||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
#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 */
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
<define name="__USE_W32API" />
|
||||
<define name="_WIN32_WINNT">0x0600</define>
|
||||
<define name="WINVER">0x0501</define>
|
||||
<library>nt</library>
|
||||
<library>intrlck</library>
|
||||
<library>ntdll</library>
|
||||
<library>smdll</library>
|
||||
|
@ -13,7 +14,7 @@
|
|||
<file>user.c</file>
|
||||
<file>wapi.c</file>
|
||||
</directory>
|
||||
<pch>csrss.h</pch>
|
||||
<pch>csrss.h</pch>
|
||||
<file>csrss.c</file>
|
||||
<file>init.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 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 );
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -2,10 +2,11 @@
|
|||
<include base="smss">.</include>
|
||||
<define name="__USE_W32API" />
|
||||
<define name="_DISABLE_TIDENTS" />
|
||||
<library>nt</library>
|
||||
<library>smlib</library>
|
||||
<library>ntdll</library>
|
||||
<linkerflag>-lgcc</linkerflag>
|
||||
<pch>smss.h</pch>
|
||||
<pch>smss.h</pch>
|
||||
<file>client.c</file>
|
||||
<file>debug.c</file>
|
||||
<file>init.c</file>
|
||||
|
|
Loading…
Reference in a new issue