Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

72 lines
1.5 KiB

  1. BOOL PermEvent::Wait()
  2. {
  3. BOOL fStatus = TRUE ;
  4. BOOL fTerminated = FALSE ;
  5. while ( fStatus && ! fTerminated )
  6. {
  7. DWORD Event = MsgWaitForMultipleObjects (m_dwCount ,m_pHandles ,FALSE ,1000 ,QS_ALLINPUT) ;
  8. ULONG HandleIndex = Event - WAIT_OBJECT_0 ;
  9. if ( Event == 0xFFFFFFFF )
  10. {
  11. fStatus = FALSE ;
  12. }
  13. else if ( Event == WAIT_TIMEOUT)
  14. {
  15. // TimedOut();
  16. }
  17. else if ( Event >= WAIT_OBJECT_0 && HandleIndex <= m_dwCount )
  18. {
  19. // Go into dispatch loop
  20. if ( HandleIndex == m_dwCount )
  21. {
  22. BOOL fDispatchStatus ;
  23. MSG Msg ;
  24. while ( ( fDispatchStatus = PeekMessage ( & Msg , NULL , 0 , 0 , PM_NOREMOVE ) ) == TRUE )
  25. {
  26. if ( ( fDispatchStatus = GetMessage ( & Msg , NULL , 0 , 0 ) ) == TRUE )
  27. {
  28. TranslateMessage ( & Msg ) ;
  29. DispatchMessage ( & Msg ) ;
  30. }
  31. BOOL fTimeout = FALSE ;
  32. while ( ! fTimeout & fStatus & ! fTerminated )
  33. {
  34. Event = WaitForMultipleObjects (m_dwCount ,m_pHandles ,FALSE ,0) ;
  35. HandleIndex = Event - WAIT_OBJECT_0 ;
  36. if ( Event == 0xFFFFFFFF )
  37. {
  38. fStatus = FALSE ;
  39. }
  40. else if ( Event == WAIT_TIMEOUT)
  41. {
  42. fTimeout = TRUE ;
  43. }
  44. else if ( HandleIndex < m_dwCount )
  45. {
  46. fStatus = WaitDispatch ( HandleIndex , fTerminated ) ;
  47. }
  48. else
  49. {
  50. fStatus = FALSE ;
  51. }
  52. }
  53. }
  54. }
  55. else if ( HandleIndex < m_dwCount )
  56. {
  57. fStatus = WaitDispatch ( HandleIndex, fTerminated ) ;
  58. }
  59. else
  60. {
  61. fStatus = FALSE ;
  62. }
  63. }
  64. }
  65. return fStatus ;
  66. }