枚举一个进程,中的所有句柄以得出句柄数,请各路神仙给个思路,貌似没现成得API可调用喔! 枚举一个进程,中的所有句柄以得出句柄数,请各路神仙给个思路,貌似没现成得API可调用喔! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 XP SP1以上系统可以调GetProcessHandleCount来取。BOOL WINAPI GetProcessHandleCount( HANDLE hProcess, PDWORD pdwHandleCount);Kernel32.dll 具体点喃? 两个参数 一个HANDLE hProcess 第二个pdwHandleCount 是什么? 第二个pdwHandleCount是DWORD指针,接收Handle数量 Handle数量] 这个数量怎么求的了? 这个参数是要你传一个DWORD类型变量的地址,这是变量初始值可以为0。当函数执行成功后,这个变量中得到的就是你想要的句柄个数了。 用GetProcessHandleCount时候出错啦 如下:error C3861: “GetProcessHandleCount”: 即使使用参数相关的查找,也未找到标识符1.怎么解决这个问题啊?用这个API涉及权限吗? ZwQuerySystemInformation加个参数 SystemHandleInformation,之前我做过,参看一篇文章里面的描述:根据ProcessID进行统计就可以得出进程里面的句柄数了.非常简单.NTSYSAPINTSTATUSNTAPIZwQuerySystemInformation( 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 16PULONG 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;} 上面的API必须用于NT系统,包括NT4.0,2000,XP,2003 KeSummer请问ZwQuerySystemInformation加个参数 SystemHandleInformation, 通过进程ID得出句柄数 那参数 “进程ID” 在那儿带进去?从你的例子里 我没看出来啊! 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累加..实在太简单不过了..这个程序我写过的. 另外GetProcessHandleCount Requires Windows XP SP1.必须这样写#define _WIN32_WINNT 0x0501 #include <windows.h>或者用LoadLibrary的方法. VC WebBrowser问题 ListControl?????????????????? 一个关于窗口背景色的问题 请教怎样用API实现屏幕重画 有关模板list的疑惑 求远程桌面的实现原理,机制或者源代码,或者大家交流交流自己的看法。 如何建立网络连接,能够避开netstat? 怎样将一个位图旋转90度显示? 哪位高人有《vc++数字图像处理》附带光盘的code啊,急啊 winsock现在还能不能实现伪装源ip? 问一个很初级的问题 SQL语句查询问题
BOOL WINAPI GetProcessHandleCount(
HANDLE hProcess,
PDWORD pdwHandleCount
);Kernel32.dll
两个参数 一个HANDLE hProcess 第二个pdwHandleCount 是什么?
这个数量怎么求的了?
error C3861: “GetProcessHandleCount”: 即使使用参数相关的查找,也未找到标识符
1.怎么解决这个问题啊?用这个API涉及权限吗?
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;
}
请问ZwQuerySystemInformation加个参数 SystemHandleInformation,
通过进程ID得出句柄数
那参数 “进程ID” 在那儿带进去?
从你的例子里 我没看出来啊!
假设系统一共打开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累加..实在太简单不过了..这个程序我写过的.
#define _WIN32_WINNT 0x0501
#include <windows.h>或者用LoadLibrary的方法.