WaitForSingleObject()多久判断一次是否有信号

来源:百度知道 编辑:UC知道 时间:2024/06/10 22:36:02

本质上还是有时间概念的,只是被MS给藏起来了。说到底就是个do while(true)循环.满足条件了就goto跳出。
WaitForSingleObject是kernel32.dll的导出函数,dasm下看到WaitForSingleObject又调用了ntdll.dll的NtWaitForSingleObject.
NtWaitForSingleObject又调用了KeWaitForSingleObject
以下是KeWaitForSingleObject的部分实现代码。(以上部分为原创,代码部分为转贴。)
do
{
WaitStatus = CurrentThread->WaitStatus;
CurrentThread->WaitBlockList = WaitBlock = &CurrentThread->WaitBlock[0];
CurrentObject = (PDISPATCHER_HEADER)Object;

if (KiIsObjectSignaled(CurrentObject, CurrentThread))
{
if (CurrentObject->SignalState != MINLONG)
{
KiSatisfyObjectWait(CurrentObject, CurrentThread);
Status = STATUS_WAIT_0;
goto WaitDone;

}
else
{
if (CurrentObject->Type == MutantObject)
{
KeReleaseDispatcherDatabaseLock(CurrentThread->WaitIrql);
ExRaiseStatus(STATUS_MUTANT_LIMIT_EXCEEDED);
}
}
}

WaitBlock