com.peterbochs.TSSPanel.java Source code

Java tutorial

Introduction

Here is the source code for com.peterbochs.TSSPanel.java

Source

package com.peterbochs;

import info.clearthought.layout.TableLayout;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.math.BigInteger;
import java.util.Vector;

import javax.swing.ButtonGroup;
import javax.swing.DefaultCellEditor;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.JToolBar;
import javax.swing.UIManager;
import javax.swing.border.LineBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;

import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
import com.peterbochs.architecture.IA32PageDirectory;
import com.peterswing.CommonLib;

/**
 * This code was edited or generated using CloudGarden's Jigloo SWT/Swing GUI
 * Builder, which is free for non-commercial use. If Jigloo is being used
 * commercially (ie, by a corporation, company or business for any purpose
 * whatever) then you should purchase a license for each developer using Jigloo.
 * Please visit www.cloudgarden.com for details. Use of Jigloo implies
 * acceptance of these licensing terms. A COMMERCIAL LICENSE HAS NOT BEEN
 * PURCHASED FOR THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED LEGALLY FOR
 * ANY CORPORATE OR COMMERCIAL PURPOSE.
 */
public class TSSPanel extends JPanel {
    private JTable jTable1;
    private int gdtNo;
    private JPanel jPanel1;
    private JTabbedPane jTabbedPane1;
    private JTable jPageTableTable;
    private JTable jPageDirectoryTable;
    private JLabel jLabel1;
    private JTable jTSSTable;
    private JCheckBox jHideIfAddressIsZeroCheckBox;
    private ButtonGroup buttonGroup1;
    private JButton jButton19;
    private JButton jRefreshAddressTranslateTableButton;
    private JButton jButton18;
    private JButton jButton17;
    private JToolBar jToolBar3;
    private JTable jAddressTranslateTable2;
    private JScrollPane jScrollPane13;
    private JPanel jPanel22;
    private JTextField jAddressTextField;
    private JButton jRefreshAddressTranslateButton;
    private JPanel jPanel21;
    private JRadioButton jSearchAddressRadioButton3;
    private JRadioButton jSearchAddressRadioButton2;
    private JRadioButton jSearchAddressRadioButton1;
    private JPanel jPanel20;
    private JPanel jAddressTranslatePanel;
    private JScrollPane jScrollPane5;
    private JScrollPane jScrollPane4;
    private JScrollPane jScrollPane3;
    private JScrollPane jScrollPane2;
    private JTextField jLinearAddressTextField;
    private JPanel jPanel3;
    private JSplitPane jSplitPane2;
    private JPanel jPanel2;
    private JSplitPane jSplitPane1;
    private JLabel jTypeLabel;
    private JTable jTable2;
    private JScrollPane jScrollPane1;
    private int b[] = new int[8];
    private long value;
    private long bit[] = new long[64];
    private PeterBochsDebugger peterBochsDebugger;
    private int type;
    private BigInteger gdtAddress;
    private BigInteger ldtr;
    private BigInteger cr3;

    public TSSPanel(PeterBochsDebugger peterBochsDebugger, int type, BigInteger gdtAddress, int gdtNo) {
        this.peterBochsDebugger = peterBochsDebugger;
        this.type = type;
        this.gdtAddress = gdtAddress;
        this.gdtNo = gdtNo;

        initGUI();
    }

