PfpRpControlRequestUpdate
NTSTATUS __stdcall PfpRpControlRequestUpdate(PFPRP_CONTEXT *RpContext, PF_ROBUSTNESS_CONTROL *Request){
_RTL_CHASH_ENTRY *v3;
unsigned int v5;
_RTL_CHASH_ENTRY *v6;
_RTL_CHASH_ENTRY *v7;
PF_ROBUSTNESS_CONTROL v8;
__int64 v9;
VOID *Key_high;
unsigned __int64 Key_low;
_EPROCESS *v12;
NTSTATUS result;
UINT64 v14;
UINT64 v15;
UINT64 EntryCount;
UINT64 EntryCounta;
_EPROCESS *Process;
Process = 0i64;
v3 = (_RTL_CHASH_ENTRY *)(Request + 6);
v5 = 0;
v6 = v3;
v7 = v3;
v8 = Request[1];
v9 = (unsigned int)(v8 + Request[2]);
if( (_DWORD)v9 )
{
do
{
Key_high = (VOID *)HIDWORD(v7->Key);
Key_low = LODWORD(v7->Key);
v6->Key = Key_low;
++v6;
if( (_DWORD)Key_high && PsLookupProcessByProcessId(Key_high, &Process) >= 0 )
{
v12 = Process;
if( Process->ImagePathHash == (_DWORD)Key_low )
{
if( v5 < Request[1] )
_InterlockedOr((volatile signed __int32 *)&Process->1124, 0x4000u);
else
_InterlockedAnd((volatile signed __int32 *)&Process->1124, 0xFFFFBFFF);
v12 = Process;
}
ObfDereferenceObjectWithTag(v12, 0x746C6644ui64);
}
++v5;
++v7;
}
while( v5 < (unsigned int)v9 );
v8 = Request[1];
v3 = (_RTL_CHASH_ENTRY *)(Request + 6);
}
LODWORD(EntryCount) = v8;
result = PfpRpCHashAddEntries(
RpContext,
(_RTL_CHASH_TABLE *)RpContext + 4,
(_EX_PUSH_LOCK *)RpContext + 15,
v3,
EntryCount);
if( result >= 0 )
{
v14 = (unsigned int)Request[2];
if( !(_DWORD)v14
|| !RpContext[28]
|| (result = PfpRpCHashDeleteEntries(
RpContext,
(_RTL_CHASH_TABLE *)RpContext + 4,
(_EX_PUSH_LOCK *)RpContext + 15,
v14,
(_RTL_CHASH_ENTRY *)&Request[2 * Request[1] + 6]),
result >= 0) )
{
LODWORD(EntryCounta) = Request[4];
PfpRpCHashAddEntries(
RpContext,
(_RTL_CHASH_TABLE *)(RpContext + 14),
(_EX_PUSH_LOCK *)RpContext + 11,
(_RTL_CHASH_ENTRY *)((((unsigned __int64)&Request[2 * v9 + 7] + 3) & 0xFFFFFFFFFFFFFFF8ui64)
+ 8i64 * (unsigned int)Request[3]),
EntryCounta);
v15 = (unsigned int)Request[3];
if( (_DWORD)v15 && RpContext[18] )
{
result = PfpRpCHashDeleteEntries(
RpContext,
(_RTL_CHASH_TABLE *)(RpContext + 14),
(_EX_PUSH_LOCK *)RpContext + 11,
v15,
(_RTL_CHASH_ENTRY *)(((unsigned __int64)&Request[2 * v9 + 7] + 3) & 0xFFFFFFFFFFFFFFF8ui64));
if( result < 0 )
return result;
*((_QWORD *)RpContext + 10) = 0i64;
}
return 0;
}
}
return result;
}Referenced by:
PfpRpControlRequestPerform