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 的相关文章

  • 使用链表进行堆排序

    我想知道是否有人曾经使用链表进行堆排序 如果他们可以提供代码 我已经能够使用数组进行堆排序 但尝试在链表中进行排序似乎不切实际 而且在你知道的地方很痛苦 我必须为我正在做的项目实现链接列表 任何帮助将不胜感激 我也用C 答案是 你不想在链表
  • 如何从字符串中提取子字符串直到遇到第二个空格?

    我有一个像这样的字符串 o1 1232 5467 1232 5467 1232 5467 1232 5467 1232 5467 1232 5467 如何仅提取 o1 1232 5467 要提取的字符数并不总是相同 因此 我只想提取直到遇到
  • C# SmtpClient编程中如何设置带有中文的附件文件名?

    我的代码如下 ContentType ct new ContentType ct MediaType MediaTypeNames Application Octet ct Name 这是一个很长的中文文件名希望能用它在附件名中 Doc A
  • 静态构造函数和 BeforeFieldInit?

    如果类型没有静态构造函数 则将执行字段初始值设定项 就在使用该类型之前 或者在某个时间点突发奇想 运行时 为什么这段代码 void Main start Dump Test EchoAndReturn Hello end Dump clas
  • C#.Net 邮件将进入垃圾邮件文件夹

    我正在从 ASP net Web 应用程序发送电子邮件 邮件发送成功 没有失败 但大多数都进入了垃圾邮件文件夹 请帮助我克服垃圾邮件过滤器 我的发送邮件代码 public void SendMail string FromAddress s
  • 如何使用 openSSL 函数验证 PEM 证书的密钥长度

    如何验证以这种方式生成的 PEM 证书的密钥长度 openssl genrsa des3 out server key 1024 openssl req new key server key out server csr cp server
  • C# 中一次性对象克隆会导致内存泄漏吗?

    检查这个代码 class someclass IDisposable private Bitmap imageObject public void ImageCrop int X int Y int W int H imageObject
  • 如何向 Mono.ZeroConf 注册服务?

    我正在尝试测试 ZeroConf 示例http www mono project com Mono Zeroconf http www mono project com Mono Zeroconf 我正在运行 OpenSuse 11 和 M
  • OpenGL:如何检查用户是否支持glGenBuffers()?

    我检查了文档 它说 OpenGL 版本必须至少为 1 5 才能制作glGenBuffers 工作 用户使用的是1 5版本但是函数调用会导致崩溃 这是文档中的错误 还是用户的驱动程序问题 我正在用这个glGenBuffers 对于VBO 我如
  • 一个地址有多少字节? [复制]

    这个问题在这里已经有答案了 在64位机器上 我们知道一个地址是8个字节 然而 我并不完全清楚一个地址中有多少字节的信息 虚拟内存中的每个字节都有一个地址吗 或者内存中的每 64 位都有一个地址 还是取决于架构 如果这取决于架构 那么我应该如
  • Libev,如何将参数传递给相关回调

    我陷入了 libev 中争论的境地 通常 libev 在类似的函数中接收包 接收回调 没关系 但是实际操作中 我们需要派遣一个亲戚 写回调 根据收到的包裹处理具体工作 例如 S RECV MSG pstRecvMsg S RECV MSG
  • 如何在 Javascript 中连接 C# ActiveX 事件处理程序

    我尝试使用几个代码片段将 ActiveX 对象与 Javascript 事件处理程序挂钩 我无法确定为什么事件处理程序没有被调用 带有项目的 Github 存储库 https github com JesseKPhillips Csharp
  • MySQL 连接器 C++ 64 位在 Visual Studio 2012 中从源代码构建

    我正在尝试建立mySQL 连接器 C 从源头在视觉工作室2012为了64 bit建筑学 我知道这取决于一些boost头文件和C 连接器 跑步CMake生成一个项目文件 但该项目文件无法编译 因为有一大堆非常令人困惑的错误 这些错误可能与包含
  • 当Model和ViewModel一模一样的时候怎么办?

    我想知道什么是最佳实践 我被告知要始终创建 ViewModel 并且永远不要使用核心模型类将数据传递到视图 这就说得通了 让我把事情分开 但什么是Model 和ViewModel一模一样 我应该重新创建另一个类还是只是使用它 我觉得我应该重
  • .NET 和 Mono 之间的开发差异

    我正在研究 Mono 和 NET C 将来当项目开发时我们需要在 Linux 服务器上运行代码 此时我一直在研究 ASP NET MVC 和 Mono 我运行 Ubuntu 发行版 想要开发 Web 应用程序 其他一些开发人员使用 Wind
  • 调用 .ToArray() 时出现 ArgumentException

    我有一个经常被清除的列表 代码完全是这样的 VisitorAgent toPersist List
  • C:设置变量范围内所有位的最有效方法

    让我们来int举个例子 int SetBitWithinRange const unsigned from const unsigned to To be implemented SetBitWithinRange应该返回一个int其中所有
  • 如何组合两个 lambda [重复]

    这个问题在这里已经有答案了 可能的重复 在 C 中组合两个 lambda 表达式 https stackoverflow com questions 1717444 combining two lamba expressions in c
  • 从后面的代码添加外部 css 文件

    我有一个 CSS 文件 例如 SomeStyle css 我是否可以将此样式表文档从其代码隐藏应用到 aspx 页面 您可以将文字控件添加到标头控件中 Page Header Controls Add new System Web UI L
  • ContentDialog Windows 10 Mobile XAML - 全屏 - 填充

    我在项目中放置了一个 ContentDialog 用于 Windows 10 上的登录弹出窗口 当我在移动设备上运行此项目时 ContentDialog 未全屏显示 并且该元素周围有最小的填充 在键盘上可见 例如在焦点元素文本框上 键盘和内

随机推荐

  • 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 编写了这个函数 它将检查句柄是否是我