public int GetThreadProperties100(uint dwFields, THREADPROPERTIES100[] ptp)
        {
            enum_THREADPROPERTY_FIELDS100 fields = (enum_THREADPROPERTY_FIELDS100)dwFields;

            if (ptp == null)
            {
                throw new ArgumentNullException("ptp");
            }
            if (ptp.Length == 0)
            {
                throw new ArgumentException();
            }

            ptp[0].dwFields = 0;

            // thread ID
            if ((dwFields & (uint)enum_THREADPROPERTY_FIELDS100.TPF100_ID) != 0)
            {
                if (ErrorHandler.Succeeded(GetThreadId(out ptp[0].dwThreadId)))
                {
                    ptp[0].dwManagedThreadId = ptp[0].dwThreadId;
                    ptp[0].dwFields         |= (uint)enum_THREADPROPERTY_FIELDS100.TPF100_ID;
                }
            }

            // thread location
            if ((fields & enum_THREADPROPERTY_FIELDS100.TPF100_LOCATION) != 0)
            {
                if (TryGetLocation(out ptp[0].bstrLocation))
                {
                    ptp[0].dwFields |= (uint)enum_THREADPROPERTY_FIELDS100.TPF100_LOCATION;
                }
            }

            // name
            if ((fields & enum_THREADPROPERTY_FIELDS100.TPF100_NAME) != 0)
            {
                if (ErrorHandler.Succeeded(GetName(out ptp[0].bstrName)))
                {
                    ptp[0].dwFields |= (uint)enum_THREADPROPERTY_FIELDS100.TPF100_NAME;
                }
            }

            // display name
            if ((fields & enum_THREADPROPERTY_FIELDS100.TPF100_DISPLAY_NAME) != 0)
            {
                if (ErrorHandler.Succeeded(GetName(out ptp[0].bstrDisplayName)))
                {
                    ptp[0].dwFields |= (uint)enum_THREADPROPERTY_FIELDS100.TPF100_DISPLAY_NAME;
                }
            }

            // display name priority
            if ((fields & enum_THREADPROPERTY_FIELDS100.TPF100_DISPLAY_NAME_PRIORITY) != 0)
            {
                ptp[0].DisplayNamePriority = (uint)DISPLAY_NAME_PRIORITY100.DISPLAY_NAME_PRI_NORMAL_100;
                ptp[0].dwFields           |= (uint)enum_THREADPROPERTY_FIELDS100.TPF100_DISPLAY_NAME_PRIORITY;
            }

            // thread priority (string)
            if ((fields & enum_THREADPROPERTY_FIELDS100.TPF100_PRIORITY) != 0)
            {
                if (ErrorHandler.Succeeded(GetThreadPriority(out ptp[0].bstrPriority)))
                {
                    ptp[0].dwFields |= (uint)enum_THREADPROPERTY_FIELDS100.TPF100_PRIORITY;
                }
            }

            // thread priority (id)
            if ((fields & enum_THREADPROPERTY_FIELDS100.TPF100_PRIORITY_ID) != 0)
            {
                if (ErrorHandler.Succeeded(GetThreadPriorityId(out ptp[0].priorityId)))
                {
                    ptp[0].dwFields |= (uint)enum_THREADPROPERTY_FIELDS100.TPF100_PRIORITY_ID;
                }
            }

#if !HIDE_THREADS
            ThreadStatus status       = _thread.GetStatus();
            int          suspendCount = status != ThreadStatus.Zombie ? _thread.GetSuspendCount() : 0;

            // thread state
            if ((fields & enum_THREADPROPERTY_FIELDS100.TPF100_STATE) != 0)
            {
                ptp[0].dwFields |= (uint)enum_THREADPROPERTY_FIELDS100.TPF100_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;
            }

            // suspend count
            if ((fields & enum_THREADPROPERTY_FIELDS100.TPF100_SUSPENDCOUNT) != 0)
            {
                ptp[0].dwFields      |= (uint)enum_THREADPROPERTY_FIELDS100.TPF100_SUSPENDCOUNT;
                ptp[0].dwSuspendCount = (uint)suspendCount;
            }
#endif

#if false
            // affinity
            if ((fields & enum_THREADPROPERTY_FIELDS100.TPF100_AFFINITY) != 0)
            {
                ptp[0].dwFields    |= (uint)enum_THREADPROPERTY_FIELDS100.TPF100_AFFINITY;
                ptp[0].AffinityMask = ~0UL;
            }
#endif

            // category
            if ((fields & enum_THREADPROPERTY_FIELDS100.TPF100_CATEGORY) != 0)
            {
                ptp[0].dwFields        |= (uint)enum_THREADPROPERTY_FIELDS100.TPF100_CATEGORY;
                ptp[0].dwThreadCategory = (uint)_category;
            }

            return(VSConstants.S_OK);
        }
        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);
        }