MiDpcGangTarget
VOID __fastcall MiDpcGangTarget(struct KDPC *Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVOID SystemArgument2){
struct _KPRCB *CurrentPrcb;
__int64 v8;
int GangAssignment;
signed __int32 v10;
unsigned int v11;
signed __int32 v12;
unsigned int v13;
UINT64 v14;
_QWORD a2[4];
UINT64 SpinCount;
a2[0] = 0i64;
if( *(unsigned __int16 *)(*((_QWORD *)KeGetCurrentPrcb() + 24) + 146i64) != *((_DWORD *)DeferredContext + 48) )
goto LABEL_8;
CurrentPrcb = KeGetCurrentPrcb();
if( *((unsigned __int8 *)CurrentPrcb + 208) != *((_WORD *)DeferredContext + 104) )
goto LABEL_8;
v8 = *((_QWORD *)CurrentPrcb + 4235);
if( (v8 & *((_QWORD *)DeferredContext + 25)) == 0
|| (_m_prefetchw((char *)DeferredContext + 200),
(_InterlockedAnd64((volatile signed __int64 *)DeferredContext + 25, ~v8) & *((_QWORD *)CurrentPrcb + 4235)) == 0) )
{
CurrentPrcb = 0i64;
}
if( CurrentPrcb )
GangAssignment = MiGetGangAssignment((INT64)DeferredContext, a2);
else
LABEL_8:
GangAssignment = 0;
if( (*((_DWORD *)DeferredContext + 46) & 2) != 0 )
{
LODWORD(SpinCount) = 0;
v10 = _InterlockedDecrement((volatile signed __int32 *)SystemArgument2);
v11 = ~v10 & 0x80000000;
if( (v10 & 0x7FFFFFFF) != 0 )
{
while( (*(_DWORD *)SystemArgument2 & 0x80000000) != v11 )
KeYieldProcessorEx(&SpinCount);
}
else
{
*(_DWORD *)SystemArgument2 = v11 | *((_DWORD *)SystemArgument2 + 1);
}
}
if( GangAssignment )
MiDoGangAssignment((_TOKEN *)DeferredContext);
if( (*((_DWORD *)DeferredContext + 46) & 2) != 0 )
{
v12 = _InterlockedDecrement((volatile signed __int32 *)SystemArgument2);
v13 = ~v12 & 0x80000000;
if( (v12 & 0x7FFFFFFF) != 0 )
{
LODWORD(v14) = 0;
while( (*(_DWORD *)SystemArgument2 & 0x80000000) != v13 )
KeYieldProcessorEx(&v14);
}
else
{
*(_DWORD *)SystemArgument2 = v13 | *((_DWORD *)SystemArgument2 + 1);
}
}
_InterlockedDecrement((volatile signed __int32 *)SystemArgument1);
}Referenced by:
No references.