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

解决方案 »

  1.   

    XP SP1以上系统可以调GetProcessHandleCount来取。
    BOOL WINAPI GetProcessHandleCount(
      HANDLE hProcess,
      PDWORD pdwHandleCount
    );Kernel32.dll
      

  2.   

    具体点喃?
     两个参数 一个HANDLE hProcess 第二个pdwHandleCount 是什么?
      

  3.   

    第二个pdwHandleCount是DWORD指针,接收Handle数量
      

  4.   

    Handle数量]
     这个数量怎么求的了?
      

  5.   

    这个参数是要你传一个DWORD类型变量的地址,这是变量初始值可以为0。当函数执行成功后,这个变量中得到的就是你想要的句柄个数了。
      

  6.   

    用GetProcessHandleCount时候出错啦 如下:
    error C3861: “GetProcessHandleCount”: 即使使用参数相关的查找,也未找到标识符
    1.怎么解决这个问题啊?用这个API涉及权限吗?  
     
      

  7.   

    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;
    }
      

  8.   

    上面的API必须用于NT系统,包括NT4.0,2000,XP,2003
      

  9.   

    KeSummer
    请问ZwQuerySystemInformation加个参数 SystemHandleInformation, 
    通过进程ID得出句柄数
     那参数  “进程ID” 在那儿带进去?
    从你的例子里 我没看出来啊!
      

  10.   

    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累加..实在太简单不过了..这个程序我写过的.
      

  11.   

    另外GetProcessHandleCount Requires Windows XP SP1.必须这样写
    #define _WIN32_WINNT  0x0501 
    #include <windows.h>或者用LoadLibrary的方法.