PopDispatchNotificationsToList

VOID __stdcall PopDispatchNotificationsToList(_LIST_ENTRY *List){
  _WNF_STATE_NAME *Flink; 
  unsigned int v3; 
  _WNF_STATE_NAME *v4; 
  NTSTATUS v5; 
  UINT64 v6; 
  NTSTATUS updated; 
  _WNF_STATE_NAME **v8; 
  UINT64 MatchingChangeStamp; 
  UINT64 CheckStamp; 
  UINT64 ReturnBufferLength; 
  _WNF_STATE_NAME StateName; 
  char OutputBuffer[40]; 

  LODWORD(ReturnBufferLength) = 0;
  StateName = 0i64;
  ExAcquireFastMutex((PFAST_MUTEX)((char *)&stru_140C23628 + 3000));
  Flink = (_WNF_STATE_NAME *)List->Flink;
  while( Flink != (_WNF_STATE_NAME *)List )
  {
    v3 = Flink[6].Data[1];
    v4 = Flink;
    while( (v3 & 1) != 0 && (v3 & 2) == 0 )
    {
      StateName = Flink[7];
      Flink[6].Data[1] = Flink[6].Data[1] & 0xFFFFFFFC | 2;
      v5 = PopMarshalSettingValues(
             (_POP_POWER_SETTING_CONFIGURATION *)Flink,
             OutputBuffer,
             0x24ui64,
             &ReturnBufferLength);
      KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&stru_140C23628 + 3000));
      v6 = (unsigned int)ReturnBufferLength;
      LODWORD(CheckStamp) = 0;
      LODWORD(MatchingChangeStamp) = 0;
      if( v5 < 0 )
        v6 = 0i64;
      LODWORD(ReturnBufferLength) = v6;
      updated = ZwUpdateWnfStateData(&StateName, OutputBuffer, v6, 0i64, 0i64, MatchingChangeStamp, CheckStamp);
      if( KeGetCurrentThread()->WaitBlock[3].SpareLong )
        goto LABEL_19;
      ExAcquireFastMutex((PFAST_MUTEX)((char *)&stru_140C23628 + 3000));
      v3 = Flink[6].Data[1] & 0xFFFFFFFD;
      Flink[6].Data[1] = v3;
      if( updated < 0 )
      {
        v3 |= 1u;
        Flink[6].Data[1] = v3;
        break;
      }
    }
    Flink = (_WNF_STATE_NAME *)*Flink;
    if( (v3 & 2) == 0 && (v3 & 4) != 0 )
    {
      if( (_WNF_STATE_NAME *)Flink[1] != v4 || (v8 = (_WNF_STATE_NAME **)v4[1], *v8 != v4) )
        __fastfail(3u);
      *v8 = Flink;
      Flink[1] = (_WNF_STATE_NAME)v8;
      PopFreeRegistration((_POP_POWER_SETTING_CONFIGURATION *)v4);
    }
  }
  KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&stru_140C23628 + 3000));
  if( KeGetCurrentThread()->WaitBlock[3].SpareLong )
LABEL_19:
    __fastfail(0x20u);
}

Referenced by:

PopDispatchNotifications