概述
WaitForSingleObject 是 kernel32.dll 的导出函数,WaitForSingleObject 调用了ntdll.dll 的 NtWaitForSingleObject.
NtWaitForSingleObject 又调用了 KeWaitForSingleObject
WaitForSingleObject -> NtWaitForSingleObject -> KeWaitForSingleObject
以下是KeWaitForSingleObject的部分实现代码。
[Copy to clipboard]
CODE:
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->Object = CurrentObject;
WaitBlock->Thread = CurrentThread;
WaitBlock->WaitKey = (USHORT)(STATUS_WAIT_0);
WaitBlock->WaitType = WaitAny;
WaitBlock->NextWaitBlock = NULL;
KiCheckAlertability(Alertable, CurrentThread, WaitMode, &Status);
CurrentThread->WaitStatus = Status;
if (Timeout != NULL)
{
//略.有超时设置的情况
}
InsertTailList(&CurrentObject->WaitListHead, &WaitBlock->WaitListEntry);
if (CurrentThread->Queue)
{
DPRINT("Waking Queue/n");
KiWakeQueue(CurrentThread->Queue);
}
PsBlockThread(&Status, Alertable, WaitMode, (UCHAR)WaitReason);
if (Status != STATUS_KERNEL_APC)
{
return Status;
}
DPRINT("Looping Again/n");
CurrentThread->WaitIrql = KeAcquireDispatcherDatabaseLock();
}while (TRUE);
WaitDone:
转载自:
http://www.vbgood.com/viewthread.php?tid=76711
{
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->Object = CurrentObject;
WaitBlock->Thread = CurrentThread;
WaitBlock->WaitKey = (USHORT)(STATUS_WAIT_0);
WaitBlock->WaitType = WaitAny;
WaitBlock->NextWaitBlock = NULL;
KiCheckAlertability(Alertable, CurrentThread, WaitMode, &Status);
CurrentThread->WaitStatus = Status;
if (Timeout != NULL)
{
//略.有超时设置的情况
}
InsertTailList(&CurrentObject->WaitListHead, &WaitBlock->WaitListEntry);
if (CurrentThread->Queue)
{
DPRINT("Waking Queue/n");
KiWakeQueue(CurrentThread->Queue);
}
PsBlockThread(&Status, Alertable, WaitMode, (UCHAR)WaitReason);
if (Status != STATUS_KERNEL_APC)
{
return Status;
}
DPRINT("Looping Again/n");
CurrentThread->WaitIrql = KeAcquireDispatcherDatabaseLock();
}while (TRUE);
WaitDone:
最后
以上就是端庄哈密瓜为你收集整理的WaitForSingleObject 的内部实现原理的全部内容,希望文章能够帮你解决WaitForSingleObject 的内部实现原理所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复