概述如何枚举过程的句柄?
有什么办法如何枚举窗口给定的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:枚举句柄
总结
以上是内存溢出为你收集整理的如何枚举过程的句柄?全部内容,希望文章能够帮你解决如何枚举过程的句柄?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
请登录后查看评论内容