    private void initGUI() {
        try {
            {
                BorderLayout thisLayout = new BorderLayout();
                this.setLayout(thisLayout);
            }
            {
                jTabbedPane1 = new JTabbedPane();
                this.add(jTabbedPane1, BorderLayout.CENTER);
                jTabbedPane1.setTabPlacement(JTabbedPane.LEFT);
                {
                    jSplitPane1 = new JSplitPane();
                    jTabbedPane1.addTab("TSS", null, jSplitPane1, null);
                    jSplitPane1.setDividerLocation(450);
                    {
                        jScrollPane2 = new JScrollPane();
                        jSplitPane1.add(jScrollPane2, JSplitPane.LEFT);
                        jScrollPane2.setPreferredSize(new java.awt.Dimension(449, 600));
                        {
                            TableModel jTable2Model = new DefaultTableModel(new String[][] {},
                                    new String[] { MyLanguage.getString("Field"), MyLanguage.getString("Value") });
                            jTable2 = new JTable();
                            jScrollPane2.setViewportView(jTable2);
                            jTable2.setModel(jTable2Model);
                        }
                    }
                    {
                        jScrollPane3 = new JScrollPane();
                        jSplitPane1.add(jScrollPane3, JSplitPane.RIGHT);
                        jScrollPane3.setPreferredSize(new java.awt.Dimension(457, 600));
                        {
                            TableModel jTSSTableModel = new DefaultTableModel(new String[][] {},
                                    new String[] { MyLanguage.getString("Offset"), MyLanguage.getString("Field"),
                                            MyLanguage.getString("Value"), "" });
                            jTSSTable = new JTable();
                            jScrollPane3.setViewportView(jTSSTable);
                            jTSSTable.setModel(jTSSTableModel);
                            jTSSTable.getColumn("").setCellRenderer(new ButtonRenderer());
                            jTSSTable.getColumn("").setCellEditor(new ButtonEditor(new JCheckBox()));
                        }
                    }
                }
                {
                    jPanel1 = new JPanel();
                    jTabbedPane1.addTab("Info", null, jPanel1, null);
                    BorderLayout jPanel1Layout = new BorderLayout();
                    jPanel1.setLayout(jPanel1Layout);
                    {
                        jScrollPane1 = new JScrollPane();
                        jPanel1.add(jScrollPane1, BorderLayout.CENTER);
                        jScrollPane1.setBounds(12, 38, 667, 60);
                        jScrollPane1.setBorder(new LineBorder(new java.awt.Color(0, 0, 0), 1, false));
                        {
                            DefaultTableModel jTable1Model = new DefaultTableModel(
                                    new String[][] { { "" }, { "" } }, new String[] { "31" });
                            for (int x = 30; x >= 0; x--) {
                                jTable1Model.addColumn(x);
                            }

                            jTable1 = new JTable();
                            jScrollPane1.setViewportView(jTable1);
                            jTable1.setModel(jTable1Model);
                            jTable1.setBounds(12, 12, 562, 50);
                        }
                    }
                    {
                        jTypeLabel = new JLabel();
                        jPanel1.add(jTypeLabel, BorderLayout.NORTH);
                        jTypeLabel.setText("Type : ");
                        jTypeLabel.setBounds(12, 12, 576, 14);
                    }
                }
                {
                    jPanel2 = new JPanel();
                    jTabbedPane1.addTab("Page table", null, jPanel2, null);
                    BorderLayout jPanel2Layout = new BorderLayout();
                    jPanel2.setLayout(jPanel2Layout);
                    {
                        jPanel3 = new JPanel();
                        FormLayout jPanel3Layout = new FormLayout("max(p;5dlu), max(p;5dlu), 80dlu, max(p;5dlu)",
                                "max(p;5dlu), max(p;5dlu), max(p;5dlu), max(p;5dlu)");
                        jPanel3.setLayout(jPanel3Layout);
                        jPanel2.add(jPanel3, BorderLayout.NORTH);
                        jPanel3.setPreferredSize(new java.awt.Dimension(915, 27));
                        {
                            jLabel1 = new JLabel();
                            jPanel3.add(jLabel1, new CellConstraints("2, 1, 1, 1, default, default"));
                            jLabel1.setText(MyLanguage.getString("Linear_address"));
                            jLabel1.setBounds(691, 12, 143, 14);
                        }
                        {
                            jLinearAddressTextField = new JTextField();
                            jPanel3.add(jLinearAddressTextField,
                                    new CellConstraints("3, 1, 1, 1, default, default"));
                            jPanel3.add(getJHideIfAddressIsZeroCheckBox(),
                                    new CellConstraints("4, 1, 1, 1, default, default"));
                        }
                    }
                    {
                        jSplitPane2 = new JSplitPane();
                        jPanel2.add(jSplitPane2, BorderLayout.CENTER);
                        jSplitPane2.setDividerLocation(400);
                        {
                            jScrollPane4 = new JScrollPane();
                            jSplitPane2.add(jScrollPane4, JSplitPane.LEFT);
                            jScrollPane4.setPreferredSize(new java.awt.Dimension(399, 573));
                            {
                                PageDirectoryTableModel jPageDirectoryTableModel = new PageDirectoryTableModel();
                                jPageDirectoryTable = new JTable();
                                jScrollPane4.setViewportView(jPageDirectoryTable);
                                jPageDirectoryTable.setModel(jPageDirectoryTableModel);
                                jPageDirectoryTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                                jPageDirectoryTable.addMouseListener(new MouseAdapter() {
                                    public void mouseClicked(MouseEvent evt) {
                                        jPageDirectoryTableMouseClicked(evt);
                                    }
                                });
                            }
                        }
                        {
                            jScrollPane5 = new JScrollPane();
                            jSplitPane2.add(jScrollPane5, JSplitPane.RIGHT);
                            jScrollPane5.setPreferredSize(new java.awt.Dimension(507, 573));
                            {
                                PageTableTableModel jPageTableTableModel = new PageTableTableModel();
                                jPageTableTable = new JTable();
                                jScrollPane5.setViewportView(jPageTableTable);
                                jPageTableTable.setModel(jPageTableTableModel);
                                jPageTableTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                            }
                        }
                    }
                }
                {
                    jAddressTranslatePanel = new JPanel();
                    jTabbedPane1.addTab("Address  translate", null, jAddressTranslatePanel, null);
                    BorderLayout jAddressTranslatePanelLayout = new BorderLayout();
                    jAddressTranslatePanel.setLayout(jAddressTranslatePanelLayout);
                    {
                        jPanel20 = new JPanel();
                        TableLayout jPanel20Layout = new TableLayout(new double[][] { { 8.0, 156.0, 13.0 },
                                { 25.0, 25.0, 25.0, 22.0, 37.0, TableLayout.FILL } });
                        jPanel20Layout.setHGap(5);
                        jPanel20Layout.setVGap(5);
                        jAddressTranslatePanel.add(jPanel20, BorderLayout.WEST);
                        jPanel20.setPreferredSize(new java.awt.Dimension(189, 629));
                        jPanel20.setLayout(jPanel20Layout);
                        {
                            jSearchAddressRadioButton1 = new JRadioButton();
                            jSearchAddressRadioButton1.setText(MyLanguage.getString("Virtual_address"));
                            jPanel20.add(jSearchAddressRadioButton1, "1, 0, 2, 0");
                            jSearchAddressRadioButton1.setSelected(true);
                            getButtonGroup1().add(jSearchAddressRadioButton1);
                        }
                        {
                            jSearchAddressRadioButton2 = new JRadioButton();
                            jSearchAddressRadioButton2.setText(MyLanguage.getString("Linear_address"));
                            jPanel20.add(jSearchAddressRadioButton2, "1, 1, 2, 1");
                            getButtonGroup1().add(jSearchAddressRadioButton2);
                        }
                        {
                            jSearchAddressRadioButton3 = new JRadioButton();
                            jPanel20.add(jSearchAddressRadioButton3, "1, 2, 2, 2");
                            jSearchAddressRadioButton3.setVisible(false);
                        }
                        {
                            jPanel21 = new JPanel();
                            jPanel20.add(jPanel21, "1, 4");
                            {
                                jRefreshAddressTranslateButton = new JButton();
                                jRefreshAddressTranslateButton.setText(MyLanguage.getString("Convert"));
                                jPanel21.add(jRefreshAddressTranslateButton);
                                jRefreshAddressTranslateButton.addActionListener(new ActionListener() {
                                    public void actionPerformed(ActionEvent evt) {
                                        jRefreshAddressTranslateButtonActionPerformed(evt);
                                    }
                                });
                            }
                        }
                        {
                            jAddressTextField = new JTextField();
                            jPanel20.add(jAddressTextField, "1, 3");
                            jAddressTextField.addKeyListener(new KeyAdapter() {
                                public void keyTyped(KeyEvent evt) {
                                    jAddressTextFieldKeyTyped(evt);
                                }
                            });
                        }
                    }
                    {
                        jPanel22 = new JPanel();
                        BorderLayout jPanel22Layout = new BorderLayout();
                        jAddressTranslatePanel.add(jPanel22, BorderLayout.CENTER);
                        jPanel22.setLayout(jPanel22Layout);
                        {
                            jScrollPane13 = new JScrollPane();
                            jPanel22.add(jScrollPane13, BorderLayout.CENTER);
                            jScrollPane13.setPreferredSize(new java.awt.Dimension(150, 32));
                            {
                                AddressTranslateTableModel addressTranslateTableModel = new AddressTranslateTableModel();
                                jAddressTranslateTable2 = new JTable();
                                jScrollPane13.setViewportView(jAddressTranslateTable2);
                                jAddressTranslateTable2.setModel(addressTranslateTableModel);
                                jAddressTranslateTable2.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                            }
                        }
                    }
                    {
                        jToolBar3 = new JToolBar();
                        jAddressTranslatePanel.add(jToolBar3, BorderLayout.NORTH);
                        {
                            jButton17 = new JButton();
                            jToolBar3.add(jButton17);
                            jButton17.setIcon(new ImageIcon(getClass().getClassLoader()
                                    .getResource("com/peterbochs/icons/famfam_icons/disk.png")));
                            jButton17.addActionListener(new ActionListener() {
                                public void actionPerformed(ActionEvent evt) {
                                    jButton17ActionPerformed(evt);
                                }
                            });
                        }
                        {
                            jButton18 = new JButton();
                            jToolBar3.add(jButton18);
                            jButton18.setIcon(new ImageIcon(getClass().getClassLoader()
                                    .getResource("com/peterbochs/icons/famfam_icons/excel.gif")));
                            jButton18.addActionListener(new ActionListener() {
                                public void actionPerformed(ActionEvent evt) {
                                    jButton18ActionPerformed(evt);
                                }
                            });
                        }
                        {
                            jRefreshAddressTranslateTableButton = new JButton();
                            jToolBar3.add(jRefreshAddressTranslateTableButton);
                            jRefreshAddressTranslateTableButton.setText("Refresh");
                            jRefreshAddressTranslateTableButton.setIcon(new ImageIcon(getClass().getClassLoader()
                                    .getResource("com/peterbochs/icons/famfam_icons/arrow_refresh.png")));
                            jRefreshAddressTranslateTableButton.addActionListener(new ActionListener() {
                                public void actionPerformed(ActionEvent evt) {
                                    jRefreshAddressTranslateTableButtonActionPerformed(evt);
                                }
                            });
                        }
                        {
                            jButton19 = new JButton();
                            jToolBar3.add(jButton19);
                            jButton19.setText("Delete");
                            jButton19.setIcon(new ImageIcon(getClass().getClassLoader()
                                    .getResource("com/peterbochs/icons/famfam_icons/cross.png")));
                            jButton19.addActionListener(new ActionListener() {
                                public void actionPerformed(ActionEvent evt) {
                                    jButton19ActionPerformed(evt);
                                }
                            });
                        }
                    }
                }
            }

            String result;
            if (PeterBochsDebugger.commandReceiver != null) {
                if (type == 0) {
                    PeterBochsDebugger.sendCommand("info gdt " + gdtNo);
                    String gdtNoHex = String.format("0x%02x", gdtNo);
                    result = PeterBochsDebugger.commandReceiver.getCommandResult("GDT[" + gdtNoHex + "]");
                } else if (type == 1) {
                    PeterBochsDebugger.sendCommand("info ldt " + gdtNo);
                    String gdtNoHex = String.format("0x%02x", gdtNo);
                    result = PeterBochsDebugger.commandReceiver.getCommandResult("LDT[" + gdtNoHex + "]");
                } else if (type == 2) {
                    PeterBochsDebugger.sendCommand("info idt " + gdtNo);
                    String gdtNoHex = String.format("0x%02x", gdtNo);
                    result = PeterBochsDebugger.commandReceiver.getCommandResult("IDT[" + gdtNoHex + "]");
                    System.out.println(result);
                }

                PeterBochsDebugger.commandReceiver.clearBuffer();
                PeterBochsDebugger.sendCommand(
                        "x /8bx " + String.format("0x%08x", gdtAddress.add(BigInteger.valueOf(gdtNo * 8))));
                result = PeterBochsDebugger.commandReceiver
                        .getCommandResult(String.format("%08x", gdtAddress.add(BigInteger.valueOf(gdtNo * 8))));
                String lines[] = result.split("\n");

                String byteStr[] = lines[0].replaceFirst("^.*>:\t", "").split("\t");
                for (int x = 0; x < 8; x++) {
                    b[x] = (byte) Long.parseLong(byteStr[x].substring(2), 16);
                }

                value = CommonLib.getLong(b, 0);

                for (int x = 0; x < 64; x++) {
                    bit[x] = CommonLib.getBit(value, x);
                }

                for (int x = 0; x < 32; x++) {
                    jTable1.setValueAt(value >> x & 1, 1, 31 - x);
                }

                for (int x = 32; x < 64; x++) {
                    jTable1.setValueAt(value >> x & 1, 0, 63 - x);
                    jTable1.setPreferredSize(new java.awt.Dimension(669, 32));
                }

                // parse descriptor
                if (bit[44] == 1 && bit[43] == 1) {
                    jTypeLabel.setText("Type : Code descriptor, value=0x" + Long.toHexString(value));
                    parseCodeDescriptor();
                } else if (bit[44] == 1 && bit[43] == 0) {
                    jTypeLabel.setText("Type : Data descriptor, value=0x" + Long.toHexString(value));
                    parseDataDescriptor();
                } else if (bit[44] == 0 && bit[43] == 0 && bit[42] == 0 && bit[41] == 1 && bit[40] == 0) {
                    jTypeLabel.setText("Type : LDT descriptor, value=0x" + Long.toHexString(value) + ", base=0x"
                            + Long.toHexString(CommonLib.getInt(b[2], b[3], b[4], b[7])) + ", limit=0x"
                            + Long.toHexString(CommonLib.getShort(b[0], b[1])));
                    parseLDT();
                } else if (bit[44] == 0 && bit[42] == 0 && bit[40] == 1) {
                    jTypeLabel.setText("Type : TSS descriptor, value=0x" + Long.toHexString(value));
                    parseTSSDescriptor();
                }
                // end parse descriptor
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void parseCodeDescriptor() {
        try {
            DefaultTableModel model = (DefaultTableModel) jTable2.getModel();
            long base = CommonLib.getLong(b[2], b[3], b[4], b[7], 0, 0, 0, 0);
            model.addRow(new String[] { "base", "0x" + Long.toHexString(base) });

            long limit = CommonLib.getLong(b[0], b[1], b[6] & 0xf, 0, 0, 0, 0, 0);
            if (bit[55] == 1) {
                limit *= 4096;
            }
            model.addRow(new String[] { "limit", "0x" + Long.toHexString(limit) });

            model.addRow(new String[] { "G", String.valueOf(bit[55]) });
            model.addRow(new String[] { "D", String.valueOf(bit[54]) });
            model.addRow(new String[] { "AVL", String.valueOf(bit[52]) });
            model.addRow(new String[] { "P", String.valueOf(bit[47]) });
            model.addRow(new String[] { "DPL", String.valueOf(bit[45] + bit[46] << 1) });
            model.addRow(new String[] { "S", String.valueOf(bit[44]) });
            model.addRow(new String[] { "X", String.valueOf(bit[43]) });
            model.addRow(new String[] { "C", String.valueOf(bit[42]) });
            model.addRow(new String[] { "R", String.valueOf(bit[41]) });
            model.addRow(new String[] { "A", String.valueOf(bit[40]) });
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    private void parseDataDescriptor() {
        try {
            DefaultTableModel model = (DefaultTableModel) jTable2.getModel();
            long base = CommonLib.getLong(b[2], b[3], b[4], b[7], 0, 0, 0, 0);
            model.addRow(new String[] { "base", "0x" + Long.toHexString(base) });

            long limit = CommonLib.getLong(b[0], b[1], b[6] & 0xf, 0, 0, 0, 0, 0);
            if (bit[55] == 1) {
                limit *= 4096;
            }
            model.addRow(new String[] { "limit", "0x" + Long.toHexString(limit) });

            model.addRow(new String[] { "G", String.valueOf(bit[55]) });
            model.addRow(new String[] { "B", String.valueOf(bit[54]) });
            model.addRow(new String[] { "AVL", String.valueOf(bit[52]) });
            model.addRow(new String[] { "P", String.valueOf(bit[47]) });
            model.addRow(new String[] { "DPL", String.valueOf(bit[45] + bit[46] << 1) });
            model.addRow(new String[] { "S", String.valueOf(bit[44]) });
            model.addRow(new String[] { "X", String.valueOf(bit[43]) });
            model.addRow(new String[] { "E", String.valueOf(bit[42]) });
            model.addRow(new String[] { "W", String.valueOf(bit[41]) });
            model.addRow(new String[] { "A", String.valueOf(bit[40]) });
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    private void parseLDT() {
        try {
            jTable2.getColumnModel().getColumn(0).setHeaderValue("No");
            jTable2.getColumnModel().getColumn(1).setHeaderValue("Type");
            DefaultTableModel model = (DefaultTableModel) jTable2.getModel();
            jTable2.getColumnModel().getColumn(0).setMaxWidth(40);
            jTable2.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
            jTable2.setPreferredSize(new Dimension(600, 600));
            // PeterBochsDebugger.commandReceiver.setCommandNoOfLine(20);
            PeterBochsDebugger.sendCommand("info ldt 0 20");
            String result = PeterBochsDebugger.commandReceiver.getCommandResult("XX", "XX", null);
            String lines[] = result.split("\n");
            for (int x = 1; x < lines.length; x++) {
                try {
                    model.addRow(new String[] { lines[x].replaceFirst("^.*\\[", "").replaceFirst("].*$", ""),
                            lines[x].replaceFirst("^.*]=", "") });
                } catch (Exception ex) {
                }
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    private void parseTSSDescriptor() {
        try {
            DefaultTableModel model = (DefaultTableModel) jTable2.getModel();
            long base = CommonLib.getLong(b[2], b[3], b[4], b[7], 0, 0, 0, 0);
            model.addRow(new String[] { "base", "0x" + Long.toHexString(base) });

            long limit = CommonLib.getLong(b[0], b[1], b[6] & 0xf, 0, 0, 0, 0, 0);
            if (bit[55] == 1) {
                limit *= 4096;
            }
            limit += 1; //Real TSS limit = TSS limit in descriptor + 1
            model.addRow(new String[] { "limit", "0x" + Long.toHexString(limit) });

            model.addRow(new String[] { "G", String.valueOf(bit[55]) });
            model.addRow(new String[] { "AVL", String.valueOf(bit[52]) });
            model.addRow(new String[] { "P", String.valueOf(bit[47]) });
            model.addRow(new String[] { "DPL", String.valueOf(bit[45] + bit[46] << 1) });
            model.addRow(new String[] { "S", String.valueOf(bit[44]) });
            model.addRow(new String[] { "D", String.valueOf(bit[43]) });
            model.addRow(new String[] { "G", String.valueOf(bit[42]) });
            model.addRow(new String[] { "B", String.valueOf(bit[41]) });
            model.addRow(new String[] { "V", String.valueOf(bit[40]) });

            // TSS
            // PeterBochsDebugger.commandReceiver.setCommandNoOfLine(2);
            PeterBochsDebugger.commandReceiver.clearBuffer();
            PeterBochsDebugger.sendCommand("x /" + limit + "bx " + base);

            float totalByte2 = limit - 1;
            totalByte2 = totalByte2 / 8;
            int totalByte3 = (int) Math.floor(totalByte2);
            String realEndAddressStr;
            String realStartAddressStr;
            long realStartAddress = base;
            realStartAddressStr = String.format("%08x", realStartAddress);
            long realEndAddress = realStartAddress + totalByte3 * 8;
            realEndAddressStr = String.format("%08x", realEndAddress);

            String result2 = PeterBochsDebugger.commandReceiver.getCommandResult(realStartAddressStr,
                    realEndAddressStr, null);
            String[] lines2 = result2.split("\n");

            int tssByte[] = new int[(int) limit];
            for (int y = 0; y < lines2.length; y++) {
                String byteStr[] = lines2[y].replaceFirst("^.*>:\t", "").split("\t");
                for (int x = 0; x < 8 && x < byteStr.length; x++) {
                    tssByte[x + (y * 8)] = (byte) Long.parseLong(byteStr[x].substring(2), 16);
                }
            }

            //long tssValue = CommonLib.getLong(b, 0);

            DefaultTableModel tssModel = (DefaultTableModel) jTSSTable.getModel();
            tssModel.addRow(new String[] { "0", "link",
                    "0x" + CommonLib.getBigInteger(tssByte[0], tssByte[1], 0, 0, 0, 0, 0, 0).toString(16) });
            tssModel.addRow(new String[] { "4", "esp0", "0x" + CommonLib
                    .getBigInteger(tssByte[4], tssByte[5], tssByte[6], tssByte[7], 0, 0, 0, 0).toString(16) });
            tssModel.addRow(new String[] { "8", "ss0",
                    "0x" + CommonLib.getBigInteger(tssByte[8], tssByte[9], 0, 0, 0, 0, 0, 0).toString(16) });
            tssModel.addRow(new String[] { "0xc", "esp1",
                    "0x" + CommonLib
                            .getBigInteger(tssByte[0xc], tssByte[0xd], tssByte[0xe], tssByte[0xf], 0, 0, 0, 0)
                            .toString(16) });
            tssModel.addRow(new String[] { "0x10", "ss1",
                    "0x" + CommonLib.getBigInteger(tssByte[0x10], tssByte[0x11], 0, 0, 0, 0, 0, 0).toString(16) });
            tssModel.addRow(new String[] { "0x14", "esp2",
                    "0x" + CommonLib
                            .getBigInteger(tssByte[0x14], tssByte[0x15], tssByte[0x16], tssByte[0x17], 0, 0, 0, 0)
                            .toString(16) });
            tssModel.addRow(new String[] { "0x18", "ss2",
                    "0x" + CommonLib.getBigInteger(tssByte[0x18], tssByte[0x19], 0, 0, 0, 0, 0, 0).toString(16) });
            cr3 = CommonLib.getBigInteger(tssByte[0x1c], tssByte[0x1d], tssByte[0x1e], tssByte[0x1f], 0, 0, 0, 0);
            tssModel.addRow(new String[] { "0x1c", "cr3", "0x" + cr3.toString(16), "dump" });
            tssModel.addRow(new String[] { "0x20", "eip",
                    "0x" + CommonLib
                            .getBigInteger(tssByte[0x20], tssByte[0x21], tssByte[0x22], tssByte[0x23], 0, 0, 0, 0)
                            .toString(16) });
            tssModel.addRow(new String[] { "0x24", "eflags",
                    "0x" + CommonLib
                            .getBigInteger(tssByte[0x24], tssByte[0x25], tssByte[0x26], tssByte[0x27], 0, 0, 0, 0)
                            .toString(16) });
            tssModel.addRow(new String[] { "0x28", "eax",
                    "0x" + CommonLib
                            .getBigInteger(tssByte[0x28], tssByte[0x29], tssByte[0x2a], tssByte[0x2b], 0, 0, 0, 0)
                            .toString(16) });
            tssModel.addRow(new String[] { "0x2c", "ecx",
                    "0x" + CommonLib
                            .getBigInteger(tssByte[0x2c], tssByte[0x2d], tssByte[0x2e], tssByte[0x2f], 0, 0, 0, 0)
                            .toString(16) });
            tssModel.addRow(new String[] { "0x30", "edx",
                    "0x" + CommonLib
                            .getBigInteger(tssByte[0x30], tssByte[0x31], tssByte[0x32], tssByte[0x33], 0, 0, 0, 0)
                            .toString(16) });
            tssModel.addRow(new String[] { "0x34", "ebx",
                    "0x" + CommonLib
                            .getBigInteger(tssByte[0x34], tssByte[0x35], tssByte[0x36], tssByte[0x37], 0, 0, 0, 0)
                            .toString(16) });
            tssModel.addRow(new String[] { "0x38", "esp",
                    "0x" + CommonLib
                            .getBigInteger(tssByte[0x38], tssByte[0x39], tssByte[0x3a], tssByte[0x3b], 0, 0, 0, 0)
                            .toString(16) });
            tssModel.addRow(new String[] { "0x3c", "ebp",
                    "0x" + CommonLib
                            .getBigInteger(tssByte[0x3c], tssByte[0x3d], tssByte[0x3e], tssByte[0x3f], 0, 0, 0, 0)
                            .toString(16) });
            tssModel.addRow(new String[] { "0x40", "esi",
                    "0x" + CommonLib
                            .getBigInteger(tssByte[0x40], tssByte[0x41], tssByte[0x42], tssByte[0x43], 0, 0, 0, 0)
                            .toString(16) });
            tssModel.addRow(new String[] { "0x44", "edi",
                    "0x" + CommonLib
                            .getBigInteger(tssByte[0x44], tssByte[0x45], tssByte[0x45], tssByte[0x47], 0, 0, 0, 0)
                            .toString(16) });

            tssModel.addRow(new String[] { "0x48", "es",
                    "0x" + CommonLib.getBigInteger(tssByte[0x48], tssByte[0x49], 0, 0, 0, 0, 0, 0).toString(16) });
            tssModel.addRow(new String[] { "0x4c", "cs",
                    "0x" + CommonLib.getBigInteger(tssByte[0x4c], tssByte[0x4d], 0, 0, 0, 0, 0, 0).toString(16) });
            tssModel.addRow(new String[] { "0x50", "ss",
                    "0x" + CommonLib.getBigInteger(tssByte[0x50], tssByte[0x51], 0, 0, 0, 0, 0, 0).toString(16) });
            tssModel.addRow(new String[] { "0x54", "ds",
                    "0x" + CommonLib.getBigInteger(tssByte[0x54], tssByte[0x55], 0, 0, 0, 0, 0, 0).toString(16) });
            tssModel.addRow(new String[] { "0x58", "fs",
                    "0x" + CommonLib.getBigInteger(tssByte[0x58], tssByte[0x59], 0, 0, 0, 0, 0, 0).toString(16) });
            tssModel.addRow(new String[] { "0x5c", "gs",
                    "0x" + CommonLib.getBigInteger(tssByte[0x5c], tssByte[0x5d], 0, 0, 0, 0, 0, 0).toString(16) });
            tssModel.addRow(new String[] { "0x60", "ldtr",
                    "0x" + CommonLib.getBigInteger(tssByte[0x60], tssByte[0x61], 0, 0, 0, 0, 0, 0).toString(16) });
            ldtr = CommonLib.getBigInteger(tssByte[0x60], tssByte[0x61], 0, 0, 0, 0, 0, 0);
            tssModel.addRow(
                    new String[] { "0x64", "T", "0x" + Long.toHexString(CommonLib.getBit(tssByte[0x64], 0)) });
            tssModel.addRow(new String[] { "0x66", "iobp offset",
                    "0x" + CommonLib.getBigInteger(tssByte[0x66], tssByte[0x67], 0, 0, 0, 0, 0, 0).toString(16) });

            updatePageTable(cr3);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public void updatePageTable(BigInteger pageDirectoryBaseAddress) {
        this.jLinearAddressTextField.setText("0x" + pageDirectoryBaseAddress.toString(16));
        Vector<IA32PageDirectory> ia32_pageDirectories = new Vector<IA32PageDirectory>();
        try {
            // commandReceiver.setCommandNoOfLine(512);
            PeterBochsDebugger.sendCommand("xp /4096bx " + pageDirectoryBaseAddress);
            float totalByte2 = 4096 - 1;
            totalByte2 = totalByte2 / 8;
            int totalByte3 = (int) Math.floor(totalByte2);
            String realEndAddressStr;
            String realStartAddressStr;
            BigInteger realStartAddress = pageDirectoryBaseAddress;
            realStartAddressStr = String.format("%08x", realStartAddress);
            BigInteger realEndAddress = realStartAddress.add(BigInteger.valueOf(totalByte3 * 8));
            realEndAddressStr = String.format("%08x", realEndAddress);
            String result = PeterBochsDebugger.commandReceiver.getCommandResult(realStartAddressStr,
                    realEndAddressStr, null);
            if (result != null) {
                String[] lines = result.split("\n");
                DefaultTableModel model = (DefaultTableModel) jPageDirectoryTable.getModel();
                while (model.getRowCount() > 0) {
                    model.removeRow(0);
                }
                // jStatusProgressBar.setMaximum(lines.length - 1);

                for (int y = 0; y < lines.length; y++) {
                    // jStatusProgressBar.setValue(y);
                    String[] b = lines[y].replaceFirst("^.*:", "").trim().split("\t");

                    for (int z = 0; z < 2; z++) {
                        try {
                            int bytes[] = new int[4];
                            for (int x = 0; x < 4; x++) {
                                bytes[x] = CommonLib.string2BigInteger(b[x + z * 4].substring(2).trim()).intValue();
                            }
                            long value = CommonLib.getInt(bytes, 0);
                            // "No.", "PT base", "AVL", "G",
                            // "D", "A", "PCD", "PWT",
                            // "U/S", "W/R", "P"

                            long baseL = value & 0xfffff000;
                            // if (baseL != 0) {
                            String base = "0x" + Long.toHexString(baseL);
                            String avl = String.valueOf((value >> 9) & 3);
                            String g = String.valueOf((value >> 8) & 1);
                            String d = String.valueOf((value >> 6) & 1);
                            String a = String.valueOf((value >> 5) & 1);
                            String pcd = String.valueOf((value >> 4) & 1);
                            String pwt = String.valueOf((value >> 3) & 1);
                            String us = String.valueOf((value >> 2) & 1);
                            String wr = String.valueOf((value >> 1) & 1);
                            String p = String.valueOf((value >> 0) & 1);

                            ia32_pageDirectories
                                    .add(new IA32PageDirectory(base, avl, g, d, a, pcd, pwt, us, wr, p));

                            model.addRow(new String[] { String.valueOf(y * 2 + z), base, avl, g, d, a, pcd, pwt, us,
                                    wr, p });
                            // }
                        } catch (Exception ex) {
                        }
                    }
                    // jStatusLabel.setText("Updating page table " + (y + 1) +
                    // "/" + lines.length);
                }
                jPageDirectoryTable.setModel(model);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    private void jDumpPageDirectoryButtonActionPerformed(ActionEvent evt) {
        System.out.println("jDumpPageDirectoryButton.actionPerformed, event=" + evt);
    }

    private void jPageDirectoryTableMouseClicked(MouseEvent evt) {
        if (evt.getClickCount() == 2) {
            // jStatusProgressBar.setValue(0);
            String pageTableAddress = jPageDirectoryTable.getValueAt(jPageDirectoryTable.getSelectedRow(), 1)
                    .toString();

            // commandReceiver.setCommandNoOfLine(512);
            PeterBochsDebugger.sendCommand("xp /4096bx " + pageTableAddress);

            float totalByte2 = 4096 - 1;
            totalByte2 = totalByte2 / 8;
            int totalByte3 = (int) Math.floor(totalByte2);
            String realEndAddressStr;
            String realStartAddressStr;
            String baseAddress = pageTableAddress;
            BigInteger realStartAddress = CommonLib.string2BigInteger(baseAddress);

            realStartAddressStr = String.format("%08x", realStartAddress);
            BigInteger realEndAddress = realStartAddress.add(BigInteger.valueOf(totalByte3 * 8));
            realEndAddressStr = String.format("%08x", realEndAddress);

            String result = PeterBochsDebugger.commandReceiver.getCommandResult(realStartAddressStr,
                    realEndAddressStr, null);
            String[] lines = result.split("\n");
            DefaultTableModel model = (DefaultTableModel) jPageTableTable.getModel();
            while (model.getRowCount() > 0) {
                model.removeRow(0);
            }
            for (int y = 0; y < lines.length; y++) {
                // jStatusProgressBar.setValue(y * 100 / lines.length);
                String[] b = lines[y].replaceFirst("^.*:", "").trim().split("\t");

                for (int z = 0; z < 2; z++) {
                    try {
                        int bytes[] = new int[4];
                        for (int x = 0; x < 4; x++) {
                            bytes[x] = CommonLib.string2BigInteger(b[x + z * 4].substring(2).trim()).intValue();
                        }
                        long value = CommonLib.getInt(bytes, 0);
                        // "No.", "PT base", "AVL", "G",
                        // "D", "A", "PCD", "PWT",
                        // "U/S", "W/R", "P"

                        String base = "0x" + Long.toHexString(CommonLib.getValue(value, 12, 31) << 12);
                        String avl = String.valueOf((value >> 9) & 3);
                        String g = String.valueOf((value >> 8) & 1);
                        String pat = String.valueOf((value >> 7) & 1);
                        String d = String.valueOf((value >> 6) & 1);
                        String a = String.valueOf((value >> 5) & 1);
                        String pcd = String.valueOf((value >> 4) & 1);
                        String pwt = String.valueOf((value >> 3) & 1);
                        String us = String.valueOf((value >> 2) & 1);
                        String wr = String.valueOf((value >> 1) & 1);
                        String p = String.valueOf((value >> 0) & 1);

                        model.addRow(new String[] { String.valueOf(y * 2 + z), base, avl, g, pat, d, a, pcd, pwt,
                                us, wr, p });
                    } catch (Exception ex) {
                    }
                }

                jPageTableTable.setModel(model);
            }
        }
    }

    class ButtonRenderer extends JButton implements TableCellRenderer {
        public ButtonRenderer() {
            setOpaque(true);
        }

        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
                boolean hasFocus, int row, int column) {
            if (table.getValueAt(row, 3) == null || table.getValueAt(row, 3).equals("")) {
                return null;
            }
            if (isSelected) {
                setForeground(table.getSelectionForeground());
                setBackground(UIManager.getColor("Button.background"));
            } else {
                setForeground(table.getForeground());
                setBackground(UIManager.getColor("Button.background"));
            }

            setText((value == null) ? "" : value.toString());
            return this;
        }
    }

    class ButtonEditor extends DefaultCellEditor {
        protected JButton button;
        private boolean isPushed;
        BigInteger cr3;

        public ButtonEditor(JCheckBox checkBox) {
            super(checkBox);
            button = new JButton();
            button.setOpaque(true);
            button.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    fireEditingStopped();
                }
            });
        }

        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row,
                int column) {
            if (table.getValueAt(row, 3) == null || table.getValueAt(row, 3).equals("")) {
                return null;
            }
            if (isSelected) {
                button.setForeground(table.getSelectionForeground());
                button.setBackground(table.getSelectionBackground());
            } else {
                button.setForeground(table.getForeground());
                button.setBackground(table.getBackground());
            }

            cr3 = CommonLib.string2BigInteger(table.getValueAt(row, 2).toString());

            button.setText((value == null) ? "" : value.toString());
            isPushed = true;
            return button;
        }

        public Object getCellEditorValue() {
            if (isPushed) {
                peterBochsDebugger.jDumpPageDirectoryAddressTextField.setText("0x" + cr3.toString(16));
                peterBochsDebugger.updatePageTable(cr3);
                peterBochsDebugger.jTabbedPane2.setSelectedIndex(2);
            }
            isPushed = false;
            return button.getText();
        }

        public boolean stopCellEditing() {
            isPushed = false;
            return super.stopCellEditing();
        }

        protected void fireEditingStopped() {
            super.fireEditingStopped();
        }
    }

    private void jRefreshAddressTranslateButtonActionPerformed(ActionEvent evt) {
        AddressTranslateTableModel model = (AddressTranslateTableModel) this.jAddressTranslateTable2.getModel();

        if (jSearchAddressRadioButton1.isSelected()) {
            if (!this.jAddressTextField.getText().contains(":")
                    || this.jAddressTextField.getText().replaceAll("[^:]", "").length() != 1) {
                JOptionPane.showMessageDialog(this,
                        "Error, please input <segment selector>:<offset>\n\ne.g. : 0x10:0x12345678", "Error",
                        JOptionPane.ERROR_MESSAGE);
                return;
            }
            BigInteger segSelector = CommonLib.string2BigInteger(this.jAddressTextField.getText().split(":")[0]);
            BigInteger address = CommonLib.string2BigInteger(this.jAddressTextField.getText().split(":")[1]);

            // for (int x = 0; x < model.getRowCount(); x++) {
            // if (model.searchType.get(x).equals(1) &&
            // model.searchSegSelector.get(x).equals(segSelector) &&
            // model.searchAddress.get(x).equals(address)) {
            // return;
            // }
            // }

            model.searchType.add(1);
            model.searchSegSelector.add(segSelector);
            model.searchAddress.add(address);

            model.virtualAddress.add(address);
            BigInteger segNo = segSelector.shiftRight(3);
            model.segNo.add(segNo);

            // read GDT descriptor
            int descriptor[] = PeterBochsCommonLib
                    .getMemoryFromBochs(ldtr.add(segNo.multiply(BigInteger.valueOf(8))), 8);
            BigInteger baseAddress = CommonLib.getBigInteger(descriptor[2], descriptor[3], descriptor[4],
                    descriptor[7], 0, 0, 0, 0);
            BigInteger linearAddress = baseAddress.add(address);
            model.baseAddress.add(baseAddress);
            model.linearAddress.add(linearAddress);

            BigInteger pdNo = CommonLib.getBigInteger(linearAddress, 31, 22);
            model.pdNo.add(pdNo);
            int pdeBytes[] = PeterBochsCommonLib.getMemoryFromBochs(cr3.add(pdNo.multiply(BigInteger.valueOf(4))),
                    4);
            BigInteger pde = CommonLib.getBigInteger(pdeBytes, 0);
            model.pde.add(pde);

            BigInteger ptNo = CommonLib.getBigInteger(linearAddress, 21, 12);
            model.ptNo.add(ptNo);
            BigInteger pageTableBaseAddress = pde.and(BigInteger.valueOf(0xfffff000));
            int pteBytes[] = PeterBochsCommonLib
                    .getMemoryFromBochs(pageTableBaseAddress.add(ptNo.multiply(BigInteger.valueOf(4))), 4);
            BigInteger pte = CommonLib.getBigInteger(pteBytes, 0);
            BigInteger pagePhysicalAddress = pte.and(BigInteger.valueOf(0xfffff000));
            model.pte.add(pte);

            BigInteger physicalAddress = pagePhysicalAddress.add(CommonLib.getBigInteger(linearAddress, 11, 0));
            model.physicalAddress.add(physicalAddress);
            int bytesAtPhysicalAddress[] = PeterBochsCommonLib.getMemoryFromBochs(physicalAddress, 8);
            model.bytes.add(PeterBochsCommonLib.convertToString(bytesAtPhysicalAddress));

            model.fireTableDataChanged();
        } else if (jSearchAddressRadioButton2.isSelected()) {
            // for (int x = 0; x < model.getRowCount(); x++) {
            // if (model.searchType.get(x).equals(2) &&
            // model.searchAddress.get(x).equals(CommonLib.string2BigInteger(this.jAddressTextField.getText())))
            // {
            // return;
            // }
            // }
            BigInteger address = CommonLib.string2BigInteger(this.jAddressTextField.getText());

            model.searchType.add(2);
            model.searchAddress.add(address);

            BigInteger baseAddress = BigInteger.valueOf(0);
            BigInteger linearAddress = baseAddress.add(address);
            model.baseAddress.add(baseAddress);
            model.linearAddress.add(linearAddress);

            BigInteger pdNo = CommonLib.getBigInteger(linearAddress, 31, 22);
            model.pdNo.add(pdNo);
            int pdeBytes[] = PeterBochsCommonLib.getMemoryFromBochs(cr3.add(pdNo.multiply(BigInteger.valueOf(4))),
                    4);
            BigInteger pde = CommonLib.getBigInteger(pdeBytes, 0);
            model.pde.add(pde);

            BigInteger ptNo = CommonLib.getBigInteger(linearAddress, 21, 12);
            model.ptNo.add(ptNo);
            BigInteger pageTableBaseAddress = pde.and(BigInteger.valueOf(0xfffff000));
            int pteBytes[] = PeterBochsCommonLib
                    .getMemoryFromBochs(pageTableBaseAddress.add(ptNo.multiply(BigInteger.valueOf(4))), 4);
            BigInteger pte = CommonLib.getBigInteger(pteBytes, 0);
            BigInteger pagePhysicalAddress = pte.and(BigInteger.valueOf(0xfffff000));
            model.pte.add(pte);

            BigInteger physicalAddress = pagePhysicalAddress.add(CommonLib.getBigInteger(linearAddress, 11, 0));
            model.physicalAddress.add(physicalAddress);
            int bytesAtPhysicalAddress[] = PeterBochsCommonLib.getMemoryFromBochs(physicalAddress, 8);
            model.bytes.add(PeterBochsCommonLib.convertToString(bytesAtPhysicalAddress));

            model.fireTableDataChanged();
        } else if (jSearchAddressRadioButton3.isSelected()) {
            for (int x = 0; x < model.getRowCount(); x++) {
                if (model.searchType.get(x).equals(3) && model.searchAddress.get(x)
                        .equals(CommonLib.string2BigInteger(this.jAddressTextField.getText()))) {
                    return;
                }
            }
            BigInteger addr = CommonLib.string2BigInteger(this.jAddressTextField.getText());
            model.searchType.add(3);
            model.searchSegSelector.add(BigInteger.valueOf(0));
            model.searchAddress.add(addr);

            model.virtualAddress.add(BigInteger.valueOf(0));
            model.segNo.add(BigInteger.valueOf(0));
            model.linearAddress.add(BigInteger.valueOf(0));
            model.pdNo.add(BigInteger.valueOf(0));
            model.ptNo.add(BigInteger.valueOf(0));
            model.physicalAddress.add(BigInteger.valueOf(0));
            model.bytes.add("");

            model.fireTableDataChanged();
        }
    }

    private void jAddressTextFieldKeyTyped(KeyEvent evt) {
        if (evt.getKeyChar() == '\n') {
            jRefreshAddressTranslateButtonActionPerformed(null);
        }
    }

    private void jButton17ActionPerformed(ActionEvent evt) {
        final JFileChooser fc = new JFileChooser();
        int returnVal = fc.showSaveDialog(this);
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            File file = fc.getSelectedFile();
            if (!PeterBochsCommonLib.saveImage(jAddressTranslateTable2, file)) {
                JOptionPane.showMessageDialog(this, "Cannot save image.", "Error", JOptionPane.ERROR_MESSAGE);
            }
        }
    }

    private void jButton18ActionPerformed(ActionEvent evt) {
        final JFileChooser fc = new JFileChooser();
        int returnVal = fc.showSaveDialog(this);
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            File file = fc.getSelectedFile();
            PeterBochsCommonLib.exportTableModelToExcel(file, this.jAddressTranslateTable2.getModel(),
                    String.valueOf(cr3));
        }
    }

    private void jRefreshAddressTranslateTableButtonActionPerformed(ActionEvent evt) {
        AddressTranslateTableModel model = (AddressTranslateTableModel) this.jAddressTranslateTable2.getModel();
        for (int x = 0; x < model.getRowCount(); x++) {
            if (model.searchType.get(x).equals(1)) {
                model.segNo.set(x, model.searchSegSelector.get(x).shiftRight(3));
                model.virtualAddress.set(x, model.searchAddress.get(x));

                BigInteger gdtBase = PeterBochsCommonLib.getPhysicalAddress(cr3, ldtr);
                System.out.println("gdtBase=" + gdtBase.toString(16));
                PeterBochsDebugger.commandReceiver.clearBuffer();
                gdtBase = gdtBase.add(model.segNo.get(x).multiply(BigInteger.valueOf(8)));
                PeterBochsDebugger.sendCommand("xp /8bx " + gdtBase);
                String result = PeterBochsDebugger.commandReceiver.getCommandResult(String.format("%08x", gdtBase));

                int bytes[] = new int[8];
                String[] b = result.replaceFirst("^.*:", "").split("\t");
                for (int y = 1; y <= 8; y++) {
                    bytes[y - 1] = CommonLib.string2BigInteger(b[y]).intValue();
                }

                Long gdtDescriptor = CommonLib.getLong(bytes, 0);
                System.out.println(Long.toHexString(gdtDescriptor));
                BigInteger base = CommonLib.getBigInteger(bytes[2], bytes[3], bytes[4], bytes[7], 0, 0, 0, 0);
                System.out.println(base.toString(16));

                model.linearAddress.set(x, base.add(model.searchAddress.get(x)));
            }
        }
        model.fireTableDataChanged();
    }

    private void jButton19ActionPerformed(ActionEvent evt) {
        int rows[] = jAddressTranslateTable2.getSelectedRows();
        AddressTranslateTableModel model = (AddressTranslateTableModel) this.jAddressTranslateTable2.getModel();
        model.removeRow(rows);
    }

    private ButtonGroup getButtonGroup1() {
        if (buttonGroup1 == null) {
            buttonGroup1 = new ButtonGroup();
        }
        return buttonGroup1;
    }

    private JCheckBox getJHideIfAddressIsZeroCheckBox() {
        if (jHideIfAddressIsZeroCheckBox == null) {
            jHideIfAddressIsZeroCheckBox = new JCheckBox();
            jHideIfAddressIsZeroCheckBox.setText("Hide if address = 0");
            jHideIfAddressIsZeroCheckBox.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    jHideIfAddressIsZeroCheckBoxActionPerformed(evt);
                }
            });
        }
        return jHideIfAddressIsZeroCheckBox;
    }

    private void jHideIfAddressIsZeroCheckBoxActionPerformed(ActionEvent evt) {
        ((PageDirectoryTableModel) jPageDirectoryTable.getModel())
                .setShowZeroAddress(!jHideIfAddressIsZeroCheckBox.isSelected());
        ((PageTableTableModel) jPageTableTable.getModel())
                .setShowZeroAddress(!jHideIfAddressIsZeroCheckBox.isSelected());
    }
}