枚举一个进程,中的所有句柄以得出句柄数,请各路神仙给个思路,貌似没现成得API可调用喔!

ASCRIBE 2008-03-22 12:40:08
枚举一个进程,中的所有句柄以得出句柄数,请各路神仙给个思路,貌似没现成得API可调用喔!
...全文
655 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
celiaduo 2008-03-29
  • 打赏
  • 举报
回复
up
KeSummer 2008-03-28
  • 打赏
  • 举报
回复
另外GetProcessHandleCount Requires Windows XP SP1.

必须这样写
#define _WIN32_WINNT 0x0501
#include <windows.h>

或者用LoadLibrary的方法.
KeSummer 2008-03-28
  • 打赏
  • 举报
回复
ZwQuerySystemInformation加个参数 SystemHandleInformation获得所有的句柄,包括任何类型的句柄.
假设系统一共打开1000个句柄,则返回1000个以下结构体
typedef struct _SYSTEM_HANDLE_INFORMATION{
ULONG ProcessID; //进程的标识ID
UCHAR ObjectTypeNumber; //对象类型
UCHAR Flags; //0x01 = PROTECT_FROM_CLOSE,0x02 = INHERIT
USHORT Handle; //对象句柄的数值
PVOID Object; //对象句柄所指的内核对象地址
ACCESS_MASK GrantedAccess; //创建句柄时所准许的对象的访问权
}SYSTEM_HANDLE_INFORMATION, * PSYSTEM_HANDLE_INFORMATION

根据ProcessID累加..实在太简单不过了..这个程序我写过的.
hityct1 2008-03-25
  • 打赏
  • 举报
回复
mark
kingstarer 2008-03-25
  • 打赏
  • 举报
回复
有个枚举窗口的函数
ASCRIBE 2008-03-24
  • 打赏
  • 举报
回复
问题解决了
将在近期公布我修炼的结果!偶也
ASCRIBE 2008-03-24
  • 打赏
  • 举报
回复
KeSummer
请问ZwQuerySystemInformation加个参数 SystemHandleInformation,
通过进程ID得出句柄数
那参数 “进程ID” 在那儿带进去?
从你的例子里 我没看出来啊!
long_xing 2008-03-23
  • 打赏
  • 举报
回复
这个参数是要你传一个DWORD类型变量的地址,这是变量初始值可以为0。当函数执行成功后,这个变量中得到的就是你想要的句柄个数了。
terran_ye 2008-03-23
  • 打赏
  • 举报
回复
mark,xuexi
KeSummer 2008-03-23
  • 打赏
  • 举报
回复
上面的API必须用于NT系统,包括NT4.0,2000,XP,2003
KeSummer 2008-03-23
  • 打赏
  • 举报
回复
ZwQuerySystemInformation加个参数 SystemHandleInformation,之前我做过,参看一篇文章里面的描述:根据ProcessID进行统计就可以得出进程里面的句柄数了.非常简单.

NTSYSAPI
NTSTATUS
NTAPI
ZwQuerySystemInformation(
IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
IN OUT PVOID SystemInformation,
IN ULONG SystemInformationLength,
OUT PULONG ReturnLength OPTIONAL
};
(这个函数结构Microsoft没有公开,参见Gary Nebbett<<Windows NT/2000 Native API Reference>>)

第一个参数是一个枚举常数,设置要查询的系统信息类型,ZwQuerySystemInformation支持54个系统信息的查询,我们要用到的
是它的第16号功能,进行SystemHandleInformation查询.
SYSTEM_HANDLE_INFORMATION结构定义如下:
typedef struct _SYSTEM_HANDLE_INFORMATION{
ULONG ProcessID; //进程的标识ID
UCHAR ObjectTypeNumber; //对象类型
UCHAR Flags; //0x01 = PROTECT_FROM_CLOSE,0x02 = INHERIT
USHORT Handle; //对象句柄的数值
PVOID Object; //对象句柄所指的内核对象地址
ACCESS_MASK GrantedAccess; //创建句柄时所准许的对象的访问权
}SYSTEM_HANDLE_INFORMATION, * PSYSTEM_HANDLE_INFORMATION;
(这个函数结构Microsoft没有公开,参见Gary Nebbett<<Windows NT/2000 Native API Reference>>)
第二个参数输出查询的结果
第三个参数设置缓冲区的长度
第四个参数返回函数正确执行需要的缓冲区的大小
代码如下:
#define SystemHandleInformation 16
PULONG GetHandleList()
{
ULONG cbBuffer = 0x1000; //先设定一个较小的缓冲空间
PULONG pBuffer = new ULONG[cbBuffer]; //分配内存
NTSTATUS Status;

do
{
Status = ZwQuerySystemInformation(
SystemHandleInformation,
pBuffer, cbBuffer * sizeof * pBuffer, NULL);

if (Status == STATUS_INFO_LENGTH_MISMATCH)
{
//如果返回的错误信息为缓冲区长度不够,那么重新分配内存
delete [] pBuffer;
pBuffer = new ULONG[cbBuffer *= 2];
}
else if (!NT_SUCCESS(Status))
{
//如果是其他错误信息,返回
delete [] pBuffer;
return false;
}
}
while (Status == STATUS_INFO_LENGTH_MISMATCH);
return pBuffer;
}

ASCRIBE 2008-03-23
  • 打赏
  • 举报
回复
用GetProcessHandleCount时候出错啦 如下:
error C3861: “GetProcessHandleCount”: 即使使用参数相关的查找,也未找到标识符


1.怎么解决这个问题啊?用这个API涉及权限吗?
cnzdgs 2008-03-22
  • 打赏
  • 举报
回复
XP SP1以上系统可以调GetProcessHandleCount来取。
BOOL WINAPI GetProcessHandleCount(
HANDLE hProcess,
PDWORD pdwHandleCount
);

Kernel32.dll
ASCRIBE 2008-03-22
  • 打赏
  • 举报
回复
具体点喃?
两个参数 一个HANDLE hProcess 第二个pdwHandleCount 是什么?
ASCRIBE 2008-03-22
  • 打赏
  • 举报
回复
Handle数量]
这个数量怎么求的了?
秋忆 2008-03-22
  • 打赏
  • 举报
回复
第二个pdwHandleCount是DWORD指针,接收Handle数量

15,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