当前位置: 代码迷 >> 综合 >> 2015.07.02-IPC对象释放失败
  详细解决方案

2015.07.02-IPC对象释放失败

热度:76   发布时间:2024-01-20 12:17:26.0
【问题现象】
任务测试完成后释放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);


  相关解决方案