当前位置: 首页 > article >正文

windows消息机制之HMIsMarkDestroy宏定义的理解


windows消息机制之HMIsMarkDestroy宏定义的理解

/*    windows/core/ntuser/inc/user.h:1658:#define HMIsMarkDestroy(p)      (HMPheFromObject(p)->bFlags & HANDLEF_DESTROY)
#define HMPheFromObject(p)      DBGHMPheFromObject((p))

#define HANDLEF_DESTROY        0x01
#define HANDLEF_INDESTROY      0x02
#define HANDLEF_MARKED_OK      0x10
#define HANDLEF_GRANTED        0x20
#define HANDLEF_POOL           0x40     // for the mother desktop window
#define HANDLEF_VALID          0x7F

/*
 * The following is a handle table entry.
 *
 * Note that by keeping a pointer to the owning entity (process or
 * thread), cleanup will touch only those objects that belong to
 * the entity being destroyed.  This helps keep the working set
 * size down.  Look at DestroyProcessesObjects() for an example.
 */
typedef struct _HANDLEENTRY {
    PHEAD       phead;                  /* pointer to the real object */
    KERNEL_PVOID pOwner;                 /* pointer to owning entity (pti or ppi) */
    BYTE        bType;                  /* type of object */
    BYTE        bFlags;                 /* flags - like destroy flag */
    WORD        wUniq;                  /* uniqueness count */

#if DBG || FRE_LOCK_RECORD
    PLR         plr;                    /* lock record pointer */
#endif // DBG

} HANDLEENTRY;

/*
 * Change HMINDEXBITS for bits that make up table index in handle
 * Change HMUNIQSHIFT for count of bits to shift uniqueness left.
 * Change HMUNIQBITS for bits that make up uniqueness.
 *
 * Currently 64K handles can be created, w/16 bits of uniqueness.
 */
#define HMINDEXBITS             0x0000FFFF      // bits where index is stored
#define HMUNIQSHIFT             16              // bits to shift uniqueness
#define HMUNIQBITS              0xFFFF          // valid uniqueness bits
        

#ifdef _USERK_
#define HMHandleFromIndex(i)    LongToHandle((LONG)(i) | ((LONG)gSharedInfo.aheList[i].wUniq << HMUNIQSHIFT))
#define HMObjectFlags(p)        (gahti[HMObjectType(p)].bObjectCreateFlags)
#endif

#define HMIndexFromHandle(h)    ((ULONG)(((ULONG_PTR)(h)) & HMINDEXBITS))                B部分:
#define _HMPheFromObject(p)      (&gSharedInfo.aheList[HMIndexFromHandle((((PHEAD)p)->h))])        A部分:    
#define _HMObjectFromHandle(h)  ((KERNEL_PVOID)(gSharedInfo.aheList[HMIndexFromHandle(h)].phead))
#define HMUniqFromHandle(h)     ((WORD)((((ULONG_PTR)h) >> HMUNIQSHIFT) & HMUNIQBITS))
#define HMObjectType(p)         (HMPheFromObject(p)->bType)

#define HMIsMarkDestroy(p)      (HMPheFromObject(p)->bFlags & HANDLEF_DESTROY)                C部分:

A部分解释:
#define _HMPheFromObject(p)      (&gSharedInfo.aheList[HMIndexFromHandle((((PHEAD)p)->h))])        A部分:    

typedef struct _THROBJHEAD {
    HEAD;
    PTHREADINFO pti;
} THROBJHEAD, * KPTR_MODIFIER PTHROBJHEAD;

typedef struct _DESKHEAD {
    PDESKTOP rpdesk;
    KPBYTE   pSelf;
} DESKHEAD, *PDESKHEAD;


typedef struct _THRDESKHEAD {
    THROBJHEAD;
    DESKHEAD;
} THRDESKHEAD, *PTHRDESKHEAD;

/*
 * The following is the header of all objects managed in the handle list.
 * (allocated as part of the object for easy access).  All object
 * headers must start with the members of a HEAD structure.
 */
typedef struct _HEAD {
    KHANDLE h;
    DWORD   cLockObj;
} HEAD, * KPTR_MODIFIER PHEAD;


B部分解释:


#define HMINDEXBITS             0x0000FFFF      // bits where index is stored
#define HMUNIQSHIFT             16              // bits to shift uniqueness
#define HMUNIQBITS              0xFFFF          // valid uniqueness bits
        

