PfpRpShutdown

VOID __stdcall PfpRpShutdown(_PFPRP_CONTEXT *RpContext){
  _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 v12; 

  RpContext[38] &= ~1u;
  ExWaitForRundownProtectionRelease((_EX_RUNDOWN_REF *)RpContext + 17);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.KernelApcDisable;
  ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)RpContext + 6, 0i64);
  v3 = (_QWORD *)*((_QWORD *)RpContext + 1);
  v4 = v3;
  if( v3 )
  {
    v5 = *v3;
    if( (*v3 & 0x8000000000000002ui64) == 0x8000000000000002ui64 )
      v5 = *v3;
    if( (v5 & 1) == 0 )
      goto LABEL_20;
    v4 = (_QWORD *)*((_QWORD *)RpContext + 1);
  }
  v6 = v3 + 1;
  v7 = (unsigned __int64)&v4[(unsigned __int64)(unsigned int)RpContext[1] >> 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;
    v12 = *(_QWORD *)(v5 + 8) & (-1i64 << (RpContext[1] & 0x1F));
    v9 = (unsigned __int64 *)v5;
    v5 = *(_QWORD *)v5;
    if( (v5 & 0x8000000000000002ui64) == 0x8000000000000002ui64 )
      v5 = *v9;
    if( (v5 & 1) != 0 )
    {
      for( i = (unsigned __int64 *)(*((_QWORD *)RpContext + 1)
                                   + 8i64
                                   * ((37
                                     * (BYTE6(v12)
                                      + 37
                                      * (BYTE5(v12)
                                       + 37
                                       * (BYTE4(v12)
                                        + 37
                                        * (BYTE3(v12)
                                         + 37
                                         * (BYTE2(v12) + 37 * (BYTE1(v12) + 37 * ((unsigned __int8)v12 + 11623883)))))))
                                     + HIBYTE(v12)) & (((unsigned int)RpContext[1] >> 5) - 1))
                                   + 8);
            (unsigned __int64)i < *((_QWORD *)RpContext + 1) + 8 * ((unsigned __int64)(unsigned int)RpContext[1] >> 5);
            ++i )
      {
        v5 = *i;
        if( (*i & 1) == 0 )
          goto LABEL_19;
      }
      v5 = 0i64;
    }
LABEL_19:
    ExFreePoolWithTag(v8, 0);
  }
  v11 = (void *)*((_QWORD *)RpContext + 1);
  if( v11 )
    ExFreePoolWithTag(v11, 0);
  *((_QWORD *)RpContext + 2) = RpContext + 6;
  *(_QWORD *)RpContext = 0i64;
  *((_QWORD *)RpContext + 1) = 0i64;
  if( (_InterlockedExchangeAdd64((volatile signed __int64 *)RpContext + 6, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock((_EX_PUSH_LOCK *)RpContext + 6);
  KeAbPostRelease(RpContext + 12);
  KeLeaveCriticalRegion();
  PfpRpControlRequestReset(RpContext);
}

Referenced by:

PfpParametersPropagate