KiIpiProcessRequests

UINT8 __stdcall KiIpiProcessRequests(KTRAP_FRAME *TrapFrame, KTRAP_FRAME *ExceptionFrame){
  struct _KPRCB *CurrentPrcb; 
  UINT8 result; 
  char *v4; 
  __int64 v5; 
  char *v6; 
  __int64 v7; 
  __int64 v8; 
  unsigned __int64 v9; 
  __int64 v10; 
  void **v11; 
  int v12; 
  unsigned __int64 v13; 
  unsigned __int64 v14; 
  __int64 v15; 
  unsigned __int64 v16; 
  __int64 v17; 
  unsigned __int64 v18; 
  __int64 v19; 
  void *v20; 
  unsigned __int64 v21; 
  __int64 v22; 
  __int64 v23; 
  unsigned __int64 v24; 
  unsigned __int64 v25; 
  _QWORD v26[2]; 
  _QWORD v27[2]; 
  _QWORD v28[2]; 
  UINT64 SysCallReturnValue[2]; 
  __int128 v30; 
  CurrentPrcb = KeGetCurrentPrcb();
  result = 0;
  _m_prefetchw((char *)CurrentPrcb + 35904);
  if( *((_QWORD *)CurrentPrcb + 4488) )
  {
    v4 = (char *)_InterlockedExchange64((volatile __int64 *)CurrentPrcb + 4488, 0i64);
    if( v4 )
    {
      while( 1 )
      {
        v5 = v4 - (char *)CurrentPrcb - 44736;
        v6 = v4;
        v4 = *(char **)v4;
        *(_OWORD *)SysCallReturnValue = 0i64;
        v30 = 0i64;
        v7 = (__int64)*(&KiProcessorBlock + (unsigned int)(v5 >> 6));
        v22 = v7;
        v8 = *((_QWORD *)v6 + 1);
        if( (v8 & 0xF) == 4 )
        {
          v10 = v8 >> 7;
          v11 = *(void ***)v10;
          v12 = (1 << *(_DWORD *)(v10 + 12)) & 0xA;
          v13 = *(_QWORD *)v10 + 8i64 * *(unsigned int *)(v10 + 8);
          v25 = v13;
          do
          {
            v14 = (unsigned __int64)*v11;
            if( v12 && KiFlushPcid && !*(_BYTE *)(*((_QWORD *)KeGetCurrentThread() + 23) + 912i64) )
            {
              if( (KiFlushPcid & 2) != 0 )
              {
                v27[0] = 1i64;
                v27[1] = v14;
                _invpcid(0, v27);
              }
              else
              {
                KiSetUserTbFlushPending();
                v13 = v25;
              }
            }
            __invlpg((void *)v14);
            v15 = 4096i64 << (9 * ((unsigned __int8)(v14 >> 10) & 3u));
            v16 = v14 & 0x3FF;
            v23 = v15;
            v24 = v16;
            if( (v14 & 0x3FF) != 0 )
            {
              do
              {
                v14 += v15;
                if( v12 && KiFlushPcid )
                {
                  if( !*(_BYTE *)(*((_QWORD *)KeGetCurrentThread() + 23) + 912i64) )
                  {
                    if( (KiFlushPcid & 2) != 0 )
                    {
                      v28[0] = 1i64;
                      v28[1] = v14;
                      _invpcid(0, v28);
                    }
                    else
                    {
                      KiSetUserTbFlushPending();
                      v16 = v24;
                    }
                  }
                  v15 = v23;
                }
                __invlpg((void *)v14);
                v24 = --v16;
              }
              while( v16 );
              v13 = v25;
            }
            ++v11;
          }
          while( (unsigned __int64)v11 < v13 );
        }
        else
        {
          switch( v8 & 0xF )
          {
            case 1i64:
              goto LABEL_5;
            case 2i64:
              v19 = v8 >> 7;
              v20 = *(void **)v19;
              if( ((1 << *(_DWORD *)(v19 + 8)) & 0xA) == 0
                || !KiFlushPcid
                || *(_BYTE *)(*((_QWORD *)KeGetCurrentThread() + 23) + 912i64) )
              {
                goto LABEL_35;
              }
              if( (KiFlushPcid & 2) != 0 )
              {
                v26[0] = 1i64;
                v26[1] = v20;
                _invpcid(0, v26);
                __invlpg(v20);
              }
              else
              {
                KiSetUserTbFlushPending();
                v7 = v22;
LABEL_35:
                __invlpg(v20);
              }
              goto LABEL_13;
            case 3i64:
              if( !KiFlushPcid )
              {
                v21 = __readcr4();
                if( (v21 & 0x20080) != 0 )
                {
                  __writecr4(v21 ^ 0x80);
                  __writecr4(v21);
                }
                else
                {
LABEL_5:
                  v9 = __readcr3();
                  __writecr3(v9);
                }
                goto LABEL_13;
              }
              v18 = __readcr3();
              __writecr3(v18);
              if( *(_BYTE *)(*((_QWORD *)KeGetCurrentThread() + 23) + 912i64) )
                goto LABEL_13;
              KiSetUserTbFlushPending();
              break;
            default:
              __fastfail(0x25u);
          }
        }
        v7 = v22;
LABEL_13:
        if( _InterlockedExchangeAdd(*((volatile signed __int32 **)v6 + 6), 0xFFFFFFFF) == 1
          && _InterlockedExchangeAdd((volatile signed __int32 *)(v7 + 11652), 0xFFFFFFFF) == 1 )
        {
          *(_DWORD *)(v7 + 11648) = 0;
        }
        v17 = *((_QWORD *)CurrentPrcb + 4247);
        result = 1;
        if( v17 )
          _InterlockedDecrement((volatile signed __int32 *)(v17 + 32));
        if( !v4 )
        {
          v4 = (char *)_InterlockedExchange64((volatile __int64 *)CurrentPrcb + 4488, 0i64);
          if( !v4 )
            break;
        }
      }
    }
  }
  return result;
}

Referenced by:

KiIpiInterruptSubDispatch