typedef struct _SYSTEM_HANDLE_INFORMATION{ ULONG ProcessId; UCHAR ObjectTypeNumber; UCHAR Flags; USHORT Handle; PVOID Object; ACCESS_MASK GrantedAccess; /* ProcessId: 进程标识符 ObjectTypeNumber; 打开的对象的类型 Flags: 句柄属性标志 Handle: 句柄数值,在进程打开的句柄中唯一标识某个句柄 Object: 这个就是句柄对应的EPROCESS的地址 GrantedAccess: 句柄对象的访问权限 */ } SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
ObjectTypeNumber的定义
// 枚举对象类型 typedef enum _SYSTEM_HANDLE_TYPE { OB_TYPE_UNKNOWN, // 0,未知类型 OB_TYPE_TYPE, // 1,类型 OB_TYPE_DIRECTORY, // 2,目录 OB_TYPE_SYMBOLIC_LINK, // 3,符号链接 OB_TYPE_TOKEN, // 4,安全 OB_TYPE_PROCESS, // 5,进程 OB_TYPE_THREAD, // 6,线程 OB_TYPE_JOB, // 7,Job OB_TYPE_DEBUG_OBJECT, // 8,调试对象 OB_TYPE_EVENT, // 9,事件 OB_TYPE_EVENT_PAIR, // 10,事件 OB_TYPE_MUTANT, // 11,互斥体 OB_TYPE_CALLBACK, // 12,回调 OB_TYPE_SEMAPHORE, // 13,信号量 OB_TYPE_TIMER, // 14,时钟 OB_TYPE_PROFILE, // 15,Profile OB_TYPE_KEYED_EVENT, // 16,键盘事件 OB_TYPE_WINDOWS_STATION, // 17,fixed OB_TYPE_DESKTOP, // 18,桌面 OB_TYPE_SECTION, // 19,共享内存区 OB_TYPE_KEY, // 20,键值 OB_TYPE_PORT, // 21,端口 OB_TYPE_WAITABLE_PORT, // 22,可等待端口 OB_TYPE_ADAPTER, // 23,适配器 OB_TYPE_CONTROLLER, // 24,控制器 OB_TYPE_DEVICE, // 25,设备 OB_TYPE_DRIVER, // 26,驱动 OB_TYPE_IOCOMPLETION, // 27,fixed OB_TYPE_FILE, // 28,内存映射文件 OB_TYPE_WMIGUID // 29,fixed } SYSTEM_HANDLE_TYPE; typedef enum _MEMORY_INFORMATION_CLASS { MemoryBasicInformation, MemoryWorkingSetList, MemorySectionName, MemoryBasicVlmInformation } MEMORY_INFORMATION_CLASS, *PMEMORY_INFORMATION_CLASS; typedef struct _OBJECT_TYPE_INFORMATION { UNICODE_STRING TypeName; ULONG TotalNumberOfHandles; ULONG TotalNumberOfObjects; } OBJECT_TYPE_INFORMATION, *POBJECT_TYPE_INFORMATION; typedef struct _OBJECT_ALL_INFORMATION { ULONG NumberOfObjects; OBJECT_TYPE_INFORMATION ObjectTypeInformation[1]; } OBJECT_ALL_INFORMATION, *POBJECT_ALL_INFORMATION;
使用时应注意,返回到缓冲区的首先是一个ULONG类型的数据,表示有多少数组
使用NtQuerySystemInformation函数的SystemHandleInformation=16号功能. 其相关结构定义如下: typedef struct _SYSTEM_HANDLE_TABLE_ENTRY_INFO{ USHORT UniqueProcessId; USHORT CreatorBackTraceIndex; UCHAR ObjectTypeIndex; UCHAR HandleAttributes; USHORT HandleValue; PVOID Object; ULONG GrantedAccess; } SYSTEM_HANDLE_TABLE_ENTRY_INFO, *PSYSTEM_HANDLE_TABLE_ENTRY_INFO;
typedef struct _SYSTEM_HANDLE_INFORMATION{
ULONG NumberOfHandles;
SYSTEM_HANDLE_TABLE_ENTRY_INFO Handles[1];
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
该功能号获取系统内所有进程的句柄放在Handles里,个数由NumberOfHandles标识,
每个句柄由UniqueProcessId来区分属于那个不同的进程.
-------《ProcessExplorer原理分析之句柄处理【原创】》