进程处理而不是进程的文件句柄

时间:2013-12-31 13:25:06

标签: c# winapi unmanaged

Iain's Code中找到进程的句柄,它被配置为只获取“FILE”句柄,但我还需要“PROCESS”句柄但不能。可以指出一些我在正确的方向。 感谢

1 个答案:

答案 0 :(得分:3)

只需修改代码即可在行

之后添加更多逻辑
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 type?

,则处理值

当然可以。但是你必须深入了解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。谷歌为此提供了使用示例。