在查找进程句柄的Iain's Code中,它被配置为只获取“文件”句柄,但我也需要“进程”句柄,但不能to.Can某个指向正确方向的人。谢谢
发布于 2013-12-31 21:34:49
只需修改代码以在该行后面添加更多逻辑
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;
}
}谢谢,还有,如果切换情况是进程类型,有没有办法从句柄值中找到进程名称?
你当然可以。但您必须深入理解Win32应用编程接口以及处理程序的工作方式。基本上,您希望使用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。在谷歌上搜索这个的用法示例。
https://stackoverflow.com/questions/20858097
复制相似问题