gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 07:45:13 29 4
gpt4 key购买 nike

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

我知道 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 位的,混合在一起。

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

最佳答案

详见 the MSDN page for Process.Modules 的评论和 this thread在从 64 位进程枚举 32 位进程时,Process.Modules 中存在一个已知问题,反之亦然:

Internally .NET's Process.Modules is using function EnumProcessModules from PSAPI.dll. This function has a known issue that it cannot work across 32/64 bit process boundary. Therefore enumerating another 64-bit process from 32-bit process or vice versa doesn't work correctly.

解决方案似乎是使用 EnumProcessModulesEx函数,(必须通过 P/Invoke 调用),但是此函数仅在更高版本的 Windows 上可用。

We fixed this issue by adding a new function called EnumProcessModulesEx to PSAPI.dll (http://msdn2.microsoft.com/en-us/library/ms682633.aspx), but we currently cannot use it in this case:

  • it only works on Windows Vista or Windows Server 2008
  • currently .NET 2.0 Framework don't have a service pack or hotfix to make Process.Modules use this new API

关于C# 在 Process.Kill() 期间仅完成了 ReadProcessMemory 或 WriteProcessMemory 请求的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10986486/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com