在 Iain's Code要查找进程的句柄,它被配置为仅获取“FILE”句柄,但我还需要“PROCESS”句柄,但无法。有人能给我指出正确的方向吗? 谢谢
最佳答案
只需修改代码以在该行后面添加更多逻辑
if (GetHandleType(handle, handleEntry.OwnerPid, out handleType) && handleType == SystemHandleType.OB_TYPE_FILE)
如果您想处理process
类型的句柄,请使用如下内容:
bool result = GetHandleType(handle, handleEntry.OwnerPid, out handleType);
if (result)
{
switch (handleType)
{
case SystemHandleType.OB_TYPE_FILE:
{
// Existing code:
string devicePath;
....
}
break;
case SystemHandleType.OB_TYPE_PROCESS:
{
// Your code here
....
}
break;
}
}
Thanks and also is there a way to find the process name from the handle value if the the switch case is Process type ?
当然可以。但是您必须深入了解 Win32 API 以及句柄的工作原理。基本上,您希望使用 DuplicateHandle
来复制在您自己的进程中拥有该句柄的其他进程的句柄(这样您就可以访问它)。然后,您需要分配非托管内存,使用良好的参数调用 NtQueryObject
,以便它将用字节填充您的非托管内存,然后您必须将这些字节编码(marshal)回包含有关您的(进程)信息的结构)句柄。
深入查看您链接的代码,所有内容都写在那里。特别是 GetFileNameFromHandle
函数。
1)在我们自己的进程中复制句柄
processHandle = NativeMethods.OpenProcess(ProcessAccessRights.PROCESS_DUP_HANDLE, true, processId);
if (NativeMethods.DuplicateHandle(processHandle.DangerousGetHandle(), handle, currentProcess, out objectHandle, 0, false, DuplicateHandleOptions.DUPLICATE_SAME_ACCESS))
{
handle = objectHandle.DangerousGetHandle();
}
2)分配非托管内存...(稍后您必须销毁它)
ptr = Marshal.AllocHGlobal(length);
3)...然后将其与权限参数一起传递给 NtQueryObject
NT_STATUS ret = NativeMethods.NtQueryObject(handle, OBJECT_INFORMATION_CLASS.ObjectNameInformation, ptr, length, out length);
4) 编码(marshal)返回已知结构。在原始代码中,它是一个简单的字符串。
fileName = Marshal.PtrToStringUni((IntPtr)((int)ptr + 8), (length - 9) / 2);
就您而言,正确的结构是SYSTEM_HANDLE_ENTRY
。 Google 提供了使用示例。
关于c# - 进程的进程句柄而不是文件句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20858097/