예제 #1
0
        /// <summary>
        /// Byte arr to struct arr version 4 字节数组转换成结构体,用于通讯信息转换
        /// </summary>
        /// <param name="arr"></param>
        /// <param name="desArrNum"></param>
        /// <param name="desArr"></param>
        static internal void fromBytes(byte[] arr, int desArrNum, ref THREADINFO[] desArr)
        {
            THREADINFO[] _struct = new THREADINFO[desArrNum];
            int          size    = Marshal.SizeOf(typeof(THREADINFO)) * desArrNum;
            IntPtr       ptr     = Marshal.AllocHGlobal(size);

            for (int i = 0; i < desArrNum; i++)
            {
                Marshal.Copy(arr, i * Marshal.SizeOf(typeof(THREADINFO)), ptr, Marshal.SizeOf(typeof(THREADINFO)));
                _struct[i] = (THREADINFO)Marshal.PtrToStructure(ptr, _struct[i].GetType());
            }

            // 需要释放临时非托管区内存
            Marshal.FreeHGlobal(ptr);
            desArr = _struct;
        }
예제 #2
0
        /// <summary>
        /// 枚举线程
        /// </summary>
        static public void EnumThreads()
        {
            // 定义用于与驱动通信的变量
            byte[] IoReturnBuffer = new byte[Marshal.SizeOf(typeof(THREADINFO)) * ThreadNum];
            uint   BytesReturned  = new uint();

            System.Threading.NativeOverlapped lpOverlapped = new System.Threading.NativeOverlapped();
            // 获取当前选中的进程的pid
            uint pid;

            uint.TryParse(MainForm.main.ListView_Process.SelectedItems[0].SubItems[1].Text, out pid);

            // R0层获取进程的模块信息
            bool bRet = DriverManager.IoControl(DriverManager.hDrv, (uint)IOCTL_CODE.GetProcessThreads, pid, sizeof(uint), IoReturnBuffer,
                                                (uint)Marshal.SizeOf(typeof(THREADINFO)) * ThreadNum, ref BytesReturned, ref lpOverlapped);

            // 将驱动传过来的字节流转换成进程模块信息结构体
            THREADINFO[] _threadArr = new THREADINFO[ThreadNum];
            fromBytes(IoReturnBuffer, (int)ThreadNum, ref _threadArr);

            // 如果进程列表框占满tab容器
            MainForm.main.ListView_ProcessOther.Visible = true;
            if (MainForm.isProListViewDock)
            {
                MainForm.main.ListView_Process.Height = MainForm.main.ListView_Process.Height - MainForm.main.ListView_ProcessOther.Height;
                MainForm.isProListViewDock            = false;
            }

            // 枚举线程不需要用到图标
            MainForm.main.ListView_ProcessOther.SmallImageList = null;

            // 设置mProcOtherListView的表头
            MainForm.main.ListView_ProcessOther.Columns.Clear();
            MainForm.main.ListView_ProcessOther.Columns.Add("", 0, HorizontalAlignment.Left);
            MainForm.main.ListView_ProcessOther.Columns.Add("EThread", 50, HorizontalAlignment.Left);
            MainForm.main.ListView_ProcessOther.Columns.Add("Tid", 50, HorizontalAlignment.Left);
            MainForm.main.ListView_ProcessOther.Columns.Add("Priority", 50, HorizontalAlignment.Left);
            MainForm.main.ListView_ProcessOther.Columns.Add("Teb", 50, HorizontalAlignment.Left);
            MainForm.main.ListView_ProcessOther.Columns.Add("Entry", 50, HorizontalAlignment.Left);
            MainForm.main.ListView_ProcessOther.Columns.Add("Switch", 50, HorizontalAlignment.Left);
            MainForm.main.ListView_ProcessOther.Columns.Add("State", 50, HorizontalAlignment.Left);

            // 定位到指定的右键菜单
            MainForm.main.ListView_ProcessOther.ContextMenuStrip = MainForm.main.contextMenuStrip_procThreadList;

            // 将数据插入到mProcOtherListView中
            MainForm.main.ListView_ProcessOther.BeginUpdate();
            MainForm.main.ListView_ProcessOther.Items.Clear();

            foreach (THREADINFO arr in _threadArr)
            {
                if (!arr.EThread.Equals(0))
                {
                    ListViewItem lvi = new ListViewItem();

                    lvi.SubItems.Add("0x" + arr.EThread.ToString("X16"));
                    lvi.SubItems.Add(arr.Tid.ToString());
                    lvi.SubItems.Add(arr.Priority.ToString());
                    lvi.SubItems.Add("0x" + arr.Teb.ToString("X16"));
                    lvi.SubItems.Add("0x" + arr.Entry.ToString("X16"));
                    lvi.SubItems.Add(arr.Switch.ToString());
                    lvi.SubItems.Add(Encoding.ASCII.GetString(arr.State));

                    MainForm.main.ListView_ProcessOther.Items.Add(lvi);
                }
                else
                {
                    break;
                }
            }

            MainForm.main.ListView_ProcessOther.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
            MainForm.main.ListView_ProcessOther.EndUpdate();
        }