In this post i am going talk about the "ServiceStarter" function that i consider as the backbone of svchost.exe.
First, i have to remind you with two points.
1) svchost main function (say, Main) is the entry point of svchost itself. So, it is called once per instance.
2) svchost ServiceStarter is the entry point of any svchost service running under the context of the current svchost instance. So, for every svchost service, ServiceStarter is called.
So, what does ServiceStarter do and how it looks like?
Another question...
Who pushes the arguments to the "ServiceStarter" function and how the arguments look like?
Okay, the "ServiceStarter" function is called by the SCM (Service Control Manager) not by svchost. Hence, the arguments are pushed by SCM.
The arguments are argc and argv.
Usually, argc is 1 and argv[0] is a pointer to the being-started service name. In other cases, SCM may increase argc. See the 2 figures below.
In each of the two figures above, argc is 2, argv[0] is "DHCP", and argv[1] is "walied".
Now let's go back to our main point. What does the "ServiceStarter" function do??
1) It iterates through all the ServiceArray elements comparing each _SERVICE_ARRAY_ELEMENT::srv_name with argv[0].
2) If found, it calls the "GetServiceMainFunctions" function which tries to resolve addresses of both ServiceMain (some services might choose other names by configuring their registry entries) and SvchostPushServiceGlobals after loading the corresponding ServiceDLL. It also inserts a new _SRV_DLL_INFO structure into a circular doubly linked list.
3) If the Shared globals table is not constructed yet, It calls the "_SvchostBuildSharedGlobals" function to build it.
4) It increments _SERVICE_ARRAY_ELEMENT::Count. Remember, this element is decremented by the "UnloadServiceDll" function.
5) It calls the "SvchostPushServiceGlobals" function if its address is successfully resolved.
6) It calls the "ServiceMain" function if its address is successfully resolved.
7) When the "ServiceMain" function returns, it calls the "UnloadServiceDll" function.
I leave you to look at the figure above. It is an approximate view of the "ServiceStarter" function.
Any suggestions are welcome.
waliedassar@gmail.com
First, i have to remind you with two points.
1) svchost main function (say, Main) is the entry point of svchost itself. So, it is called once per instance.
2) svchost ServiceStarter is the entry point of any svchost service running under the context of the current svchost instance. So, for every svchost service, ServiceStarter is called.
So, what does ServiceStarter do and how it looks like?
Another question...
Who pushes the arguments to the "ServiceStarter" function and how the arguments look like?
Okay, the "ServiceStarter" function is called by the SCM (Service Control Manager) not by svchost. Hence, the arguments are pushed by SCM.
The arguments are argc and argv.
Usually, argc is 1 and argv[0] is a pointer to the being-started service name. In other cases, SCM may increase argc. See the 2 figures below.
In each of the two figures above, argc is 2, argv[0] is "DHCP", and argv[1] is "walied".
Now let's go back to our main point. What does the "ServiceStarter" function do??
1) It iterates through all the ServiceArray elements comparing each _SERVICE_ARRAY_ELEMENT::srv_name with argv[0].
2) If found, it calls the "GetServiceMainFunctions" function which tries to resolve addresses of both ServiceMain (some services might choose other names by configuring their registry entries) and SvchostPushServiceGlobals after loading the corresponding ServiceDLL. It also inserts a new _SRV_DLL_INFO structure into a circular doubly linked list.
3) If the Shared globals table is not constructed yet, It calls the "_SvchostBuildSharedGlobals" function to build it.
4) It increments _SERVICE_ARRAY_ELEMENT::Count. Remember, this element is decremented by the "UnloadServiceDll" function.
5) It calls the "SvchostPushServiceGlobals" function if its address is successfully resolved.
6) It calls the "ServiceMain" function if its address is successfully resolved.
7) When the "ServiceMain" function returns, it calls the "UnloadServiceDll" function.
I leave you to look at the figure above. It is an approximate view of the "ServiceStarter" function.
Any suggestions are welcome.
waliedassar@gmail.com
thank you.
ReplyDeleteI wish you the best of luck with your study.