只需修改代码,在行后添加更多逻辑
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;
}
}
谢谢,还有没有办法从
如果 switch case 是 Process 类型,则处理值?
当然可以。但是您必须深入了解 Win32 API 以及句柄的工作原理。基本上,您想复制在您自己的进程中拥有该句柄的另一个进程的句柄,使用DuplicateHandle(这样您就可以访问它)。然后您需要分配非托管内存,使用良好参数调用NtQueryObject,这样它就会用字节填充您的非托管内存,然后您必须将这些字节编组回包含有关您的(进程)句柄信息的结构。
深入查看您链接的代码,所有内容都写在那里。尤其是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) 封送回已知结构。在原始代码中,它是一个简单的字符串。
fileName = Marshal.PtrToStringUni((IntPtr)((int)ptr + 8), (length - 9) / 2);
在您的情况下,正确的结构是 SYSTEM_HANDLE_ENTRY。谷歌为此提供了使用示例。