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);
        }