C#-如何查找与当前进程关联的所有句柄

C#-如何查找与当前进程关联的所有句柄,c#,process,C#,Process,我想找到哪些文件是目前由Excel打开的,Word的PDF进程。 在x64dbg中,我可以看到有关进程的信息,也可以看到所需的文件,但C#和WMI看起来不允许获取此类信息 handle.exe不是很好的解决方案,我不想使用它来解析数据 所以,有没有任何方法可以使用C#和WMI来实现这一点,如果没有,那么我可以使用什么Win32 API来查找与进程关联的句柄。 ntdll.dll->NtQueryInformationProcess允许我获取进程地址,但如何使用它读取句柄?多亏了大家,我找到了一个

我想找到哪些文件是目前由Excel打开的,Word的PDF进程。 在x64dbg中,我可以看到有关进程的信息,也可以看到所需的文件,但C#和WMI看起来不允许获取此类信息

handle.exe不是很好的解决方案,我不想使用它来解析数据

所以,有没有任何方法可以使用C#和WMI来实现这一点,如果没有,那么我可以使用什么Win32 API来查找与进程关联的句柄。
ntdll.dll->NtQueryInformationProcess允许我获取进程地址,但如何使用它读取句柄?

多亏了大家,我找到了一个解决方案

因此,internet上有很多解决方案,但大多数解决方案在获取FileTypePipe的名称时都存在挂起问题:)

公共类ProcessUtility
{
/// 
/// https://www.geoffchappell.com/studies/windows/km/ntoskrnl/api/ex/sysinfo/handle_table_entry.htm?ts=0,242
/// 
[StructLayout(LayoutKind.Sequential,Pack=1)]
私有结构系统\u处理\u信息
{//信息类16
公共ushort进程ID;
公共ushort CreatorBackTrackIndex;
公共字节对象类型;
公共字节HandleAttribute;
公共把手;
公共IntPtr对象\u指针;
公共IntPtr访问掩码;
}
私有枚举对象\u信息\u类:int
{
ObjectBasicInformation=0,
ObjectNameInformation=1,
ObjectTypeInformation=2,
ObjectAllTypesInformation=3,
ObjectHandleInformation=4
}
[StructLayout(LayoutKind.Sequential,Pack=1)]
私有结构对象\u名称\u信息
{//信息类1
公共UNICODE_字符串名称;
}
[StructLayout(LayoutKind.Sequential)]
私有结构UNICODE\u字符串
{
公共长度;
公共ushort最大长度;
公共IntPtr缓冲区;
}
[旗帜]
私有枚举进程\u访问\u标志:uint
{
All=0x001F0FFF,
终止=0x00000001,
CreateThread=0x00000002,
VMOperation=0x00000008,
VMRead=0x00000010,
VMWrite=0x00000020,
DupHandle=0x00000040,
SetInformation=0x00000200,
查询信息=0x00000400,
同步=0x00100000
}
私有枚举文件类型:uint
{
FileTypeChar=0x0002,
FileTypeDisk=0x0001,
FileTypePipe=0x0003,
FileTypeRemote=0x8000,
FileTypeUnknown=0x0000,
}
[DllImport(“ntdll.dll”)]
私有静态外部单元NtQuerySystemInformation(int SystemInformationClass、IntPtr SystemInformation、int SystemInformationLength、ref int returnLength);
[DllImport(“kernel32.dll”)]
私有静态外部IntPtr OpenProcess(进程\u访问\u标志dwDesiredAccess,[MarshalAs(UnmanagedType.Bool)]Bool bInheritHandle,int dwProcessId);
[DllImport(“kernel32.dll”,SetLastError=true)]
[返回:Marshallas(UnmanagedType.Bool)]
私有静态外部bool DuplicateHandle(IntPtr hSourceProcessHandle、IntPtr hSourceHandle、IntPtr hTargetProcessHandle、out IntPtr lpTargetHandle、uint dwDesiredAccess、[MarshalAs(UnmanagedType.bool)]bool bInheritHandle、uint dwOptions);
[DllImport(“kernel32.dll”)]
私有静态外部IntPtr GetCurrentProcess();
[DllImport(“ntdll.dll”)]
私有静态extern int NtQueryObject(IntPtr ObjectHandle、int ObjectInformationClass、IntPtr ObjectInformation、int ObjectInformationLength、ref int returnLength);
[DllImport(“kernel32.dll”)]
专用静态外部布尔闭合手柄(IntPtr hObject);
[DllImport(“kernel32.dll”,SetLastError=true)]
私有静态外部uint QueryDosDevice(字符串lpDeviceName、StringBuilder lpTargetPath、int-ucchMax);
[DllImport(“kernel32.dll”)]
私有静态外部bool GetHandleInformation(IntPtr hObject、out uint lpdwFlags);
[DllImport(“kernel32.dll”)]
私有静态外部文件类型GetFileType(IntPtr-hFile);
私有常量int MAX_PATH=260;
私人建筑状态\信息\长度\不匹配=0xC0000004;
private const int DUPLICATE_SAME_ACCESS=0x2;
私有consuint FILE\u SEQUENTIAL\u ONLY=0x00000004;
私用const int CNST\u SYSTEM\u HANDLE\u INFORMATION=0x10;
private const int OBJECT_TYPE_FILE=0x24;
公共静态列表FindFileByExtension(列表目标\进程、列表目标\扩展)
{
List afilepath=new List();
if(target_extensions==null || target_extensions.Count==0)
{
抛出新异常(“未定义异常”);
}
foreach(目标流程中的流程)
{
列出一个进程文件=GetPrcessFiles(目标进程);
foreach(字符串文件\进程文件中的路径)
{
if(target_extensions.Contains(Path.GetExtension(file_Path.ToLower()))
&&!Path.GetFileName(文件路径).StartsWith(“~”)
{
添加(文件路径);
}
}
}
返回故障路径;
}
公共静态列表GetPrcessFiles(列出目标进程)
{
List aFiles=新列表();
foreach(目标流程中的流程)
{
List aHandles=GetFileHandles(process.ToList();
foreach(系统句柄信息句柄信息在句柄中)
{
字符串file\u path=GetFilePath(句柄信息,进程);
如果(!string.IsNullOrEmpty(fil