【问题现象】
任务测试完成后释放MUTEX和EVENT失败。
【定位过程】
增加打印发现释放时Pool ID值为1023,但释放前对象有效性判断已通过,表明有效性判断Pool ID正确。排查代码发现调用CORE_PoolFreeBlock前已将对象HANDLE的值设置为无效,导致通过对象HANDLE取Pool ID出错。
任务测试完成后释放MUTEX和EVENT失败。
【定位过程】
释放对象时发现所释放对象的Pool ID不正确而无法释放,Pool ID属于对象HANDLE成员中的b11:20
#define OBJECT_SID_BITS 11
#define OBJECT_PID_BITS 10
#define OBJECT_TID_BITS 3
#define OBJECT_CID_BITS 5
#define OBJECT_STS_BITS 2
#define OBJECT_USR_BITS 1typedef struct tagHANDLE_BITS{HANDLE ObjectSid: OBJECT_SID_BITS; /**< Object sn */HANDLE ObjectPid: OBJECT_PID_BITS; /**< Pool id */HANDLE ObjectTid: OBJECT_TID_BITS; /**< Table id */HANDLE ObjectCid: OBJECT_CID_BITS; /**< Class id */HANDLE ObjectState: OBJECT_STS_BITS; /**< Object state*/HANDLE ObjectUser: OBJECT_USR_BITS;
}HANDLE_BITS;
struct tagKOBJECT_HEADER{union{HANDLE_BITS Bits;HANDLE Handle;}uh;LIST_HEAD HashNode;union{CHAR caName[OBJECT_NAME_MAX];DWORD daName[OBJECT_NAME_MAX/sizeof(DWORD)];DWORD daMagic[OBJECT_NAME_MAX/sizeof(DWORD)];}un;
};
增加打印发现释放时Pool ID值为1023,但释放前对象有效性判断已通过,表明有效性判断Pool ID正确。排查代码发现调用CORE_PoolFreeBlock前已将对象HANDLE的值设置为无效,导致通过对象HANDLE取Pool ID出错。
【问题原因】
KOBJECT_HEADER::uh.Handle 在释放前被置无效,释放时通过该Handle获得的Pool ID也无效。
【解决方案】
先取Pool ID 再置对象句柄无效。
Pid = GetObjectPid(lpHeader);SetObjectHandle(lpHeader, INVALID_HANDLE_VALUE);DetachObject(lpHeader);return CORE_PoolFreeBlock(lpManager, Pid);