[ros-dev] confusing smss routine (ea)

ea ea at iol.it
Wed Mar 30 23:57:36 CEST 2005

Hi Gunnar,

> I was doing some changes to RtlCreateUserProcess and saw the strage 
> rotuine SmCreateUserProcess:
> http://svn.reactos.com/viewcvs/trunk/reactos/subsys/smss/smapiexec.c?rev=14244&view=markup 
> It has several bugs/problems/confusions:

Sorry, SM is not finished yet.

> 1) RtlDestroyProcessParameters is not called if RtlCreateUserProcess 
> failed.

This is a bug.

> 2) If WaitForIt is TRUE and you specify a timeout, the caller in not 
> notified if SmCreateUserProcess returned due to timeout. The process 
> will stay running forever.

This is a bug.

> 3) If TerminateIt is TRUE, handles are closed. This is 
> wrong/confusing. Closing the handles does not terminate the process 
> (wrong name?).

This is a bug.

> 4) If you dont pass a UserProcessInfo and TerminateIt is FALSE,
> it will leak thread/process handles.

This may not be a bug, but, as you noted, a badly chosen name. The 
intended use of the TerminateIt is for native processes, which handles 
SM is not interested in, when (if) they terminate. A native process, 
which is not a subsystem server, could run forever (see the native shell 
Steven proposed a few days ago).

> 5) If you pass UserProcessInfo and TerminateIt is TRUE, the 
> thread/process handles in UserProcessInfo will be invalid.

This is an intended behaviour: if TerminateIt==TRUE I am not interested 
in those handles. SM is interested only in subsystems, which it will 
manage (as it self-register for managing such images). Maybe running 
native boot-time processes should be done after self-registering, but it 
would be useless, because those processes do not need to connect to 

> etc.etc.
> VERY confusing and bug prone:
I am sorry: I have got neither the sources, nor the documents David 
Cutler wrote.

> SmCreateUserProcess is used once in the end of this file and it pass 
> FALSE for TerminateIt and pass no UserProcessInfo thus the 
> thread/process handles will never be closed.

It is used also in initrun.c, for running native boot-time processes 
(autocheck, chkreg et sim.) before any environment subsystem is active.

> I should have fixed it myself if i just understod how this routine is 
> _supposed_ to work:-D

This is a critical routine, because every child process SM creates is 
originated there. But current bugs, I am sure it will need more work to 
match that role.

Please feel free to fix any bug you find: I am not the owner of the SM! 
:) I just tried to implement how I gussed things work there (do not 
exclude the case I am wrong, I am a bad programmer etc.).

I am sorry I can't fix the bugs right now, but I'll be busy for a few 
more days.

Emanuele Aliberti

More information about the Ros-dev mailing list