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;