PopFlushVolumes

VOID __stdcall PopFlushVolumes(UINT64 SystemState){
  int v1; 
  char v2; 
  char v3; 
  char v4; 
  char v5; 
  INT64 v6; 
  int v7; 
  POP_FLUSH_VOLUME *v8; 
  __int64 v9; 
  POP_FLUSH_VOLUME ***v10; 
  POP_FLUSH_VOLUME ***v11; 
  __int64 v12; 
  POP_FLUSH_VOLUME **v13; 
  __int64 v14; 
  POP_FLUSH_VOLUME *v15; 
  __int64 v16; 
  POP_FLUSH_VOLUME *v17; 
  __int64 v18; 
  int v19; 
  int v20; 
  POP_FLUSH_VOLUME **v21; 
  POP_FLUSH_VOLUME **v22; 
  INT64 v23; 
  PKSTART_ROUTINE StartRoutine; 
  PVOID StartContext; 
  INT64 v26; 
  _UNICODE_STRING DestinationString; 
  _OBJECT_ATTRIBUTES ObjectAttributes; 
  POP_FLUSH_VOLUME Flush; 
  __int128 v30; 
  __int64 v31; 
  VOID *KeyHandle; 
  void *ThreadHandle; 

  ThreadHandle = 0i64;
  KeyHandle = 0i64;
  v1 = SystemState;
  memset(&ObjectAttributes, 0, sizeof(ObjectAttributes));
  DestinationString = 0i64;
  PopDiagTraceEventNoPayload(&POP_ETW_EVENT_FLUSHVOLUMES_START);
  v31 = 0i64;
  *(_QWORD *)&Flush.Count = &Flush;
  *(_QWORD *)Flush.List = &Flush;
  *(_OWORD *)&Flush.Wait[4] = 0i64;
  v30 = 0i64;
  KeInitializeEvent((INT64)&Flush.Wait[12], 0, 0);
  if( v1 == 6 )
  {
    v2 = 2;
  }
  else
  {
    v2 = PopFlushPolicy;
    if( byte_140C23480 )
      v2 = 3;
  }
  v3 = v2 | 0x10;
  if( v1 != 5 )
    v3 = v2;
  v4 = v31;
  if( (v3 & 4) != 0 )
    v4 = 1;
  LOBYTE(v31) = v4;
  v5 = BYTE1(v31);
  if( (v3 & 8) != 0 )
    v5 = 1;
  BYTE1(v31) = v5;
  if( (v3 & 1) != 0 )
  {
    RtlInitUnicodeString(&DestinationString, L"\\Registry");
    ObjectAttributes.RootDirectory = 0i64;
    ObjectAttributes.ObjectName = &DestinationString;
    ObjectAttributes.Length = 48;
    ObjectAttributes.Attributes = 576;
    *(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
    if( ZwOpenKey(&KeyHandle, 0x20019ui64, &ObjectAttributes, v6, v23, (INT64)StartRoutine, (INT64)StartContext, v26) >= 0 )
    {
      ZwFlushKey(KeyHandle);
      ZwClose((_HANDLE)KeyHandle);
    }
  }
  v7 = 0;
  ExAcquireFastMutex((PFAST_MUTEX)((char *)&stru_140C23628 + 1368));
  v8 = (POP_FLUSH_VOLUME *)*(&stru_140C23628 + 167);
  while( v8 != (POP_FLUSH_VOLUME *)((char *)&stru_140C23628 + 1336) )
  {
    v12 = *(_QWORD *)&v8[-2].Wait[4];
    v13 = (POP_FLUSH_VOLUME **)v8;
    v8 = *(POP_FLUSH_VOLUME **)v8->List;
    v14 = *(_QWORD *)(v12 + 56);
    if( (*(_BYTE *)(v14 + 4) & 1) != 0 && (*(_DWORD *)(v12 + 52) & 0x10006) == 0 )
    {
      v9 = *(_QWORD *)(v14 + 16);
      if( !v9 || (*(_DWORD *)(v9 + 52) & 4) == 0 )
      {
        if( *(POP_FLUSH_VOLUME ***)&v8->Count != v13
          || (v10 = (POP_FLUSH_VOLUME ***)v13[1], *v10 != v13)
          || (*v10 = (POP_FLUSH_VOLUME **)v8,
              *(_QWORD *)&v8->Count = v10,
              v11 = *(POP_FLUSH_VOLUME ****)&Flush.Count,
              **(POP_FLUSH_VOLUME ***)&Flush.Count != &Flush) )
        {
LABEL_34:
          __fastfail(3u);
        }
        v13[1] = *(POP_FLUSH_VOLUME **)&Flush.Count;
        *v13 = &Flush;
        ++v7;
        *v11 = v13;
        *(_QWORD *)&Flush.Count = v13;
      }
    }
  }
  if( (v3 & 2) == 0 )
  {
    v15 = *(POP_FLUSH_VOLUME **)Flush.List;
    while( v15 != &Flush )
    {
      v16 = *(_QWORD *)&v15[-2].Wait[4];
      v17 = v15;
      v15 = *(POP_FLUSH_VOLUME **)v15->List;
      if( (*(_DWORD *)(v16 + 52) & 1) == 0 )
      {
        v18 = *(_QWORD *)(*(_QWORD *)(v16 + 56) + 16i64);
        if( !v18 || (*(_DWORD *)(v18 + 52) & 1) == 0 )
        {
          if( (v3 & 0x10) == 0
            || ((v19 = *(_DWORD *)(v16 + 48), (v19 & 0x200000) == 0) || (v19 & 0x100) != 0)
            && (!v18 || (v20 = *(_DWORD *)(v18 + 48), (v20 & 0x200000) == 0) || (v20 & 0x100) != 0) )
          {
            if( *(POP_FLUSH_VOLUME **)&v15->Count != v17 )
              goto LABEL_34;
            v21 = *(POP_FLUSH_VOLUME ***)&v17->Count;
            if( *v21 != v17 )
              goto LABEL_34;
            *v21 = v15;
            *(_QWORD *)&v15->Count = v21;
            v22 = (POP_FLUSH_VOLUME **)*(&stru_140C23628 + 168);
            if( (_UNKNOWN *)**(&stru_140C23628 + 168) != (_UNKNOWN *)((char *)&stru_140C23628 + 1336) )
              goto LABEL_34;
            *(_QWORD *)v17->List = (char *)&stru_140C23628 + 1336;
            --v7;
            *(_QWORD *)&v17->Count = v22;
            *v22 = v17;
            *(&stru_140C23628 + 168) = v17;
          }
        }
      }
    }
  }
  KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&stru_140C23628 + 1368));
  if( v7 )
  {
    ObjectAttributes.Length = 48;
    ObjectAttributes.Attributes = 512;
    if( v7 > 8 )
      v7 = 8;
    ObjectAttributes.RootDirectory = 0i64;
    ObjectAttributes.ObjectName = 0i64;
    *(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
    *(_DWORD *)&Flush.Wait[4] = v7;
    while( --v7 > 0 )
    {
      if( PsCreateSystemThread(
             &ThreadHandle,
             0x1FFFFFu,
             &ObjectAttributes,
             0,
             0i64,
             (PKSTART_ROUTINE)PopFlushVolumeWorker,
             &Flush) < 0 )
      {
        ExAcquireFastMutex((PFAST_MUTEX)((char *)&stru_140C23628 + 1368));
        *(_DWORD *)&Flush.Wait[4] -= v7;
        KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&stru_140C23628 + 1368));
        break;
      }
      ZwClose((_HANDLE)ThreadHandle);
    }
    PopFlushVolumeWorker(&Flush);
    KeWaitForSingleObject((UINT64)&Flush.Wait[12], 0, 0, 0, 0i64);
  }
  PopDiagTraceEventNoPayload(&POP_ETW_EVENT_FLUSHVOLUMES_STOP);
}

Referenced by:

PopTransitionSystemPowerStateEx