Solved

how to find the current process handle?

Posted on 1998-04-15
17
390 Views
Last Modified: 2013-12-03
THe Win32API function GetCurrentProcess does not return a real handle to the current process (and the pseudo handle returned always îs -1 !!).

How is it possible to find out this current process handle? I want to give it to anothe process who should take control of the first one.
0
Comment
Question by:poupou
17 Comments
 
LVL 22

Expert Comment

by:nietod
ID: 1412776
Try the OpenProcess(0 windows API procedure.
0
 
LVL 22

Expert Comment

by:nietod
ID: 1412777
That is supposed to be OpenProcess().

The OpenProcess() procedure allows you to specify which operations can be performed with the handle.  This allows you to limit the other process from taking actions with your proccess that you don't want.
0
 

Author Comment

by:poupou
ID: 1412778
the openprocess returns a handle that seems to be not valid for other processes.
0
 
LVL 22

Expert Comment

by:nietod
ID: 1412779
No it is valid, it is not a pseudo handle.  What are your trying to do with it?
0
 
LVL 22

Expert Comment

by:nietod
ID: 1412780
You might need to copy the handle for the target process using DuplicateHandle().  but I don't think that is necessary.
0
 

Author Comment

by:poupou
ID: 1412781
OK, ProcessA existe already, and I want to take controle on it from ProcessB (which would Terminate ProcessA).

I need to have a valid handle to ProcessA in ProcessB to perform that. But OpenProcess(PROCESS_ALL_ACCESS,false,id of ProcessA) returns a handle that cannot be used in TerminateProcess (Access is denied).
0
 

Author Comment

by:poupou
ID: 1412782
DuplicateHandle(). That is perhaps the solution. I need to try it. But ProcessA does not know about ProcessB, so it cannot duplicate a handle to it.
0
 
LVL 22

Expert Comment

by:nietod
ID: 1412783
That is correct.  That is a security mechanism.  One proccess cannot get a handle to another process that could be used to terminate the process or do other dangerious things to the process.  

However, a process can create for itself handle that can be used to do "dangerious" things, like terminate.  It can then give this handle to other processes.  This way a process can control what other processes can do to it.  

Process A must create the handle with OpenProcess() and give it to process B.  Then process B can use it.
0
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 
LVL 22

Expert Comment

by:nietod
ID: 1412784
The "that is correct" refers to the comment where you described the behavior.  Not the DuplicateHandle() comment.  (It wasn't there when I read in the question.)

If process A does not know about process B, you are in trouble.  Process B cannot go around terminating processes without their permission.  That is a security violation.  That is dangerious.  

What exacly are you trying to do?
0
 

Author Comment

by:poupou
ID: 1412785
OK, what I try to do:

ProcessB is a GUI that controls the behaviour of ProcessA. If ProcessB (the GUI) wants to close ProcessA, B send to A a close request. Then B WaitForSingleObject(hProcessA). But this wait is never successfull, because hProcessA is not valid in ProcessB.

And I still do not succeed to pass from ProcessA a valid handle to ProcessB.
0
 
LVL 22

Expert Comment

by:nietod
ID: 1412786
Did you write both process A and B?
Are they specific processes or could one of them be any running process?
How do the processes "know" about each other?
Does one process start the other?  (Which starts which?)
How are your trying to pass a handle from A to B?  How is the handle created?
0
 
LVL 1

Expert Comment

by:iron_fist
ID: 1412787
Process B can do a lot more to process A if it owns process A. If B call CreateProcess to start A. B can call TerminateProcess to kill A with the handle returned by CreateProcess.
0
 
LVL 22

Expert Comment

by:nietod
ID: 1412788
That's why I asked if one of the processes starts the other.

The other thing is that terminating a process is not a great thing to do.  It is better to get the process to terminate itself.  (That is why I asked some of those questions.)
0
 
LVL 15

Accepted Solution

by:
Tommy Hui earned 300 total points
ID: 1412789
One application by default cannot do anything to another under Windows NT. However, it is possible under Windows 95.

Under Windows NT, if the user does not have the necessary access privilege, then this will not work. But the good thing is that a process under Windows NT can give itself some addition privileges. One such privilege is SE_DEBUG_NAME. Your process will need to give itself that privilege by using AdjustTokenPrivileges(). Then your TerminateProcess(handle, 1) will work.

This is all documented in a Win32 SDK sample called tlist under \mssdk\samples\sdktools\tlist. It describes how to retrieve the process handle of another application along with how you can terminate it.

You can harshly kill an application by using TerminateProcess. Another way would be to walk the desktop windows' children windows, which would be the top level windows. Then find the first top level window whose process id matches the id you're interested in and then posting it the WM_CLOSE message. If there isn't such a window, then it may be a service or a console application in which case TerminateProcess will work.
0
 
LVL 3

Expert Comment

by:byang
ID: 1412790
If B creates A using CreateProcess(), the handle return in PROCESS_INFORMATION structure call be used to wait for A to finish.
If not, you should call DuplicateHandle() from process A and return the duplicated handle to B.

If you're writing both A and B, and B does not start A, the easiest method is to use a mutex or a semaphore. A should grab it upon startup and and then release it upon exit. B can try to gain access or wait for it, using its globally unique name.

0
 

Author Comment

by:poupou
ID: 1412791
thui,


great!!


I tried the ms sample from tlist, and now I have the privilege to terminate processA.
I just need now to disable the SE_DEBUG_NAME privilege to be sure my problem really was due to privileges. (The examples given in the msdev help and example files do not work to disable the privileges.)


thanks a lot for your help, and also for the other experts.
0
 

Expert Comment

by:darnell_caballes
ID: 4315813
How did you get around the original problem of GetCurrentProcess always returning -1?

-d
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

This article shows a few slightly more advanced techniques for Windows 7 gadget programming, including how to save and restore user settings for your gadget and how to populate the "details" panel that is displayed in the Windows 7 gadget gallery.  …
This article describes how to programmatically preset the "Pages per Sheet" option that's available with most printer drivers.   This setting lets you do "n-Up" printing, where two, four, or more pages are printed on each sheet of paper. If your …
This is Part 3 in a 3-part series on Experts Exchange to discuss error handling in VBA code written for Excel. Part 1 of this series discussed basic error handling code using VBA. http://www.experts-exchange.com/videos/1478/Excel-Error-Handlin…
In this video I am going to show you how to back up and restore Office 365 mailboxes using CodeTwo Backup for Office 365. Learn more about the tool used in this video here: http://www.codetwo.com/backup-for-office-365/ (http://www.codetwo.com/ba…

867 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

22 Experts available now in Live!

Get 1:1 Help Now