精华内容
下载资源
问答
  • 2018-04-20 11:17:00

    有两种方法。

    第一种:(此方法需要提升权限)

    type
      TGetProcessHandleCount = function (hProcess: THandle; var pdwHandleCount: DWORD): LongBool; stdcall;
    var
      _GetProcessHandleCount: TGetProcessHandleCount;
    
    // 获取API地址, 建议放在 initialization 段中
    _GetProcessHandleCount := GetProcAddress(GetModuleHandle(kernel32), 'GetProcessHandleCount');
    
    // 使用API获取句柄数
    function GetProcessHandleCount(PID: Cardinal): Cardinal;
    var
      hProcess: THandle;
    begin
      Result := 0;
      if Assigned(_GetProcessHandleCount) then begin
        hProcess := OpenProcess(PROCESS_ALL_ACCESS, False, PID);
        if hProcess <> 0 then begin
          _GetProcessHandleCount(hProcess, Result);
          CloseHandle(hProcess);
        end;
      end;
    end;

     提升权限的代码:

    function EnablePrivilege(PrivName: string; bEnable: Boolean): Boolean;
    var
      TP: PTokenPrivileges;
      Dummy: Cardinal;
      hToken: THandle;
    begin
      Result := False;
      if OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
      begin
        GetMem(TP, SizeOf(DWORD) + SizeOf(TLUIDAndAttributes));
        try
          TP.PrivilegeCount := 1;
          if LookupPrivilegeValue(nil, PChar(PrivName), TP.Privileges[0].Luid) then begin
            if bEnable then
              TP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
            else
              TP.Privileges[0].Attributes := 0;
            Result := AdjustTokenPrivileges(hToken, False, TP^, SizeOf(TP), nil, Dummy);
          end else
            Result := False;
        finally
          FreeMem(TP);
          CloseHandle(hToken);
        end;
      end;
    end;
    EnablePrivilege('SeDebugPrivilege', True);  // 提升权限

     

    Minimum supported client

    Windows Vista, Windows XP with SP1 [desktop apps only]

    Minimum supported server

    Windows Server 2003 [desktop apps only]

     

     第二种: (直接查询信息,不需要提升权限)

    type
      TSystemHandleInformationsBuffer = packed record
        NumberOfHandles: LongWord;
        SystemHandleInformations: array[0..MAX_LENGTH-1] of TSystemHandleInformation;
      end;
    
    var
      FLocker: TCriticalSection;
      HandleInfoBuffer: Pointer;
      
    function GetProcessHandleCount(PID: Cardinal): Cardinal;
    var
      returnSize: Cardinal;
      p, p1: PAnsiChar;
    begin
      P := HandleInfoBuffer;
      FLocker.Enter;
      Result := NtQuerySystemInformation(Cardinal(SystemHandleInformation),
        P, SizeOf(TSystemHandleInformationsBuffer), returnSize);
      if Result = 0 then begin
        returnSize := PLongWord(P)^;
        Inc(P, 4);
        p1 := p + returnSize * SizeOf(TSystemHandleInformation);
        while(p < p1) do begin
          if (PSystemHandleInformation(P)^.ProcessId = PID) then
            Inc(Result);
          Inc(P, SizeOf(TSystemHandleInformation));
        end;
      end else
        Result := 0;   
      FLocker.Leave;
    end;

    相关声明

    type
      TNtQuerySystemInformation = function(infoClass: DWORD; buffer: Pointer; bufSize: DWORD;
        var returnSize: Dword): DWORD; stdcall;
      TNtQueryInformationProcess = function (ProcessHandle: Cardinal;
        ProcessInformationClass: PROCESSINFOCLASS; ProcessInformation: Pointer;
        ProcessInformationLength: ULONG; ReturnLength: PULONG): NTSTATUS; stdcall;
    
    var
      _NtQuerySystemInformation: TNtQuerySystemInformation;
      _NtQueryInformationProcess: TNtQueryInformationProcess;
    
    function NtQuerySystemInformation(infoClass: DWORD; buffer: Pointer; bufSize: DWORD;
      var returnSize: Dword): DWORD;
    begin
      if not Assigned(_NtQuerySystemInformation) then
        Result := 0
      else
        Result := _NtQuerySystemInformation(infoClass, buffer, bufSize, returnSize);
    end;
    
    function NtQueryInformationProcess(ProcessHandle: Cardinal;
        ProcessInformationClass: PROCESSINFOCLASS; ProcessInformation: Pointer;
        ProcessInformationLength: ULONG; ReturnLength: PULONG): NTSTATUS;
    begin
      if not Assigned(_NtQueryInformationProcess) then
        Result := 0
      else
        Result := _NtQueryInformationProcess(ProcessHandle, ProcessInformationClass,
          ProcessInformation, ProcessInformationLength, ReturnLength);
    end;
    
    initialization
      FLocker := TCriticalSection.Create;
      HandleInfoBuffer := GetMemory(SizeOf(TSystemHandleInformationsBuffer));
      _NtQuerySystemInformation := GetProcAddress(GetModuleHandle('ntdll.dll'), 'NtQuerySystemInformation');
      _NtQueryInformationProcess := GetProcAddress(GetModuleHandle('ntdll.dll'), 'NtQueryInformationProcess');
    
    finalization
      FLocker.Free;
      FreeMemory(HandleInfoBuffer);

     

    转载于:https://www.cnblogs.com/yangyxd/articles/8889215.html

    更多相关内容
  • GDIProcessHandleQuota项设置GDI句柄数量,默认值为2710(16进制)/10000(10进制),该值的允许范围为 256 ~ 16384 ,如果系统配置的内存为2G或更多,不妨将其设置为允许的最大值 16384(10进制); ...

     

    设置

    1. GDIProcessHandleQuota项设置GDI句柄数量,默认值为2710(16进制)/10000(10进制),该值的允许范围为 256 ~ 16384 ,如果系统配置的内存为2G或更多,不妨将其设置为允许的最大值 16384(10进制);
    2. USERProcessHandleQuota项设置用户句柄数量,默认值为2710(16进制)/10000(10进制),该值的允许范围为 200 ~ 18000 ,对于具有2GB或更多物理内存的系统,不妨将用户句柄数直接设置为上限 18000(10进制);

     

    转载于:https://www.cnblogs.com/JuliaLiu/p/11237495.html

    展开全文
  • Windows 10查看进程句柄数量

    千次阅读 2020-08-10 14:23:01
  • 我使用了一个股票网站服务器提供的API接口,向该网站API发送指令后,服务器会与我的电脑建立UDP连接,同时在...同时我也没在windows7的进程管理中找出是哪个进程在我的电脑里写入文件。 请问有什么办法能解决该问题?
  • 得到指定进程所占用的句柄数handle_NtQueryInformationProcess第二个参数为20.zip
  • 查看进程占用的句柄数

    万次阅读 2018-04-01 14:56:49
    1、每个进程所能占用的句柄数是有上限的,如果程序打开文件、socket等,但是不关闭,并且频繁的做这样的操作,那么可能导致进程占用的句柄数超过显示,程序会异常崩溃,或产生打不开文件、socket的操作。2、linux下...

    1、每个进程所能占用的句柄数是有上限的,如果程序打开文件、socket等,但是不关闭,并且频繁的做这样的操作,那么可能导致进程占用的句柄数超过显示,程序会异常崩溃,或产生打不开文件、socket的操作。

    2、linux下查看进程占用句柄数: ls -l /proc/进程ID/fd | wc -l

    3、win7查看占用句柄数:

    任务管理器--进程---查看--选择列,勾选句柄。则可见下图:


    展开全文
  • 程序主要功能是:输入进程pid,对该pid进程进行所占物理内存、句柄数、线程数、GDI数等增长情况进行监控,并将数据保存txt文件,便于事后分析,主要应用与开发过程中监控内存泄漏等
  • Windows进程中的句柄

    2020-12-12 16:40:10
    1 Windows进程中的句柄句柄是一个对象引用,同一个对象在不同的环境下可能有不同的引用(句柄)值。句柄仅在一个进程范围内有效。 HANDLE_TABLE 结构的定义: typedef struct _HANDLE_TABLE { ULONG_PTR ...
  • 紧接上文,接下来就是获取进程的句柄数,句柄就是windows进程中各种对象的标识,一般应用程序会通过句柄来执行各种操作,通过监控设备的句柄,我们可以大致判断出进程是否存在异常,比如句柄泄漏,会导致系统卡顿,...
  • linux下查看系统进程占用的句柄数方法---查看系统默认的最大文件句柄数,系统默认是1024# ulimit -n1024----查看当前进程打开了多少句柄数# lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more131 2420457 ...
  • windows进程能打开的最大句柄数目

    千次阅读 2013-02-20 15:21:20
    最近一个服务程序在长时间运行中句柄不断上涨,最高达到...下面是关于进程句柄的一些细节。 1:一个windows进程最多有1600万个句柄,这是理论上的; 2:句柄表是从系统的换页内存池中分配的,所以在未达到1600万的
  • 句柄实际是一个索引,指向进程句柄表中的一个表项。 EPROCESS->ObjectTable 第一个是4,第二个是8...... 句柄表示一个多层次结构。 ObjectTable类型为HANDLE_TABLE,句柄结构为HANDLE_TABLE_ENTRY。 对于一...
  • Windows关于文件句柄数的限制

    千次阅读 2019-07-26 01:29:38
    Windows对一个进程打开的文件句柄数量限制一般为512,可以通过_setmaxstdio()来修改,_getmaxstdio()来获取。 1 #include <stdio.h> 2 3 int main() 4 { 5 _setmaxstdio(100); 6 _getmaxstdio();//...
  • 在做网银爬虫时用swt处理密码控件,做成web服务供外部调用,时间一长总会跪掉,控制台显示org.eclipse.swt.SWTError no more handles然后java进程就没了,这个错误,注意是错误,不是异常!!!翻译过来就是句柄用完了...
  • Windows 查看句柄占用情况

    千次阅读 2020-08-14 10:30:18
    Windows 查看句柄占用情况的工具有哪些呢? 很多时候我们定位问题都涉及到文件本占用的情况,然而我们又无法确定到底是哪个进程占用了这个文件。 下面我们来推荐查看句柄占用的两种方法: 1.系统工具 resmon....
  • 在 Linux 平台上运行的进程都会从系统...本文主要介绍Linux下如何查看和修改进程打开的文件句柄数,避免这类问题的发生。句柄介绍句柄的介绍及应用句柄是在 Windows 中引入的一个概念,它是和对象一一对应的 32 位无...
  • import pyautogui import win32con import win32gui import win32clipboard import os if __name__== "__main__": #输入窗口标题 ... #窗口句柄 print (handel) app = win32gui.GetWindowText(handel.
  • windows本身并没有提供直接获取进程CPU使用率的函数,但我们可以根据进程的计时信息来间接计算出进程的瞬时CPU占用: 1)记录进程当前在用户模式和内核模式下已经执行的时间; 2)1s后,再次记录进程在用户模式和...
  • 在linux系统中,进程打开的文件句柄数量的限制,可用ulimit命令来查看和修改,或者修改/etc/security/limits.conf也可以修改。但在windows中,目前没有找到方便的方法查看这个值。 下面这段代码可以用来查看该值,...
  • Windows句柄数的限制

    千次阅读 2008-05-09 11:02:00
    最近发现以前写的部分程序存在句柄数不断增加,系统运行一段时间后就会出现问题检查发现这是由于创建线程完成以后没有调用CloseHandle,导致句柄数量不断增加,而操作系统对句柄最大数量是有限制的,经测试,在...
  • Windows句柄剖析

    2021-12-16 09:18:26
    Windows句柄的前生今世:句柄剖析
  • //进程信息采集 #pragma once //枚举进程 typedef BOOL(_stdcall *ENUMPROCESS)( DWORD *pProcessIds, //指向进程ID数组链 DWORD cb, //ID数组的大小,用字节计数 DWORD *pBytesReturned //返回的字...
  • int GetProcessThreadList(DWORD th32ProcessID) //进程bai的duID { HANDLE hThreadSnap; THREADENTRY32 th32; hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, th32ProcessID); if (hThreadSnap ==...
  • win10任务管理器中查看进程句柄

    千次阅读 2020-01-01 13:45:29
    与之前的在菜单栏-查看里面设置 选择列 不同,win10的“选择列”要在 “详细信息”这里,在列表头 那里 右键弹出菜单栏,里面有“选择列”,然后单击“选择列”,就可以在弹出的对话框中选中 “句柄” ,然后“详细...
  • 摘要:VC/C++源码,系统相关,进程管理器 本例将学习Windows系统进程管理器的开发,获取Windows进程:VC++进程管理器,通过设置List控件的表格扩展属性,可以显示进程映像名称、进程开启的线程、PID、优先级;...
  • 由于.NET类库对系统底层对象进行了封装,我们也不需要调用Windows API来操作非托管对象。但不直接操作非托管对象,并不意味着程序不会间接创建这些对象,如果不了解.NET对象与非托管资源的关系,我们很有可能因为不...
  • windows文件句柄修改

    千次阅读 2014-01-07 09:39:46
    找到如下注册表分支: ... – – – Windows NT  – – – – CurrentVersion  – – – – – Windows  在右侧窗格中可以看到名为“GDIProcessHandleQuota”与“USERProcessHandleQuota”的注册表项;
  • 1. 查询进程号 (charge_car_charing: 我运行的jar包名) ps aux | grep charge_car_charing 查询到进程号为:2555564 2. 查询该进程的线程数量: (2555564 :就是上面查询的进程号) cat /proc/2555564/status...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 40,262
精华内容 16,104
关键字:

windows进程句柄数