Пример #1
0
        public static List <ThreadStackItem> ThreadStack(IntPtr processId, IntPtr threadId, IntPtr threadHandle)
        {
            Monitor.Enter(ThreadStackItemResult);
            try
            {
                ThreadStackItemResult.Clear();
                unsafe
                {
                    var context = new PH_THREAD_STACK_CONTEXT
                    {
                        ProcessId    = processId,
                        ThreadId     = threadId,
                        ThreadHandle = threadHandle,
                        Callback     =
                            Marshal.GetFunctionPointerForDelegate <PhpWalkThreadStackCallback_CALLBACK>(
                                ThreadStackCallback)
                    };

                    PhpRefreshThreadStackThreadStart(ref context);

                    if (context.StopWalk || context.WalkStatus < 0)
                    {
                        return(null);
                    }

                    return(new List <ThreadStackItem>(ThreadStackItemResult));
                }
            }
            finally
            {
                Monitor.Exit(ThreadStackItemResult);
            }
        }
Пример #2
0
 private static extern unsafe int PhpRefreshThreadStackThreadStart(
     [In, Out] ref PH_THREAD_STACK_CONTEXT threadStackContext);