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.