c# - 进程的进程句柄而不是文件句柄

标签 c# winapi unmanaged

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/

相关文章:

c# - 在应用程序中导航已激活的 Windows Phone 7(逻辑删除)

c# - 返回 IEnumerable 实例和 C# 中的 yield return 语句之间的确切区别是什么

c++ - fwrite 比 Windows 中的 WriteFile 快吗?

c - 如何在以管理员身份启动的应用程序中查找用户名

c++ - 鼠标点击 handle

c# - DllImport 的正确用法

C# MVC : What is a good way to prevent Denial Of Service (DOS) attacks on ASP. NET 站点?

c# - 迭代器变量是否有单数形式与复数形式相同的命名准则?

visual-studio-2012 - 是否可以像普通警告一样格式化代码分析警告?

c# - C++ 到 C# 的包装 - 如何处理 C# 中的双指针数组