同上
解决方案 »
- vc调试中的LINK错误怎么解决呢
- 如何获取正在运行中的程序的edit控件中的数值
- Visual C++ 编程词典软件体验版,功能就能用一点。图标如图所示。
- onItemexpanding和onselecting和onselected有什么区别?
- 请问谁有GameHigh游戏平台的源码,能不能发给我一份啊!
- 如何编写ADSL拨号(PPPOE)程序?
- "我用vfw方式捕获到了视频图象"请问vfw是指什么?
- 关于CMU PIE人脸数据集
- 请问:哪有win32 console application程序?
- 技术要求;了解Unicode,没有代码,只凭想象
- C++类大小怎样计算?
- 急!急!急!用vc如何把数据库中的jpeg文件读出并在视图中显示出来?
这里面有取得系统所有句柄的方法,但是好像和要求不太一样啊。
http://expert.csdn.net/Expert/topic/1204/1204194.xml?temp=.4880792
请关注此题。
每个thread都可以通过内部的数据结构枚举出所有的HWND文件句柄,端口可以通过NtQueryxxxxx搞定。
整理如下(其实我并不懂里面的含义):
#pragma warning(disable:4786)//identifier was truncated in the debug info#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <vector>
#include <map>#define SystemHandleInformation 16
#define SystemObjectInformation 17typedef DWORD (__stdcall *PFNNTQUERYSYSTEMINFORMATION) (DWORD, PVOID, DWORD, PDWORD);typedef struct _UNICODE_STRING
{
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING, *PUNICODE_STRING;
typedef enum _POOL_TYPE {
NonPagedPool,
PagedPool,
NonPagedPoolMustSucceed,
DontUseThisType,
NonPagedPoolCacheAligned,
PagedPoolCacheAligned,
NonPagedPoolCacheAlignedMustS,
MaxPoolType,
NonPagedPoolSession =32,
PagedPoolSession,
NonPagedPoolMustSucceedSession,
DontUseThisTypeSession,
NonPagedPoolCacheAlignedSession,
PagedPoolCacheAlignedSession,
NonPagedPoolCacheAlignedMustSSession
}POOL_TYPE;typedef struct _SYSTEM_OBJECT_TYPE_INFORMATION {//Information Class 17
ULONG NextEntryOffset;
ULONG ObjectCount;
ULONG HandleCount;
ULONG TypeNumber;
ULONG InvalidAttributes;
GENERIC_MAPPING GenericMapping;
ACCESS_MASK ValidAccessMask;
POOL_TYPE PoolType;
UCHAR Unknown;
UNICODE_STRING Name;
}SYSTEM_OBJECT_TYPE_INFORMATION,*PSYSTEM_OBJECT_TYPE_INFORMATION;
typedef struct _SYSTEM_OBJECT_INFORMATION {
ULONG NextEntryOffset;
PVOID Object;
ULONG CreatorProcessId;
USHORT Unknown;
USHORT Flags;
ULONG PointerCount;
ULONG HandleCount;
ULONG PagedPoolUsage;
ULONG NonPagedPoolUsage;
ULONG ExclusiveProcessId;
PSECURITY_DESCRIPTOR SecurityDescriptor;
UNICODE_STRING Name;
}SYSTEM_OBJECT_INFORMATION,*PSYSTEM_OBJECT_INFORMATION;#define STATUS_INFO_LENGTH_MISMATCH 0xc0000004
PFNNTQUERYSYSTEMINFORMATION ZwQuerySystemInformation;class globe {
public:
globe()
{
HINSTANCE hNtDll =LoadLibrary("NTDLL.DLL");
ZwQuerySystemInformation = (PFNNTQUERYSYSTEMINFORMATION )GetProcAddress(hNtDll,"NtQuerySystemInformation");
}
~globe(){};
};
globe a;
typedef struct _SYSTEM_HANDLE_INFORMATION {//Information Class 16
ULONG ProcessId;
UCHAR ObjectTypeNumber;
UCHAR Flags;//0x01 =PROTECT_FROM_CLOSE,0x02 =INHERIT
USHORT Handle;
PVOID Object;
ACCESS_MASK GrantedAccess;
}SYSTEM_HANDLE_INFORMATION,*PSYSTEM_HANDLE_INFORMATION;typedef std::map<ULONG,PSYSTEM_OBJECT_TYPE_INFORMATION,std::less<ULONG> > type_map;
typedef std::map<PVOID,PSYSTEM_OBJECT_INFORMATION,std::less<PVOID> > object_map;struct OBJECTS_AND_TYPES {
type_map types;
object_map objects;
};
std::vector<SYSTEM_HANDLE_INFORMATION> GetHandles()
{
ULONG n;
PULONG p =new ULONG [n =0x1000 ];
memset((void*)p,0,4*n); while (ZwQuerySystemInformation(SystemHandleInformation,p,n *sizeof *p,0)==0xc0000004)
{
delete[] p;
p=new ULONG[n*=2];
memset((void*)p,0,4*n);
} PSYSTEM_HANDLE_INFORMATION h =PSYSTEM_HANDLE_INFORMATION(p +1);
return std::vector<SYSTEM_HANDLE_INFORMATION>(h,h +*p);
}OBJECTS_AND_TYPES oats;void GetObjectsAndTypes()
{
ULONG n;
PCHAR p =new CHAR [n =0x2000 ];
memset(p,0,n);
while (ZwQuerySystemInformation(SystemObjectInformation,p,n *sizeof *p,0)==STATUS_INFO_LENGTH_MISMATCH)
{
delete[] p;
p=new CHAR [n *=2 ];
memset(p,0,n);
} for (PSYSTEM_OBJECT_TYPE_INFORMATION t =PSYSTEM_OBJECT_TYPE_INFORMATION(p);;t =PSYSTEM_OBJECT_TYPE_INFORMATION(p +t->NextEntryOffset))
{
oats.types [t->TypeNumber ] =t;
for (PSYSTEM_OBJECT_INFORMATION o =PSYSTEM_OBJECT_INFORMATION(PCHAR(t->Name.Buffer) +t->Name.MaximumLength);;o =PSYSTEM_OBJECT_INFORMATION(p +o->NextEntryOffset))
{
oats.objects [o->Object ] =o;
if (o->NextEntryOffset ==0)
break;
}
if (t->NextEntryOffset ==0)
break;
}
return ;
}int main(int argc,char *argv [])
{
ULONG pid =GetCurrentProcessId();//strtoul(argv [1 ],0,0);
if (argc ==2 )
pid =strtoul(argv [1],0,0);
int count = 0; GetObjectsAndTypes(); std::vector<SYSTEM_HANDLE_INFORMATION > handles =GetHandles();
SYSTEM_OBJECT_INFORMATION defobj ={0};
SYSTEM_OBJECT_TYPE_INFORMATION deftype = {0};
printf("Object Hnd Access Fl Atr #H #P Type Name \n");
for (std::vector<SYSTEM_HANDLE_INFORMATION>::iterator h =handles.begin();h !=handles.end();h++){
if (h->ProcessId ==pid){
PSYSTEM_OBJECT_TYPE_INFORMATION t =oats.types [h->ObjectTypeNumber ];
PSYSTEM_OBJECT_INFORMATION o =oats.objects [h->Object ];
if (o ==0)
o =&defobj;
if( t == 0)
t = &deftype;
printf("%p %04x %6lx %2x %3hx %2ld %2ld %4ld %S \n",
h->Object,h->Handle,h->GrantedAccess,int(h->Flags),
o->Flags,o->HandleCount,o->PointerCount,
t->Name.Length,t->Name.Buffer==NULL?L"":t->Name.Buffer);
count ++;
}
} printf("\nTotal handle : %d\n",count); return 0;
}