PfpRpShutdown

INT64 __fastcall PfpRpShutdown(INT64 a1){
  _ETHREAD *CurrentThread; 
  _QWORD *v3; 
  _QWORD *v4; 
  unsigned __int64 v5; 
  unsigned __int64 *v6; 
  unsigned __int64 v7; 
  void *v8; 
  unsigned __int64 *v9; 
  unsigned __int64 *i; 
  void *v11; 
  __int64 v13; 
  *(_DWORD *)(a1 + 152) &= ~1u;
  ExWaitForRundownProtectionRelease((EX_RUNDOWN_REF *)(a1 + 136));
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)CurrentThread + 242);
  ExAcquirePushLockExclusiveEx(a1 + 48, 0i64);
  v3 = *(_QWORD **)(a1 + 8);
  v4 = v3;
  if( v3 )
  {
    v5 = *v3;
    if( (*v3 & 0x8000000000000002ui64) == 0x8000000000000002ui64 )
      v5 = *v3;
    if( (v5 & 1) == 0 )
      goto LABEL_20;
    v4 = *(_QWORD **)(a1 + 8);
  }
  v6 = v3 + 1;
  v7 = (unsigned __int64)&v4[(unsigned __int64)*(unsigned int *)(a1 + 4) >> 5];
  while( (unsigned __int64)v6 < v7 )
  {
    v5 = *v6;
    if( (*v6 & 1) == 0 )
      goto LABEL_20;
    ++v6;
  }
  v5 = 0i64;
LABEL_20:
  while( v5 )
  {
    v8 = (void *)v5;
    v13 = *(_QWORD *)(v5 + 8) & (-1i64 << (*(_DWORD *)(a1 + 4) & 0x1F));
    v9 = (unsigned __int64 *)v5;
    v5 = *(_QWORD *)v5;
    if( (v5 & 0x8000000000000002ui64) == 0x8000000000000002ui64 )
      v5 = *v9;
    if( (v5 & 1) != 0 )
    {
      for( i = (unsigned __int64 *)(*(_QWORD *)(a1 + 8)
                                   + 8i64
                                   * ((37
                                     * (BYTE6(v13)
                                      + 37
                                      * (BYTE5(v13)
                                       + 37
                                       * (BYTE4(v13)
                                        + 37
                                        * (BYTE3(v13)
                                         + 37
                                         * (BYTE2(v13) + 37 * (BYTE1(v13) + 37 * ((unsigned __int8)v13 + 11623883)))))))
                                     + HIBYTE(v13)) & (unsigned int)((*(_DWORD *)(a1 + 4) >> 5) - 1))
                                   + 8);
            (unsigned __int64)i < *(_QWORD *)(a1 + 8) + 8 * ((unsigned __int64)*(unsigned int *)(a1 + 4) >> 5);
            ++i )
      {
        v5 = *i;
        if( (*i & 1) == 0 )
          goto LABEL_19;
      }
      v5 = 0i64;
    }
LABEL_19:
    ExFreePoolWithTag(v8, 0);
  }
  v11 = *(void **)(a1 + 8);
  if( v11 )
    ExFreePoolWithTag(v11, 0);
  *(_QWORD *)(a1 + 16) = a1 + 24;
  *(_QWORD *)a1 = 0i64;
  *(_QWORD *)(a1 + 8) = 0i64;
  if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(a1 + 48), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock((volatile INT64 *)(a1 + 48));
  KeAbPostRelease((PVOID)(a1 + 48));
  KeLeaveCriticalRegion();
  return PfpRpControlRequestReset(a1);
}

Referenced by:

PfpParametersPropagate