我一直在广泛研究这个问题,但似乎找不到答案。
我知道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(使用前将#替换为@)