VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 5753|回复: 0

WaitForSingleObject 的内部实现原理

[复制链接]
 楼主| 发表于 2008-11-6 11:02:33 | 显示全部楼层 |阅读模式
WaitForSingleObject 是 kernel32.dll 的导出函数,WaitForSingleObject 调用了ntdll.dll 的 NtWaitForSingleObject.
NtWaitForSingleObject 又调用了 KeWaitForSingleObject

WaitForSingleObject -> NtWaitForSingleObject -> KeWaitForSingleObject

以下是KeWaitForSingleObject的部分实现代码。

  1. do
  2. {
  3.         WaitStatus = CurrentThread->WaitStatus;
  4.         CurrentThread->WaitBlockList = WaitBlock = &CurrentThread->WaitBlock[0];
  5.         CurrentObject = (PDISPATCHER_HEADER)Object;

  6.         if (KiIsObjectSignaled(CurrentObject, CurrentThread))
  7.         {
  8.                 if (CurrentObject->SignalState != MINLONG)
  9.                 {
  10.                         KiSatisfyObjectWait(CurrentObject, CurrentThread);
  11.                         Status = STATUS_WAIT_0;
  12.                         goto WaitDone;
  13.                 }
  14.                 else
  15.                 {
  16.                         if (CurrentObject->Type == MutantObject)
  17.                         {
  18.                                 KeReleaseDispatcherDatabaseLock(CurrentThread->WaitIrql);
  19.                                 ExRaiseStatus(STATUS_MUTANT_LIMIT_EXCEEDED);
  20.                         }
  21.                 }
  22.         }

  23.         WaitBlock->Object = CurrentObject;
  24.         WaitBlock->Thread = CurrentThread;
  25.         WaitBlock->WaitKey = (USHORT)(STATUS_WAIT_0);
  26.         WaitBlock->WaitType = WaitAny;
  27.         WaitBlock->NextWaitBlock = NULL;

  28.         KiCheckAlertability(Alertable, CurrentThread, WaitMode, &Status);

  29.         CurrentThread->WaitStatus = Status;

  30.         if (Timeout != NULL)
  31.         {
  32.                 //略.有超时设置的情况
  33.         }

  34.         InsertTailList(&CurrentObject->WaitListHead, &WaitBlock->WaitListEntry);

  35.         if (CurrentThread->Queue)
  36.         {
  37.                 DPRINT("Waking Queue\n");
  38.                 KiWakeQueue(CurrentThread->Queue);
  39.         }

  40.         PsBlockThread(&Status, Alertable, WaitMode, (UCHAR)WaitReason);

  41.         if (Status != STATUS_KERNEL_APC)
  42.         {
  43.                 return Status;
  44.         }

  45.         DPRINT("Looping Again\n");
  46.         CurrentThread->WaitIrql = KeAcquireDispatcherDatabaseLock();

  47. }while (TRUE);

  48. WaitDone:
复制代码

[ 本帖最后由 VBProFan 于 2008-11-6 11:49 编辑 ]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2023-4-1 00:50

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表