gpt4 book ai didi

c# - OpenProcess 无法通过 id 打开现有进程(最后一个错误代码 : 1008)?

转载 作者:行者123 更新时间:2023-11-30 21:55:26 27 4
gpt4 key购买 nike

我正在尝试使用 OpenProcess 通过进程 ID 打开所有现有进程。但不知何故,它只在第一次调用时起作用,而接下来的调用表明它不适用于报告为 1008 的错误代码(试图引用不存在的 token )。

代码如下:

[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);
}

我已经尝试用谷歌搜索错误,但不确定这里可能出了什么问题。如果你能让我知道哪里出了问题,那就太好了。谢谢!

更新:正如我所说,它似乎只适用于循环中的第一个进程。但我非常怀疑即使在这种情况下它实际上也不起作用,因为据我所知,procHandleproc.Handle 保持完全不同的值,< em>除非OpenProcess 返回的句柄是另一种句柄,与proc.Handle 不同(如果是这样,那真的很奇怪)。因此,如果我目前怀疑的是真的,那就意味着 OpenProcess 完全不起作用。它在这种情况下根本没用,而且仍然不确定我们可以在哪种情况下使用它。

最佳答案

您的错误检查被破坏了。 OpenProcess 返回非零值表示成功。错误代码仅在 OpenProcess 失败时才有意义,即如果 OpenProcess 返回零。

因此,您必须仅在函数调用失败时询问错误代码,如其返回值所示。你检查错误代码而不检查返回值,这是错误的。您的代码应该更像这样:

foreach (var proc in Process.GetProcesses())
{
var procHandle = OpenProcess(ProcessAccessFlags.QueryInformation | ProcessAccessFlags.VirtualMemoryOperation, false, proc.Id);
if (procHandle == IntPtr.Zero)
{
// api call failed, can read error code
var eCode = Marshal.GetLastWin32Error();
}
else
{
// api call succeeded, do stuff with handle
CloseHandle(procHandle);
}
}

关于c# - OpenProcess 无法通过 id 打开现有进程(最后一个错误代码 : 1008)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32315351/

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