如何枚举过程的句柄?【JAVA教程】

!
也想出现在这里? 联系我们
信息

如何枚举过程的句柄?,第1张

概述如何枚举过程的句柄

有什么办法如何枚举窗口给定的PID进程,并获得他所有打开的句柄(locking的文件等)的列表?

编辑:我不在乎语言。 如果是在.NET中,我会很高兴,如果在WinAPI(C)中,它不会受到伤害。 如果在别的地方,我想我可以重写它:-)

什么types的文件一旦手柄closures就自行删除?

有没有办法来检查(文件)句柄是否有效?

它是安全的/定义为假设一个windows伪句柄的值?

为什么使用带有标记为只读的文件的GetfileSizeEx()会出现“无效句柄”错误?

为什么在redirect输出时调整控制台缓冲区会引发无效句柄exception?

我做了一个深度的搜索,发现这篇文章 。 本文给出了一个链接, 下载源代码 :

我尝试了NtSystemInfoTest.cpp(下载的源代码)的方法,它的工作非常好。

voID ListHandles( DWORD processID,LPCTSTR lpFilter )

代码有以下免责声明:

// Written by Zoltan Csizmadia,zoltan_csizmadia@yahoo.com // For companIEs(Austin,TX): If you would like to get my resume,send an email. // // The source is free,but if you want to use it,mention my name and e-mail address // ////////////////////////////////////////////////////////////////////////////////////// //

我希望这可以帮助你。

如果你只是想要一个工具,Sysinternals的命令行“ Handle ”工具就可以做到这一点。 但是,如果你正在寻找一个代码解决方案,这将无济于事。

这里是一个使用DDK中的ZwqueryProcessinformation 的例子 。 DDK现在被称为“WDK”,可以在MSDN上使用。 如果你没有MSDN,你可以从这里得到它。

我没有尝试过,我只是Google了你的问题。

#include \”ntdll.h\” #include <stdlib.h> #include <stdio.h> #include \”ntddk.h\” #define DUPliCATE_SAME_ATTRIBUTES 0x00000004 #pragma comment(lib,\”ntdll.lib\”) BOol EnablePrivilege(PCSTR name) { TOKEN_PRIVILEGES priv = {1,{0,SE_PRIVILEGE_ENABLED}}; LookupPrivilegeValue(0,name,&priv.Privileges[0].LuID); HANDLE hToken; OpenProcesstoken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken); AdjustTokenPrivileges(hToken,FALSE,&priv,sizeof priv,0); BOol rv = GetLastError() == ERROR_SUCCESS; CloseHandle(hToken); return rv; } int main(int argc,char *argv[]) { if (argc == 1) return 0; ulONG pID = strtoul(argv[1],0); EnablePrivilege(SE_DEBUG_name); HANDLE hProcess = OpenProcess(PROCESS_DUP_HANDLE,pID); ulONG n = 0x1000; PulONG p = new ulONG[n]; while (NT::ZwquerySysteminformation(NT::SystemHandleinformation,p,n * sizeof *p,0) == STATUS_INFO_LENGTH_MISMATCH) delete [] p,p = new ulONG[n *= 2]; NT::PSYstem_HANDLE_informatION h = NT::PSYstem_HANDLE_informatION(p + 1); for (ulONG i = 0; i < *p; i++) { if (h[i].ProcessID == pID) { HANDLE hObject; if (NT::ZwDuplicateObject(hProcess,HANDLE(h[i].Handle),NtCurrentProcess(),&hObject,DUPliCATE_SAME_ATTRIBUTES) != STATUS_SUCCESS) continue; NT::OBJECT_BASIC_informatION obi; NT::ZwqueryObject(hObject,NT::ObjectBasicinformation,&obi,sizeof obi,&n); printf(\”%p %04hx %6lx %2x %3lx %3ld %4ld \”,h[i].Object,h[i].Handle,h[i].GrantedAccess,int(h[i].Flags),obi.Attributes,obi.HandleCount – 1,obi.PointerCount – 2); n = obi.TypeinformationLength + 2; NT::POBJECT_TYPE_informatION oti = NT::POBJECT_TYPE_informatION(new CHAR[n]); NT::ZwqueryObject(hObject,NT::ObjectTypeinformation,oti,n,&n); printf(\”%-14.*ws \”,oti[0].name.Length / 2,oti[0].name.Buffer); n = obi.nameinformationLength == 0 ? MAX_PATH * sizeof (WCHAR) : obi.nameinformationLength; NT::POBJECT_name_informatION oni = NT::POBJECT_name_informatION(new CHAR[n]); NTSTATUS rv = NT::ZwqueryObject(hObject,NT::Objectnameinformation,oni,&n); if (NT_SUCCESS(rv)) printf(\”%.*ws\”,oni[0].name.Length / 2,oni[0].name.Buffer); printf(\”n\”); CloseHandle(hObject); } } delete [] p; CloseHandle(hProcess); return 0; }

这是从Sysinternals论坛看起来像一个很好的答案: HOWTO:枚举句柄

总结

以上是内存溢出为你收集整理的如何枚举过程的句柄?全部内容,希望文章能够帮你解决如何枚举过程的句柄?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

© 版权声明
THE END
喜欢就支持一下吧
点赞173 分享
评论 抢沙发

请登录后发表评论

    请登录后查看评论内容