#ifdef _USERK_
#define HMHandleFromIndex(i)    LongToHandle((LONG)(i) | ((LONG)gSharedInfo.aheList[i].wUniq << HMUNIQSHIFT))
#define HMObjectFlags(p)        (gahti[HMObjectType(p)].bObjectCreateFlags)
#endif

#define HMIndexFromHandle(h)    ((ULONG)(((ULONG_PTR)(h)) & HMINDEXBITS))                B部分:

C部分解释:
#define HMIsMarkDestroy(p)      (HMPheFromObject(p)->bFlags & HANDLEF_DESTROY)                C部分:

参考数据结构D:
typedef struct tagSHAREDINFO {
    PSERVERINFO     psi;
    PHE             aheList;         /* handle table pointer                */
    PDISPLAYINFO    pDispInfo;       /* global displayinfo                  */
    KERNEL_UINT_PTR ulSharedDelta;   /* delta between client and kernel mapping of ...*/
                                     /* shared memory section. Only valid/used in client.*/

    WNDMSG          awmControl[FNID_END - FNID_START + 1];

    WNDMSG          DefWindowMsgs;
    WNDMSG          DefWindowSpecMsgs;
} SHAREDINFO, *PSHAREDINFO;

extern SHAREDINFO gSharedInfo;

参考数据结构E:
typedef struct tagWND {
    THRDESKHEAD   head;

    WW;         // WOW-USER common fields. Defined in wowuserp.h
                // The presence of "state" at the start of this structure is
                // assumed by the STATEOFFSET macro.

    PWND                 spwndNext;    // Handle to the next window
    PWND                 spwndPrev;    // Handle to the previous window
    PWND                 spwndParent;  // Backpointer to the parent window.
    PWND                 spwndChild;   // Handle to child
    PWND                 spwndOwner;   // Popup window owner field

    RECT                 rcWindow;     // Window outer rectangle
    RECT                 rcClient;     // Client rectangle

    WNDPROC_PWND         lpfnWndProc;  // Can be WOW address or standard address

    PCLS                 pcls;         // Pointer to window class

    KHRGN                hrgnUpdate;   // Accumulated paint region

    PPROPLIST            ppropList;    // Pointer to property list
    PSBINFO              pSBInfo;      // Words used for scrolling

    PMENU                spmenuSys;    // Handle to system menu
    PMENU                spmenu;       // Menu handle or ID

    KHRGN                hrgnClip;     // Clipping region for this window

    LARGE_UNICODE_STRING strName;
    int                  cbwndExtra;   // Extra bytes in window
    PWND                 spwndLastActive; // Last active in owner/ownee list
    KHIMC                hImc;         // Associated input context handle
    KERNEL_ULONG_PTR     dwUserData;   // Reserved for random application data
    struct _ACTIVATION_CONTEXT  * KPTR_MODIFIER pActCtx;
} WND;

typedef struct tagWND               * KPTR_MODIFIER PWND;


typedef struct _HANDLEENTRY         * KPTR_MODIFIER PHE;


http://www.kler.cn/a/281681.html

相关文章:

  • c语言——数组
  • 基于my Batis优化图书管理系统(一)
  • FastAdmin 和 Dcat Admin从使用场景、适合人群、使用成本、资源完善程度、bug 解决、安全性全方位解析
  • go 系列实现websocket
  • 【数据结构-前缀异或和】力扣1371. 每个元音包含偶数次的最长子字符串
  • C#过 SemaphoreSlim 实现高效的数据库并发控制和资源管理(多线程)
  • 鸿蒙HSP,HAP,HAR
  • 基于matlab的深度学习案例及基础知识专栏前言
  • 基于imx6ull平台opencv的图像采集和显示屏LCD显示功能(不带Qt界面)
  • Android JNI开发:System.loadLibrary加载机制
  • Kubernetes:解决命名空间无法正常删除问题 —— 清空 Finalizers 字段的方法步骤
  • XDMA原理
  • beforeEach中addRoutes后使用next()无法访问,路由未生效,刷新页面白屏,使用next({ ...to, replace: true })
  • 书生大模型实战营(第3期)进阶岛第二关--Lagent 自定义你的 Agent 智能体
  • 笔记小结:《利用python进行数据分析》之使用pandas和seaborn绘图
  • AList嵌入动态验证码实现动态校验
  • Apache Flink内存模型
  • 算法:双指针
  • CMakeLists.txt文件编写详解
  • CF E. Best Pair