同上

解决方案 »

  1.   

    http://vip.6to23.com/NowCan1/tech/fport.htm
    这里面有取得系统所有句柄的方法,但是好像和要求不太一样啊。
    http://expert.csdn.net/Expert/topic/1204/1204194.xml?temp=.4880792
    请关注此题。
      

  2.   

    不知道你要什么句柄?一般来说:一个进程有多个thread
    每个thread都可以通过内部的数据结构枚举出所有的HWND文件句柄,端口可以通过NtQueryxxxxx搞定。
      

  3.   

    《window nt/2000本机api参考手册》中有例子,不过需要调整才能编译。
    整理如下(其实我并不懂里面的含义):
    #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;
    }
      

  4.   

    9X平台的我搞定了,现在就是一个问题,我在W2K下将QQ进程内的伪句柄复制出来以后查询它的SOCKET时候就非法操作,在9X没问题。请问那位有TDI的资料来参考一下。