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