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