C# 获取句柄列表,AcessViolationException

2024-01-10

Info:

  • .Net 4.5

测试于:

  • Win7 64位

  • Win10 64位(虚拟盒)

我正在尝试获取外部进程的句柄列表并将它们的名称作为字符串返回,以便我可以在之后关闭特定的进程。因此我使用 Win32API 编写了这个函数,它将检查句柄是否是我想要关闭的句柄:`

        const int CNST_SYSTEM_HANDLE_INFORMATION = 16;
        const uint STATUS_INFO_LENGTH_MISMATCH = 0xc0000004;

        public static string getObjectTypeName(Win32API.SYSTEM_HANDLE_INFORMATION shHandle, Process process)
        {
            IntPtr m_ipProcessHwnd = Win32API.OpenProcess(Win32API.ProcessAccessFlags.All, false, process.Id);
            IntPtr ipHandle = IntPtr.Zero;
            var objBasic = new Win32API.OBJECT_BASIC_INFORMATION();
            IntPtr ipBasic = IntPtr.Zero;
            var objObjectType = new Win32API.OBJECT_TYPE_INFORMATION();
            IntPtr ipObjectType = IntPtr.Zero;
            IntPtr ipObjectName = IntPtr.Zero;
            string strObjectTypeName = "";
            int nLength = 0;
            int nReturn = 0;
            IntPtr ipTemp = IntPtr.Zero;


            if (!Win32API.DuplicateHandle(m_ipProcessHwnd, shHandle.Handle,
                                          Win32API.GetCurrentProcess(), out ipHandle,
                                          0, false, Win32API.DUPLICATE_SAME_ACCESS))
                return null;



            ipBasic = Marshal.AllocHGlobal(Marshal.SizeOf(objBasic));
            Win32API.NtQueryObject(ipHandle, (int)Win32API.ObjectInformationClass.ObjectBasicInformation,
                                   ipBasic, Marshal.SizeOf(objBasic), ref nLength);
            objBasic = (Win32API.OBJECT_BASIC_INFORMATION)Marshal.PtrToStructure(ipBasic, objBasic.GetType());
            Marshal.FreeHGlobal(ipBasic);

            ipObjectType = Marshal.AllocHGlobal(objBasic.TypeInformationLength);
            nLength = objBasic.TypeInformationLength;
            while ((uint)(nReturn = Win32API.NtQueryObject(
                ipHandle, (int)Win32API.ObjectInformationClass.ObjectTypeInformation, ipObjectType,
                  nLength, ref nLength)) ==
                Win32API.STATUS_INFO_LENGTH_MISMATCH)
            {
                Marshal.FreeHGlobal(ipObjectType);
                ipObjectType = Marshal.AllocHGlobal(nLength);
            }

            objObjectType = (Win32API.OBJECT_TYPE_INFORMATION)Marshal.PtrToStructure(ipObjectType, objObjectType.GetType());
            if (Is64Bits())
            {
                ipTemp = new IntPtr(Convert.ToInt64(objObjectType.Name.Buffer.ToString(), 10) >> 32);
            }
            else
            {
                ipTemp = objObjectType.Name.Buffer;
            }

        strObjectTypeName = Marshal.PtrToStringUni(ipTemp, objObjectType.Name.Length >> 1);


        Marshal.FreeHGlobal(ipObjectType);
            Win32API.CloseHandle(ipHandle);
            return strObjectTypeName;
        }`

但问题是,这段代码在 Win7 64 位中运行,而不是在 Win10 中运行! --> 在 Win 10 中strObjectTypeName = Marshal.PtrToStringUni();抛出一个AcessViolationException(代码最后几行)

System.AccessViolationException 尝试读取或写入受保护的内存。这通常表明其他内存已损坏。

我是否遗漏了有关如何在 win10 中访问非托管内存的信息?


我刚刚遇到同样的问题。我还没有尝试过 Win7,但是当您在 Win10(x64) 上以 32 位运行代码时(例如,设置应用程序的“首选 32 位标志”),它应该可以工作。 当异常发生时,将变量“ipTemp”拖放到Visual Studio的“内存窗口”中,如果它只显示问号或错误消息,则说明没有有效的指针。 据我所知,该 API 使用的 64 位版本的结构中有(更多)填充字节: OBJECT_TYPE_INFORMATION 包含 UNICODE_STRING,并且 UNICODE_STRING 在 64 位模式下的缓冲区字段之前有 4 个填充字节。 我的解决方法是这样的:

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct UNICODE_STRING
{
    private IntPtr _dummy; // the two ushorts seem to be padded with 4 bytes in 64bit mode only

    /// <summary>
    /// The length, in bytes, of the string stored in Buffer. If the string is null-terminated, Length does not include the trailing null character.
    /// </summary>
    public ushort Length
    {
        get { return (ushort)Marshal.ReadInt16(this, 0); }
    }

    /// <summary>
    /// The length, in bytes, of Buffer.
    /// </summary>
    public ushort MaximumLength
    {
        get { return (ushort)Marshal.ReadInt16(this, 2); }
    }

    public IntPtr Buffer;
}

在我的研究过程中,我发现了很多关于这个主题的问题,基本上有两种示例代码 我正在考虑创建一个名为 WinKernelObjectsDotNet 的开源库。

Update: 该库现已可用here https://github.com/donid/WinKernelObjectsDotNet。它支持使用一行代码查找锁定文件或串行端口 (COM) 的进程。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 获取句柄列表,AcessViolationException 的相关文章

