Пример #1
0
        void IFunctionTracer.OnExitBreakpointHit(DkmRuntimeBreakpoint bp, DkmThread thread, bool hasException)
        {
            FunctionTraceEntryDataItem traceDataItem = bp.GetDataItem <FunctionTraceEntryDataItem>();

            if (OnFunctionExited != null)
            {
                DkmStackWalkFrame  frame        = thread.GetTopStackWalkFrame(bp.RuntimeInstance);
                StackFrameAnalyzer exitAnalyzer = null;
                if (traceDataItem != null)
                {
                    DkmSystemInformationFlags systemInformationFlags =
                        frame.ModuleInstance.Process.SystemInformation.Flags;
                    bool isTarget64Bit = systemInformationFlags.HasFlag(DkmSystemInformationFlags.Is64Bit);
                    int  pointerSize   = (isTarget64Bit) ? 8 : 4;
                    exitAnalyzer = new CachedFrameAnalyzer(
                        frameAnalyzer.Parameters,
                        traceDataItem.EntryArgumentValues,
                        pointerSize);
                }
                OnFunctionExited(frame, exitAnalyzer);
            }

            // Since this was a one-shot breakpoint, it is unconditionally closed.
            bp.Close();
        }
Пример #2
0
        private StackFrameAnalyzer CreateFrameAnalyzer(
            DkmNativeModuleInstance module,
            FunctionParameter[] parameters)
        {
            DkmSystemInformationFlags systemInformationFlags = module.Process.SystemInformation.Flags;
            bool isTarget64Bit = systemInformationFlags.HasFlag(DkmSystemInformationFlags.Is64Bit);
            int  pointerSize   = (isTarget64Bit) ? 8 : 4;

            if (isTarget64Bit)
            {
                return(new X64FrameAnalyzer(parameters));
            }
            else
            {
                return(new StdcallFrameAnalyzer(parameters));
            }
        }