在一次注入使用命名管道进行进程间通讯的案例中
需要使用NtQueryObject遍历进程互斥锁情况,期间发现一个问题,NtQueryObject查询到管道时候会死锁,网上也有很多资料介绍NtQueryObject死锁的情况,不过解决方案不是很明确
这里记录下解决办法
在时候NtQueryObject打开进程关联句柄时,先使用CreateFileMapping假定创建文件句柄,如果创建成功,返回,当然假如需要获取信息的对象是File类型也不用返回,此次检测过的对象已经不会造成NtQueryObject死锁了。如果创建失败说明并非File,然后GetLastError(),若值为193,就返回,假如值不为193,并且CreateFileMapping失败,就可以进行NtQueryObject,此时对象已经排除了会让NtQueryObject死锁的对象。
我所需要检测的对象类型为Mutant
HANDLE m_hMapFile = CreateFileMapping(hHandle, NULL, PAGE_READONLY, 0, 1024, L"TestFileMap");
if (m_hMapFile)
{
CloseHandle(m_hMapFile);
continue;
}
else
if (GetLastError() == 193)
continue;
Status = NtQueryObject(hHandle, ObjectNameInformation, szName, 512, &dwFlags);
OK~完美解决类似NtQueryObject死锁情况。