ExpWaitForBootDevices

VOID __stdcall __noreturn ExpWaitForBootDevices(VOID *Context){
  int v1; 
  __int64 *v2; 
  unsigned __int8 v3; 
  unsigned __int64 v4; 

  while( 1 )
  {
    KeWaitForSingleObject((UINT64)&ExBootDevicesRemovedEvent, 0, 0, 0, 0i64);
    v1 = 60;
    while( 1 )
    {
      v2 = &ExBootDeviceList;
      while( 1 )
      {
        v3 = KeAcquireSpinLockRaiseToDpc(&ExBootDeviceListSpinLock);
        v2 = (__int64 *)v2[1];
        v4 = v3;
        KxReleaseSpinLock(&ExBootDeviceListSpinLock);
        if( v2 == &ExBootDeviceList )
          break;
        __writecr8(v4);
        if( *((_DWORD *)v2 - 1)
          && ((unsigned __int8(__fastcall *)(__int64, __int64))v2[5])(v2[4], v2[6])
          && _InterlockedExchangeAdd((volatile signed __int32 *)v2 - 1, 0xFFFFFFFF) == 1
          && _InterlockedExchangeAdd(&ExNumMissingBootDevices, 0xFFFFFFFF) == 1 )
        {
          goto LABEL_10;
        }
      }
      __writecr8(v4);
LABEL_10:
      if( !ExNumMissingBootDevices )
        break;
      KeFreezeExecution(0i64, 0i64);
      KeStallExecutionProcessor(0xF4240u);
      KeThawExecution(1u);
      if( !--v1 )
        KeBugCheckEx(0x7Bu, 0i64, 0i64, (PVOID)3, 0i64);
    }
  }
}

Referenced by:

No references.