KiInitializeUserApc

UINT64 __fastcall KiInitializeUserApc(__int64 a1, __int64 a2, __int64 a3, __int64 a4, __int64 a5, __int64 a6, char a7){
  UINT64 v8; 
  _ETHREAD *CurrentThread; 
  int v10; 
  INT64 v11; 
  unsigned __int64 v12; 
  unsigned __int64 v13; 
  int v14; 
  _DWORD *v15; 
  unsigned __int64 v16; 
  UINT64 v17; 
  __int64 v18; 
  UINT64 UnbiasedInterruptTime; 
  _QWORD *v20; 
  char *i; 
  unsigned int v22; 
  __int64 v23; 
  NTSTATUS v24; 
  int v25; 
  unsigned __int64 v27; 
  _QWORD *v28; 
  INT64 result; 
  __int64 v30; 
  _QWORD *v31; 
  _WORD v34[8]; 
  _ETHREAD *v35; 
  UINT64 v36; 
  struct _EXCEPTION_RECORD ExceptionRecord; 
  memset((INT64)&ExceptionRecord, 0i64);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v35 = CurrentThread;
  if( a1 )
  {
    v10 = 1048603;
    v25 = 1048603;
    v11 = 0i64;
    v30 = 0i64;
    if( (*((_DWORD *)CurrentThread + 29) & 0x100000) != 0 )
    {
      v10 = 1048667;
      v25 = 1048667;
      v11 = 2048i64;
      v30 = 2048i64;
    }
    v12 = *(_QWORD *)(a2 + 384);
    v27 = v12;
    v13 = v12;
    result = v12;
    v14 = v10 & 0x100040;
    if( (v10 & 0x100040) == 1048640 )
    {
      v13 = (v12 - (unsigned int)RtlpGetNonLegacyXStateAreaLength(v11)) & 0xFFFFFFFFFFFFFFC0ui64;
      result = v13;
      v12 = v27;
    }
    v28 = (_QWORD *)((v13 - 40) & 0xFFFFFFFFFFFFFFF0ui64);
    v31 = v28 - 4;
    v15 = v28 - 8;
    v16 = (unsigned __int64)(v28 - 162);
    v17 = v12 - (_QWORD)(v28 - 162);
    if( v17 - 1 > 0xFFE )
    {
      ProbeForWrite(v28 - 162, v17, 0x10ui64);
    }
    else
    {
      if( v16 >= 0x7FFFFFFF0000i64 )
        v16 = 0x7FFFFFFF0000i64;
      *(_BYTE *)v16 = *(_BYTE *)v16;
      *(_BYTE *)(v16 + v17 - 1) = *(_BYTE *)(v16 + v17 - 1);
      v15 = v28 - 8;
      v10 = v25;
      v16 = (unsigned __int64)(v28 - 162);
      v28 = (_QWORD *)((v13 - 40) & 0xFFFFFFFFFFFFFFF0ui64);
      v13 = result;
      v11 = v30;
    }
    *(_OWORD *)v31 = 0i64;
    v31[2] = 0i64;
    *(_DWORD *)v31 = 1;
    *((_DWORD *)v31 + 1) = 2;
    if( (a7 & 1) != 0 )
      *((_DWORD *)v31 + 1) = 3;
    if( v14 == 1048640 )
    {
      *v15 = -1232;
      v15[1] = *(_DWORD *)(a2 + 384) - v16;
      v15[2] = -1232;
      v15[3] = 1232;
      v15[4] = v13 - (_DWORD)v15;
      v15[5] = *(_DWORD *)(a2 + 384) - v13;
      memset(v13, 0i64);
      if( (KUSER_SHARED_DATA.XState.ControlFlags & 2) != 0 )
        *(_QWORD *)(v13 + 8) = v11 | 0x8000000000000000ui64;
    }
    *(_DWORD *)(v16 + 48) = v10;
    KeContextFromKframes((_KTRAP_FRAME *)a2, (_KEXCEPTION_FRAME *)a1, (_CONTEXT *)v16);
    v28[3] = *(_QWORD *)(v16 + 152);
    v18 = *(_QWORD *)(v16 + 248);
    *v28 = v18;
    KePopulateContinuationContext(v18);
  }
  else
  {
    v16 = *(_QWORD *)(a2 + 208);
    if( (*((_DWORD *)CurrentThread + 29) & 0x100000) != 0 )
    {
      v24 = KiUnwindUserSspForApcContextCopyBypass(v16);
      if( v24 < 0 )
        RtlRaiseStatus(v24);
    }
  }
  *(_QWORD *)v16 = a4;
  *(_QWORD *)(v16 + 8) = a5;
  *(_QWORD *)(v16 + 16) = a6;
  *(_QWORD *)(v16 + 24) = a3;
  *(_QWORD *)(a2 + 384) = v16;
  *(_QWORD *)(a2 + 360) = KeUserApcDispatcher;
  *(_WORD *)(a2 + 368) = 51;
  if( *(_BYTE *)(a2 + 43) != 2 )
    KiSetupForInstrumentationReturn((KTRAP_FRAME *)a2, v8);
  UnbiasedInterruptTime = KiQueryUnbiasedInterruptTime(1u);
  v36 = UnbiasedInterruptTime;
  if( UnbiasedInterruptTime >= qword_140C4C530 )
  {
    __sidt(v34);
    v20 = *(_QWORD **)&v34[1];
    for( i = *(char **)&v34[1]; (unsigned __int64)i < *(_QWORD *)&v34[1] + 848i64; i += 64 )
      _mm_prefetchnta(i);
    v22 = 848;
    v23 = qword_140C4C520;
    while( v22 >= 8 )
    {
      v23 = __ROR8__(v23 - *v20++, qword_140C4C528);
      v22 -= 8;
    }
    while( v22 )
    {
      v23 = __ROR8__(v23 - *(unsigned __int8 *)v20, qword_140C4C528);
      v20 = (_QWORD *)((char *)v20 + 1);
      --v22;
    }
    if( qword_140C4C538 != v23 )
    {
      if( qword_140C4C4F0 )
        goto LABEL_29;
      qword_140C4C4F0 = (unsigned int)__ROR4__(150994945, 88);
      qword_140C4C4F8 = 0i64;
      qword_140C4C500 = 0i64;
      qword_140C4C508 = 269i64;
      qword_140C4C510 = *(_QWORD *)&v34[1];
    }
    if( !qword_140C4C4F0 )
    {
LABEL_28:
      UnbiasedInterruptTime = KiQueryUnbiasedInterruptTime(1u)
                            + 41929663 * (__rdtsc() >> 4) % 0x12A05F2000i64
                            + 288000000000i64;
      qword_140C4C530 = UnbiasedInterruptTime;
      return UnbiasedInterruptTime;
    }
LABEL_29:
    if( (VOID(__stdcall *)(KDPC *, PVOID, PVOID, PVOID))Dpc.DeferredRoutine != KiScanQueues )
    {
      Dpc.TargetInfoAsUlong = 275;
      Dpc.DeferredRoutine = (void(__fastcall *)(_KDPC *, void *, void *, void *))KiScanQueues;
      Dpc.DeferredContext = &Dpc;
      Dpc.DpcData = 0i64;
      Dpc.ProcessorHistory = 0i64;
    }
    qword_140C4C518 = 940992i64;
    KeInsertQueueDpc(&Dpc, 0i64, 0i64);
    goto LABEL_28;
  }
  return UnbiasedInterruptTime;
}

Referenced by:

KiDeliverApc