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); } }
private static extern unsafe int PhpRefreshThreadStackThreadStart( [In, Out] ref PH_THREAD_STACK_CONTEXT threadStackContext);