Hiding your Application from the Win9x Alt-Ctrl-Del list
by Sreejath
Foreword
This article deals with hiding an Application from the Windows task list.
As developers, we often feel the need to run certain applications that provide support
services to another application. In such cases it is desirable that this support application doesn't show up in the Alt-Ctrl-Del list (also called the "hit-list") as this may enable the user to kill it causing an
application/system crash. In this article we'll discuss how to achieve this in a VB application using API programming.
Note: The technique here is applicable only to Win9x/ME machines. It will not work on NT/2k machines. This is because the Alt-Ctrl-Del list in NT shows both processes and services.
Here the key concept to be understood is this: The task list, while showing the currently
running "tasks" on a machine, does not display those registered as services. So to prevent a task from appearing in the task list,
register it as a service. And to make the task appear in the task list again, unregister it. Simple!
Let's get on with the code.
As always, start up Visual Basic and create a new Standard EXE project.
A form (Form1) should have been added to the project by default.
Copy this code into the declarations section of the form:
Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function RegisterServiceProcess Lib "kernel32" (ByVal dwProcessID As Long, _
ByVal dwType As Long) As Long
Private Const RSP_SIMPLE_SERVICE = 1
Private Const RSP_UNREGISTER_SERVICE = 0
Create a new procedure to the form, called "MakeService".
Add the following code to this procedure:
Dim pid As Long
Dim lngRet As Long
pid = GetCurrentProcessId()
lngRet = RegisterServiceProcess(pid, RSP_SIMPLE_SERVICE)
To remove your program from the Ctrl+Alt+Delete add this code to call the procedure:
Call MakeService
This can be called from any procedure in the form.
Now press Alt-Ctrl-Del and you’ll see that our app is not visible in the list.
To make your program appear in the task list again:
Create a new procedure to the form, called "MakeProcess".
Add the following code to this procedure:
Dim pid As Long
Dim lngRet As Long
pid = GetCurrentProcessId()
lngRet = RegisterServiceProcess(pid, RSP_UNREGISTER_SERVICE)
To unregister your application as a service (and therefore show the program in the Ctrl+Alt+Delete
task list), add this code to call the procedure:
Call MakeProcess
Now press Alt-Ctrl-Del and you’ll see that our app is again visible in the list.
Analysis
Let us try to understand what we've been doing here.
First we declared the necessary API calls. (For more information re: how to declare and use API functions, see Article#2- Using API in VB. For more information regarding API Programming see Article#1 What is Windows API?)
Here we need three API calls.
1) GetCurrentProcessId This call, which doesn't accept any parameters, returns the
ProcessID of the current process. The ProcessID is a unique Long value that Windows
assigns to a process.
2) GetCurrentProcess This call returns a handle to the current process and is used by the
GetCurrentProcessId function in determining the ProcessID.
3) RegisterServiceProcess This call accepts the ProcessID of a process and a type parameter.
It then registers/unregisters the process (whose ID is given) as a service depending on the
value of the type parameter. The type parameter can be either RSP_SIMPLE_SERVICE(= 1)
in which case the process is registered as a simple service (it no longer appears in the task
list) or RSP_UNREGISTER_SERVICE (= 0), in which case the process is unregistered as a
service (appears in the task list). Both these constants are declared in the General |
Declarations section.
Now, whenever we want to register a service as a process, we retrieve its ProcessID, pass it to
the RegisterServiceProcess along with the dwType argument set to RSP_SIMPLE_SERVICE.
And when we want to unregister it, do the same thing but this time set the dwType parameter to
RSP_UNREGISTER_SERVICE.
For convenience, we have put all the necessary code in two separate procedures and call these
procedures as necessary.
That's all for now. As always, mail me if you have any comments or questions
Good-bye, Good luck and happy coding!