Ejemplo n.º 1
0
        private void contextMenu_Opening(object sender, CancelEventArgs e)
        {
            setIPToolStripMenuItem.Visible = false;

            if (NuGenDebugEventHandler.Instance.EventObjects.Frame != null && NuGenDebugEventHandler.Instance.EventObjects.Frame.IsActiveFrame && CurrentLine != null)
            {
                NuGenMethodDefinition displayedMethod = CodeObject as NuGenMethodDefinition;

                if (displayedMethod != null)
                {
                    FunctionWrapper currentFunction      = NuGenDebugEventHandler.Instance.EventObjects.Frame.GetFunction();
                    uint            currentFunctionToken = currentFunction.GetToken();

                    if (displayedMethod.Token == currentFunctionToken)
                    {
                        ModuleWrapper currentModule           = currentFunction.GetModule();
                        bool          isInMemoryCurrentModule = currentModule.IsInMemory();
                        string        currentModuleName       = string.Empty;

                        if (isInMemoryCurrentModule)
                        {
                            currentModuleName = currentModule.GetNameFromMetaData();
                        }
                        else
                        {
                            currentModuleName = currentModule.GetName();

                            try
                            {
                                currentModuleName = Path.GetFileNameWithoutExtension(currentModuleName);
                            }
                            catch
                            {
                            }
                        }

                        currentModuleName = currentModuleName.ToLower();

                        if ((isInMemoryCurrentModule && displayedMethod.BaseTypeDefinition.ModuleScope.Name.ToLower() == currentModuleName) || (!isInMemoryCurrentModule && Path.GetFileNameWithoutExtension(displayedMethod.BaseTypeDefinition.ModuleScope.Assembly.FullPath).ToLower() == currentModuleName))
                        {
                            NuGenBaseILCode currentILCode = ilEditor.GetILCodeAtMouseCursor();
                            setIPToolStripMenuItem.Visible = true;

                            if (currentILCode != null)
                            {
                                int hResult = NuGenDebugEventHandler.Instance.EventObjects.Frame.CanSetIP(Convert.ToUInt32(currentILCode.Offset));

                                if (hResult == 0)
                                {
                                    setIPToolStripMenuItem.Enabled = true;
                                    setIPToolStripMenuItem.Tag     = currentILCode;
                                }
                                else
                                {
                                    COMException comException = Marshal.GetExceptionForHR(hResult) as COMException;

                                    if (comException != null)
                                    {
                                        NuGenUIHandler.Instance.DisplayUserWarning(Marshal.GetExceptionForHR(hResult).Message);
                                    }

                                    setIPToolStripMenuItem.Enabled = false;
                                }
                            }
                            else
                            {
                                setIPToolStripMenuItem.Enabled = false;
                            }
                        }
                    }
                }
            }
        }
Ejemplo n.º 2
0
        public void DisplayCallStack(List <FrameWrapper> callStack)
        {
            if (callStack != null)
            {
                callStackView.BeginUpdate();
                callStackView.Items.Clear();

                for (int index = 0; index < callStack.Count; index++)
                {
                    FrameWrapper    frame           = callStack[index];
                    ListViewItem    item            = new ListViewItem();
                    bool            isCodeAvailable = false;
                    FunctionWrapper function        = null;

                    try
                    {
                        function        = frame.GetFunction();
                        isCodeAvailable = true;
                    }
                    catch (COMException comException)
                    {
                        //0x80131309 == CORDBG_E_CODE_NOT_AVAILABLE
                        if ((uint)comException.ErrorCode == 0x80131309)
                        {
                            isCodeAvailable = false;
                        }
                        else
                        {
                            throw;
                        }
                    }

                    if (isCodeAvailable)
                    {
                        ModuleWrapper module        = function.GetModule();
                        uint          functionToken = function.GetToken();

                        NuGenTokenBase        tokenObject      = NuGenHelperFunctions.FindObjectByToken(functionToken, module);
                        NuGenMethodDefinition methodDefinition = tokenObject as NuGenMethodDefinition;

                        if (methodDefinition != null)
                        {
                            bool activeFrame = (index == 0);
                            NuGenFrameInformation frameInformation = new NuGenFrameInformation(NuGenDebugEventHandler.Instance.EventObjects.Thread, methodDefinition, activeFrame, frame);
                            item.Tag  = frameInformation;
                            item.Text = string.Format("{0}::{1}", methodDefinition.BaseTypeDefinition.FullName, methodDefinition.DisplayName);

                            if (!frameInformation.IsExactLocation)
                            {
                                item.Text += " - not exact offset";
                            }
                        }
                        else
                        {
                            string moduleName = module.GetName();

                            if (module.IsInMemory())
                            {
                                item.Tag = new NuGenMissingModule(module);
                            }
                            else
                            {
                                item.Tag = new NuGenMissingModule(moduleName);
                            }

                            item.Text = "Unknown method (perhaps a reference is not loaded). Module name: " + moduleName;
                        }
                    }

                    if (!frame.IsILFrame())
                    {
                        if (isCodeAvailable)
                        {
                            item.Text = "Native frame, IP offset is not available (" + item.Text + ")";
                        }
                        else
                        {
                            item.Text = "Native frame, IP offset is not available (code is unavailable).";
                        }
                    }

                    item.ToolTipText = item.Text;
                    callStackView.Items.Add(item);
                }

                callStackView.EndUpdate();
            }
        }