使用
/* DWORD     NtQuerySystemInformation(     DWORD     dwRecordType,
                            PDWORD     pdwHandleList,  
                            DWORD     dwNumBytes,
                           PDWORD     pdwNumBytesRet     );  
已经正确取得 pdwhandlelist 但是如何根据这块内存找到 系统的内核句柄呢?(象procexp一样)
网上的资料看得我好晕啊

解决方案 »

  1.   

    缓冲区开始是ULONG句柄个数,后面是一列这样的结构
    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;
      

  2.   

    谢谢你的关注 
      一旦NtQuerySystemInformation函数调用成功,系统中所有的句柄将被存放在pdwHandleList所指向内存空间中,其中,pdwHandleList所指向的第一个32位数,是这个buf所包含的句柄数量,之后是顺序排列的句柄指针pHandleInfo,指向的是HANDLEINFO结构:   
    请问 pHandleInfo 这个如何取啊?
    还有句柄的名子如何在你的结构里显示呢》
      

  3.   

    PSYSTEM_HANDLE_INFORMATION HandleInfo=(PSYSTEM_HANDLE_INFORMATION)((PULONG)pdwHandleList+1)
    句柄只有数值没有名字
      

  4.   

    那么procexp 是如何 显示句柄的名字的能???
      

  5.   

    那不是句柄的名字,是对象的名字
    用NtQueryObject
      

  6.   

    谢谢提醒啊
    又要用 loadlibrary了
    msdn 中
    NTSTATUS NtQueryObject(
      __in_opt   HANDLE Handle,
      __in       OBJECT_INFORMATION_CLASS ObjectInformationClass,
      __out_opt  PVOID ObjectInformation,
      __in       ULONG ObjectInformationLength,
      __out_opt  PULONG ReturnLength
    );
    OBJECT_INFORMATION_CLASS这个结构如果想找对象的名字 结构应该是
    typedef struct _OBJECT_NAME_INFORMATION {UNICODE_STRING Name; WCHAR NameBuffer[0];} OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
    不知对吗
      

  7.   

    太谢谢你了 
    我还要好好学习一下windows 内核分析啊
    在google里看到一个undocumented.ntinternals.net网站 挺好的都是undocumented的函数
    希望对你有用!
    圣诞快乐: )