コード例 #1
0
        private DebuggerAction FinalizeContinue(IDebuggeeThread thread)
        {
            _isContinuing = false;

            var eventArgs = new DebuggeeThreadEventArgs(thread)
            {
                NextAction = _continueAction
            };

            OnResumedExecution(eventArgs);

            return(eventArgs.NextAction);
        }
コード例 #2
0
ファイル: DebuggerSession.cs プロジェクト: schifflee/Ladybug
        private DebuggerAction HandleExitThreadDebugEvent(DEBUG_EVENT debugEvent)
        {
            var info    = debugEvent.InterpretDebugInfoAs <EXIT_THREAD_DEBUG_INFO>();
            var process = GetProcessById((int)debugEvent.dwProcessId);
            var thread  = process.GetThreadById((int)debugEvent.dwThreadId);

            thread.ExitCode = (int)info.dwExitCode;

            var eventArgs = new DebuggeeThreadEventArgs(thread);

            OnThreadTerminated(eventArgs);

            process.RemoveThread(thread);
            return(eventArgs.NextAction);
        }
コード例 #3
0
ファイル: DebuggerSession.cs プロジェクト: schifflee/Ladybug
        private DebuggerAction HandleCreateThreadDebugEvent(DEBUG_EVENT debugEvent)
        {
            var info    = debugEvent.InterpretDebugInfoAs <CREATE_THREAD_DEBUG_INFO>();
            var process = GetProcessById((int)debugEvent.dwProcessId);

            var thread = new DebuggeeThread(process, info.hThread, (int)debugEvent.dwThreadId, info.lpStartAddress);

            process.AddThread(thread);

            var eventArgs = new DebuggeeThreadEventArgs(thread);

            OnThreadStarted(eventArgs);

            return(eventArgs.NextAction);
        }
コード例 #4
0
ファイル: DebuggerSession.cs プロジェクト: schifflee/Ladybug
        private void HandleNextAction(DebuggerAction nextAction, DEBUG_EVENT nextEvent)
        {
            switch (nextAction)
            {
            case DebuggerAction.Continue:
                _nextContinueStatus = ContinueStatus.DBG_CONTINUE;
                break;

            case DebuggerAction.ContinueWithException:
                _nextContinueStatus = ContinueStatus.DBG_EXCEPTION_NOT_HANDLED;
                break;

            case DebuggerAction.Stop:
                var process = GetProcessById((int)nextEvent.dwProcessId);
                var thread  = process.GetThreadById((int)nextEvent.dwThreadId)
                              ?? new DebuggeeThread(process, IntPtr.Zero, (int)nextEvent.dwThreadId, IntPtr.Zero);

                var eventArgs = new DebuggeeThreadEventArgs(thread);
                eventArgs.NextAction = DebuggerAction.Stop;
                OnPaused(eventArgs);

                switch (eventArgs.NextAction)
                {
                case DebuggerAction.Continue:
                    _nextContinueStatus = ContinueStatus.DBG_CONTINUE;
                    break;

                case DebuggerAction.ContinueWithException:
                    _nextContinueStatus = ContinueStatus.DBG_EXCEPTION_NOT_HANDLED;
                    break;

                case DebuggerAction.Stop:
                    _continueEvent.WaitOne();
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }

                break;
            }
        }
コード例 #5
0
ファイル: ConsoleDebugger.cs プロジェクト: schifflee/Ladybug
        private void SessionOnPaused(object sender, DebuggeeThreadEventArgs args)
        {
            _currentThread = args.Thread;
            var threadContext = _currentThread.GetThreadContext();

            if (!_justStepped)
            {
                _logger.WriteLine("Debuggee paused.");
                _logger.WriteLine("Thread ID: " + args.Thread.Id);

                var registerCommand = _executor.GetCommand <RegisterCommand>();
                registerCommand.SetCurrentThread(_currentThread);
                registerCommand.Execute(_session, new string[0], _logger);
            }

            uint eip = (uint)threadContext.GetRegisterByName("eip").Value;

            _executor.GetCommand <DisassembleCommand>().Execute(_session, new[] { eip.ToString("X8"), "1" }, _logger);

            _justStepped = false;
        }
コード例 #6
0
        private DebuggerAction FinalizeStep(DebuggeeThread thread)
        {
            RestoreBreakpoints();

            _isStepping = false;

            if (_isRestoringFromGuard)
            {
                return(FinalizeRestoreFromGuard(thread));
            }

            if (_isContinuing)
            {
                return(FinalizeContinue(thread));
            }

            var eventArgs = new DebuggeeThreadEventArgs(thread)
            {
                NextAction = DebuggerAction.Stop
            };

            OnStepCompleted(eventArgs);
            return(eventArgs.NextAction);
        }
コード例 #7
0
ファイル: DebuggerSession.cs プロジェクト: schifflee/Ladybug
 protected virtual void OnStepped(DebuggeeThreadEventArgs e)
 {
     Stepped?.Invoke(this, e);
 }
コード例 #8
0
ファイル: DebuggerSession.cs プロジェクト: schifflee/Ladybug
 protected virtual void OnPaused(DebuggeeThreadEventArgs e)
 {
     Paused?.Invoke(this, e);
 }
コード例 #9
0
ファイル: DebuggerSession.cs プロジェクト: schifflee/Ladybug
 protected virtual void OnThreadTerminated(DebuggeeThreadEventArgs e)
 {
     ThreadTerminated?.Invoke(this, e);
 }
コード例 #10
0
ファイル: ConsoleDebugger.cs プロジェクト: schifflee/Ladybug
 private void SessionOnThreadTerminated(object sender, DebuggeeThreadEventArgs args)
 {
     _logger.WriteLine("Thread terminated. ID: " + args.Thread.Id);
 }
コード例 #11
0
ファイル: ConsoleDebugger.cs プロジェクト: schifflee/Ladybug
 private void SessionOnStepped(object sender, DebuggeeThreadEventArgs args)
 {
     _justStepped = true;
 }
コード例 #12
0
 protected virtual void OnResumedExecution(DebuggeeThreadEventArgs e)
 {
     ResumedExecution?.Invoke(this, e);
 }