views:

73

answers:

1

Greetings!

When I try to use GetThreadContext() on a thread that I've started with CreateProcess(), I receive an error of 998: ERROR_NOACCESS

You can find a contrived but functional code example of this problem here: http://pastebin.com/tamDhYza

Based on the MSDN article regarding "Thread Security and Access Rights", my assumption is that I need to first pass the THREAD_GET_CONTEXT property into the lpThreadAttributes parameter of CreateProcess(). The type required by this argument is LPSECURITY_ATTRIBUTES, which appears to be a long pointer to the struct SECURITY_ATTRIBUTES. Unfortunately, I've not had much luck in figuring out how to add rights to this structure.

Could anyone help point me in the right direction?

A: 

I think you probably need to adjust the privileges of the calling code so that you can access the remote process. I suspect that you need to enable the SE_DEBUG_NAME privilege (see here) before you try and get the remote thread context. I'm not sure though as I usually use the debug API and call CreateProcess() with DEBUG_PROCESS which requires SE_DEBUG_NAME anyway...

If you do need to create a security descriptor then what you're doing is creating a DACL (discretionary access control list) which is a SECURITY_ATTRIBUTES structure that's populated with ACLs (access control lists) which allow or deny access to the resource by various principals (users, computers, etc). This used to be quite complex with lots of complicated API calls to make but now it's much easier, see http://msdn.microsoft.com/en-us/library/ms717798(VS.85).aspx for details.

Len Holgate
Thanks for the reply, Len. Do you have any guidance on how to encode THREAD_GET_CONTEXT into Security Descriptor String Format?
lechnito
Try starting the process with `DEBUG_PROCESS` first. I think that may be all you need to do. The security descriptor you would be creating for the process that you're creating is to tell it what IT can do not what YOU can do to IT.
Len Holgate