注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

珠海渔郎之电子网档

项目管理 + 程序开发 + Delphi + 电脑应用 + 数码 + 进化感悟

 
 
 

日志

 
 

通过进程PID获得进程的句柄总数  

2010-12-02 03:40:51|  分类: Delphi |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

需要通过微软未公开的函数来调用,代码如下:

{
  注意,NtQuerySystemInformation函数应该动态加载(loadlibrary, GetProcAddress等),这里偷懒没写动态加载的代码!
}

type
 _SYSTEM_HANDLE = packed record
  ProcessID:     DWORD;
  HandleType:    WORD;
  HandleNumber:  WORD;
  KernelAddress: DWORD;
  Flags:         DWORD;
 end;

 _SYSTEM_HANDLE_INFORMATION = packed record
  Count: DWORD;
  Handles: array[0..0] of _SYSTEM_HANDLE;
 end;

function NtQuerySystemInformation(const InformationType: DWORD;
           Data: Pointer; const cbSize: DWORD; var RetSize: DWORD): DWORD; stdcall; external 'ntdll.dll';

function GetProcessHandleCount(const PID: DWORD): Integer;
const
  CIDefaultSize = 2000;
var
  Ret: DWORD;
  i : Integer;
  pdata: ^_SYSTEM_HANDLE_INFORMATION;
  pi : ^_SYSTEM_HANDLE;
begin
  pdata := nil;
  Result := 0;
  Ret := 0;

  // 下面这句代码,用于提升程序权限,提升Debug权限的代码很多,从网络照抄即可
  //EnablePrivilege('SeDebugPrivilege', True);
  pdata := AllocMem(CIDefaultSize);
  try
    // 16是常量,即表明SystemInformationClass是Handle,获取系统所有句柄信息
    NtQuerySystemInformation(16, pdata, CIDefaultSize, Ret);
    
    if Ret > CIDefaultSize then
    begin
      ReallocMem(pdata, Ret);
      if pdata = nil then Exit;

      if NtQuerySystemInformation(16, pdata, Ret, Ret) <> 0 then Exit;
    end;

    pi := @pdata.Handles;
    for i := 0 to pdata.Count - 1 do
    begin
      if pi.ProcessID = PID then Inc(Result);
      Inc(pi);
    end;
  finally
    if pdata <> nil then FreeMem(pdata);
  end;
end;

  评论这张
 
阅读(1029)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017