【发布时间】:2015-08-31 16:00:40
【问题描述】:
我正在尝试使用 OpenProcess 通过进程 ID 打开所有现有进程。但不知何故,它只在第一次调用时起作用,而下一次调用显示它不适用于报告为 1008 的错误代码(尝试引用不存在的令牌)。
代码如下:
[DllImport("kernel32.dll", SetLastError=true)]
public static extern IntPtr OpenProcess(ProcessAccessFlags access, bool inheritHandle, int procId);
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool CloseHandle(IntPtr hObject);
[Flags]
public enum ProcessAccessFlags : uint
{
All = 0x001F0FFF,
Terminate = 0x00000001,
CreateThread = 0x00000002,
VirtualMemoryOperation = 0x00000008,
VirtualMemoryRead = 0x00000010,
VirtualMemoryWrite = 0x00000020,
DuplicateHandle = 0x00000040,
CreateProcess = 0x000000080,
SetQuota = 0x00000100,
SetInformation = 0x00000200,
QueryInformation = 0x00000400,
QueryLimitedInformation = 0x00001000,
Synchronize = 0x00100000
}
foreach (var proc in Process.GetProcesses()) {
var procHandle = OpenProcess(ProcessAccessFlags.QueryInformation | ProcessAccessFlags.VirtualMemoryOperation, false, proc.Id);
var eCode = Marshal.GetLastWin32Error();
//checking the last error code using Marshal.GetLastWin32Error()
//shows that it succeeds the first time with error code of 0
//Then all the next calls show error code of `1008`.
if(procHandle != IntPtr.Zero) CloseHandle(procHandle);
}
我已经尝试在谷歌上搜索错误,但不确定这里可能有什么问题。如果你能让我知道出了什么问题,那就太好了。谢谢!
更新:
正如我所说,它似乎只适用于循环中的第一个进程。但我非常怀疑即使在这种情况下它实际上也不起作用,因为从我看到的procHandle 与proc.Handle 保持完全不同的值,除非 OpenProcess 返回的句柄是 另一种 句柄,与 proc.Handle 不同(如果是这样,那真的很奇怪)。因此,如果我目前怀疑的是真的,那意味着OpenProcess 完全不起作用。在这种情况下它根本没用,并且仍然不确定我们可以在哪种情况下使用它。
【问题讨论】:
-
这看起来很正常。您有两个不同的 PID。毫不奇怪,你可以用一个做事,但不能用另一个做事。 FWIW,您没有
hwnd。那将是一个窗口的句柄。OpenProcess返回一个进程句柄。完全不同的野兽。 -
如果您查看
proc.ProcessName,它在哪个进程上失败了?如果该属性未提供任何信息,PID 是否对应于您系统上的有效进程? -
@DavidHeffernan 我不明白你的解释。您说
OpenProcess返回一个进程句柄,我显然将hwnd设置为返回值。那么为什么你还说hwnd是窗口句柄呢? -
@theB foreach 循环工作正常,我可以看到轮到不同的过程。正如我所解释的,它在第二个过程中失败了。在这种情况下,
ProcessName并不重要。 -
进程名称并不重要,除非它可以帮助您找到错误,如果它指的是无效进程,或者您无权访问的进程,或者最近终止的进程,或者任何数量的其他东西......另外,
GetLastError仅包含一个扩展错误,如果返回的句柄是NULL(又名IntPtr.Zero)。返回的句柄是NULL吗?