【问题现象】
任务测试完成后释放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 1
typedef 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);