C# 在 Process.Kill() 期间仅完成了 ReadProcessMemory 或 WriteProcessMemory 请求的一部分

2024-05-07

我一直在广泛研究这个问题,但似乎找不到答案。

我知道Only part of a ReadProcessMemory or WriteProcessMemory request was completed当 32 位进程尝试访问 64 位进程时会引发异常,64 位修改 32 位进程也会引发异常。

该问题的解决方案是将平台目标更改为“任何 CPU”。我已经尝试过了,不幸的是这并不能解决我的问题。

下一个代码块是不断抛出异常的地方。运行此代码的程序用于打开远程计算机上的应用程序,并保留程序本身打开的所有进程的列表,以便我不必循环遍历所有进程。

Process processToRemove = null;
lock (_runningProcesses)
{
    foreach (Process p in _runningProcesses)
    {
        foreach (ProcessModule module in p.Modules)
        {
            string[] strs = text.Split('\\');

            if (module.ModuleName.Equals(strs[strs.Length - 1]))
            {
                processToRemove = p;
                break;
            }
        }
        if (processToRemove != null)
        {
            break;
        }
    }
    if (processToRemove != null)
    {
        processToRemove.Kill();
        _runningProcesses.Remove(processToRemove);
    }
}

这些进程很可能是 32 位和 64 位的,混合在一起。

我是否有什么不应该做的事情,或者是否有更好的方法来完成这一切?


正如评论中详细介绍的Process.Modules 的 MSDN 页面 http://msdn.microsoft.com/en-us/library/system.diagnostics.process.modules.aspx and 这个线程 http://www.eggheadcafe.com/software/aspnet/30803255/enumerating-modules-inside-a-process-in-a-64-bit-system.aspx有一个已知问题Process.Modules当从 64 位进程枚举 32 位进程时,反之亦然:

.NET 的 Process.Modules 内部使用函数 EnumProcessModules 来自 PSAPI.dll。此功能有一个无法工作的已知问题 跨越 32/64 位进程边界。因此列举另一个 32 位进程的 64 位进程不起作用,反之亦然 正确。

解决方案似乎是使用EnumProcessModulesEx http://msdn.microsoft.com/en-us/library/windows/desktop/ms682633%28v=vs.85%29.aspx函数(必须通过 P/Invoke 调用),但是此函数仅在更高版本的 Windows 上可用。

我们通过添加解决了这个问题 PSAPI.dll 中名为 EnumProcessModulesEx 的新函数 (http://msdn2.microsoft.com/en-us/library/ms682633.aspx),但我们 目前在这种情况下不能使用它:

  • 它仅适用于 Windows Vista 或 Windows Server 2008
  • 目前 .NET 2.0 Framework 没有服务包或修补程序来使 Process.Modules 使用这个新 API
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 在 Process.Kill() 期间仅完成了 ReadProcessMemory 或 WriteProcessMemory 请求的一部分 的相关文章

随机推荐