随机推荐

  • jQuery - 使全局变量可用于多个插件

    我正在为网站创建一组 jQuery 插件 所有这些插件都有共同的功能 即调用 getJSON 这些调用中传递的 URL 根据开发 QA 和生产环境而有所不同 我想将 URL 存储在一个中心位置 以便可以轻松更改 URL 应该存储在哪里 我不
  • 根据 URL / 锚点更改 Facebook 元数据

    我在输入问题时发现对此进行了小型交流将 URL 哈希添加到 Facebook 和 Twitter 共享卡的元数据中 https stackoverflow com questions 16014439 adding a url hash i
  • 是否可以在 Mirror API 中注册顶级意图?

    例如 顶级操作 是 Google 拍照 等 是否可以使用 Mirror API 来注册自定义顶级事件 好吧 格拉斯 咬碎我吧 我的第二个问题是是否可以获取用户语音 使用 OK Glass Google 示例 用户说出 Google 接受并执
  • Postgresql中按窗口函数结果过滤

    好吧 最初这只是我们和朋友开的一个玩笑 但后来变成了有趣的技术问题 我有以下内容stuff table CREATE TABLE stuff id serial PRIMARY KEY volume integer NOT NULL DEF
  • 无法访问 kubernetes + rancher 中的 KubeAPI 端口

    我有以下配置来启动 rke 当我向上rke 我得到了错误 rancher cluster yml nodes address 192 168 88 246 internal address 172 17 0 1 user dockeruse
  • 如何在android应用程序中使用现有的.so文件[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找应该在 android 平台中将 doc docx 转换为 pdf 的库 我得到了 PdFTron android sdk 因为
  • 如何在 Java Flight Recorder 采样中包含 IO 绑定方法?

    我在启动时通过为测试中的 Java 程序指定以下 CLI 选项来启动 JFR Xmx24g XX UnlockCommercialFeatures XX FlightRecorder XX FlightRecorderOptions def
  • Asp.Net 何时删除过期的缓存项?

    当您添加一个项目到System Web Caching Cache具有绝对到期日期 如下面的示例所示 Asp Net 的行为如何 可以 只需将项目标记为过期 然后执行CacheItemRemovedCallback下次访问尝试时 从缓存中删
  • 如何根据用户请求安全地停止正在运行的线程?

    我所处的场景是 当线程根据 GUI 上的用户操作运行时 我必须终止该线程 我在 Windows 上使用 Qt 4 5 2 一种方法如下 class MyThread public QThread QMutex mutex bool stop
  • 如何查找android中特定进程使用的内存?

    我正在努力寻找解决方案来查找android中特定进程使用的内存 Using actvityManager getRunningAppProcesses 我可以获得所有进程内存使用情况的综合列表 但我需要实现一个场景 我应该通过process
  • Devise - Omniauth – 如果用户通过 Facebook 登录,则隐藏密码字段

    将 Devise 与 Omniauth 结合使用 我成功地允许用户使用他们的 Facebook 帐户登录 在 Omniauth 的帮助下wiki https github com plataformatec devise wiki How
  • 去除img边框

    我的 img 边框有问题 我对所有图像使用以下代码 但边框并没有消失 有人能告诉我删除 img 边框的正确方法吗 div class mosaic overlay img class cover1 div cover1 width 300p
  • 如何将行内的容器拉伸到最大可用高度?

    我有一个 Row 小部件 其中有许多容器 其高度取决于其内容 我希望它们的高度相同 如何在不硬编码其值的情况下实现这一目标 This is something I have 但我希望第一张卡自动获取行的高度 这样两张卡的高度就相同 我怎样才
  • 在 ExpandableListView 上滚动时,选择复选框会重复

    我有一个 BaseExpandableListAdapter 下面的代码 它操纵 ExpandableListView 和一个名为 Checklist 的模型 检查表模型包含一个类别列表 类别是检查列表 支票是低点清单 Low 包含一个布尔
  • 在 ubuntu 上安装 sbt [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我已经在 Ubuntu 上安装了 sbt bin sbt bin ls classes sbt sbt launch jar target
  • 'pow' 未在此范围内声明

    include
  • C# 添加或读取 C# exe 文件

    是否可以从另一个 C 项目 Windows 窗体 打开 C exe 文件 控制台应用程序 并从 exe 文件写入或读取不同的文本值 我正在使用 user32dll 来处理 exe 文件 谢谢 我确实使用此方法在 exe 文件中添加文本 Cl
  • 当 x 轴值为日期时,注释绘图很困难

    这是我的数据框 gt s Date Average Treatment SE 1 2014 10 15 4 875 1 1 6304852 2 2014 11 12 6 250 1 0 9955257 3 2014 12 11 0 250
  • 如何在 Bootstrap 3 Carousel 中输出当前幻灯片编号?

    我希望使用 Bootstrap 3 的 Carousel 插件输出当前幻灯片编号 理想情况下 我希望将其作为轮播 div 下方的文本 例如 此处轮播 3 of 9 我可以使用 CMS 中的函数输出图像总数 例如上例中的 9 个 但我不知道如
  • C# 获取句柄列表,AcessViolationException

    Info Net 4 5 测试于 Win7 64位 Win10 64位 虚拟盒 我正在尝试获取外部进程的句柄列表并将它们的名称作为字符串返回 以便我可以在之后关闭特定的进程 因此我使用 Win32API 编写了这个函数 它将检查句柄是否是我