public int GetThreadProperties(enum_THREADPROPERTY_FIELDS dwFields, THREADPROPERTIES[] ptp) { if (ptp == null) { throw new ArgumentNullException("ptp"); } if (ptp.Length == 0) { throw new ArgumentException(); } ptp[0].dwFields = 0; if ((dwFields & enum_THREADPROPERTY_FIELDS.TPF_ID) != 0) { if (ErrorHandler.Succeeded(GetThreadId(out ptp[0].dwThreadId))) { ptp[0].dwFields |= enum_THREADPROPERTY_FIELDS.TPF_ID; } } if ((dwFields & enum_THREADPROPERTY_FIELDS.TPF_LOCATION) != 0) { if (TryGetLocation(out ptp[0].bstrLocation)) { ptp[0].dwFields |= enum_THREADPROPERTY_FIELDS.TPF_LOCATION; } } if ((dwFields & enum_THREADPROPERTY_FIELDS.TPF_NAME) != 0) { if (ErrorHandler.Succeeded(GetName(out ptp[0].bstrName))) { ptp[0].dwFields |= enum_THREADPROPERTY_FIELDS.TPF_NAME; } } if ((dwFields & enum_THREADPROPERTY_FIELDS.TPF_PRIORITY) != 0) { if (ErrorHandler.Succeeded(GetThreadPriority(out ptp[0].bstrPriority))) { ptp[0].dwFields |= enum_THREADPROPERTY_FIELDS.TPF_PRIORITY; } } #if !HIDE_THREADS ThreadStatus status = _thread.GetStatus(); int suspendCount = status != ThreadStatus.Zombie ? _thread.GetSuspendCount() : 0; if ((dwFields & enum_THREADPROPERTY_FIELDS.TPF_STATE) != 0) { ptp[0].dwFields |= enum_THREADPROPERTY_FIELDS.TPF_STATE; enum_THREADSTATE vsthreadState = 0; if (suspendCount > 1) { vsthreadState = enum_THREADSTATE.THREADSTATE_FROZEN; } else if (status == ThreadStatus.Zombie) { vsthreadState = enum_THREADSTATE.THREADSTATE_DEAD; } else if (status == ThreadStatus.Sleeping || status == ThreadStatus.Wait || status == ThreadStatus.Monitor) { vsthreadState = enum_THREADSTATE.THREADSTATE_STOPPED; } else if (status == ThreadStatus.NotStarted) { vsthreadState = enum_THREADSTATE.THREADSTATE_FRESH; } else { vsthreadState = enum_THREADSTATE.THREADSTATE_RUNNING; } ptp[0].dwThreadState = (uint)vsthreadState; } if ((dwFields & enum_THREADPROPERTY_FIELDS.TPF_SUSPENDCOUNT) != 0) { ptp[0].dwFields |= enum_THREADPROPERTY_FIELDS.TPF_SUSPENDCOUNT; ptp[0].dwSuspendCount = (uint)suspendCount; } #endif return(VSConstants.S_OK); }