KiInitializeUserApc

VOID __stdcall KiInitializeUserApc(
        _KEXCEPTION_FRAME *ExceptionFrame,
        _KTRAP_FRAME *TrapFrame,
        VOID *NormalRoutine,
        VOID *a4,
        VOID *a5,
        VOID *a6,
        VOID *NormalContext,
        VOID *SystemArgument1,
        VOID *SystemArgument2,
        INT64 a10,
        INT64 a11){
  UINT64 v12; 
  _ETHREAD *CurrentThread; 
  int v14; 
  INT64 v15; 
  unsigned __int64 Rsp; 
  _QWORD *v17; 
  int v18; 
  _DWORD *v19; 
  unsigned __int64 FaultAddress; 
  INT64 v21; 
  INT64 v22; 
  _QWORD *v23; 
  char *i; 
  unsigned int v25; 
  __int64 v26; 
  int v27; 
  int v28; 
  unsigned int Size; 
  unsigned __int64 v31; 
  _QWORD *v32; 
  _QWORD *v33; 
  __int64 v34; 
  _QWORD *v35; 
  _WORD v38[8]; 
  _ETHREAD *v39; 
  UINT64 UnbiasedInterruptTime; 
  _EXCEPTION_RECORD ExceptionRecord; 

  memset(&ExceptionRecord, 0i64, sizeof(ExceptionRecord));
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v39 = CurrentThread;
  if( ExceptionFrame )
  {
    v14 = 1048603;
    v28 = 1048603;
    v15 = 0i64;
    v34 = 0i64;
    if( (CurrentThread->Tcb._bf_0 & 0x100000) != 0 )
    {
      v14 = 1048667;
      v28 = 1048667;
      v15 = 2048i64;
      v34 = 2048i64;
    }
    Rsp = TrapFrame->_Rsp;
    v31 = Rsp;
    v17 = (_QWORD *)Rsp;
    v33 = (_QWORD *)Rsp;
    Size = 0;
    v18 = v14 & 0x100040;
    if( (v14 & 0x100040) == 1048640 )
    {
      Size = RtlpGetNonLegacyXStateAreaLength(v15);
      v17 = (_QWORD *)(((unsigned __int64)v17 - Size) & 0xFFFFFFFFFFFFFFC0ui64);
      v33 = v17;
      Rsp = v31;
    }
    v32 = (_QWORD *)((unsigned __int64)(v17 - 5) & 0xFFFFFFFFFFFFFFF0ui64);
    v35 = v32 - 4;
    v19 = v32 - 8;
    FaultAddress = (unsigned __int64)(v32 - 162);
    v21 = Rsp - (_QWORD)(v32 - 162);
    if( (unsigned __int64)(v21 - 1) > 0xFFE )
    {
      ProbeForWrite((UINT64)(v32 - 162), v21, 16i64);
    }
    else
    {
      if( FaultAddress >= 0x7FFFFFFF0000i64 )
        FaultAddress = 0x7FFFFFFF0000i64;
      *(_BYTE *)FaultAddress = *(_BYTE *)FaultAddress;
      *(_BYTE *)(FaultAddress + v21 - 1) = *(_BYTE *)(FaultAddress + v21 - 1);
      v19 = v32 - 8;
      v14 = v28;
      FaultAddress = (unsigned __int64)(v32 - 162);
      v32 = (_QWORD *)((unsigned __int64)(v17 - 5) & 0xFFFFFFFFFFFFFFF0ui64);
      v17 = v33;
      v15 = v34;
    }
    *(_OWORD *)v35 = 0i64;
    v35[2] = 0i64;
    *(_DWORD *)v35 = 1;
    *((_DWORD *)v35 + 1) = 2;
    if( ((unsigned __int8)NormalContext & 1) != 0 )
      *((_DWORD *)v35 + 1) = 3;
    if( v18 == 1048640 )
    {
      *v19 = -1232;
      v19[1] = LODWORD(TrapFrame->_Rsp) - FaultAddress;
      v19[2] = -1232;
      v19[3] = 1232;
      v19[4] = (_DWORD)v17 - (_DWORD)v19;
      v19[5] = LODWORD(TrapFrame->_Rsp) - (_DWORD)v17;
      memset(v17, 0i64, Size);
      if( (KUSER_SHARED_DATA.XState._bf_0 & 2) != 0 )
        v17[1] = v15 | 0x8000000000000000ui64;
    }
    *(_DWORD *)(FaultAddress + 48) = v14;
    KeContextFromKframes(TrapFrame, (_KTRAP_FRAME *)ExceptionFrame, (PCONTEXT)FaultAddress);
    v32[3] = *(_QWORD *)(FaultAddress + 152);
    v22 = *(_QWORD *)(FaultAddress + 248);
    *v32 = v22;
    KePopulateContinuationContext(v22);
  }
  else
  {
    FaultAddress = TrapFrame->FaultAddress;
    if( (CurrentThread->Tcb._bf_0 & 0x100000) != 0 )
    {
      v27 = KiUnwindUserSspForApcContextCopyBypass((_CONTEXT_EX *)FaultAddress);
      if( v27 < 0 )
        RtlRaiseStatus(v27);
    }
  }
  *(_QWORD *)FaultAddress = a4;
  *(_QWORD *)(FaultAddress + 8) = a5;
  *(_QWORD *)(FaultAddress + 16) = a6;
  *(_QWORD *)(FaultAddress + 24) = NormalRoutine;
  TrapFrame->_Rsp = FaultAddress;
  TrapFrame->_Rip = KeUserApcDispatcher;
  TrapFrame->SegCs = 51;
  if( TrapFrame->ExceptionActive != 2 )
    KiSetupForInstrumentationReturn(TrapFrame, v12);
  UnbiasedInterruptTime = KiQueryUnbiasedInterruptTime(1u);
  if( UnbiasedInterruptTime >= qword_140C4C530 )
  {
    __sidt(v38);
    v23 = *(_QWORD **)&v38[1];
    for( i = *(char **)&v38[1]; (unsigned __int64)i < *(_QWORD *)&v38[1] + 848i64; i += 64 )
      _mm_prefetchnta(i);
    v25 = 848;
    v26 = qword_140C4C520;
    while( v25 >= 8 )
    {
      v26 = __ROR8__(v26 - *v23++, qword_140C4C528);
      v25 -= 8;
    }
    while( v25 )
    {
      v26 = __ROR8__(v26 - *(unsigned __int8 *)v23, qword_140C4C528);
      v23 = (_QWORD *)((char *)v23 + 1);
      --v25;
    }
    if( qword_140C4C538 != v26 )
    {
      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 *)&v38[1];
    }
    if( !qword_140C4C4F0 )
    {
LABEL_28:
      qword_140C4C530 = KiQueryUnbiasedInterruptTime(1u)
                      + 41929663 * (__rdtsc() >> 4) % 0x12A05F2000i64
                      + 288000000000i64;
      return;
    }
LABEL_29:
    if( (VOID(__stdcall *)(_KDPC *, PVOID, PVOID, PVOID))stru_140C4C4B0.DeferredRoutine != KiScanQueues )
    {
      stru_140C4C4B0.TargetInfoAsUlong = 275;
      stru_140C4C4B0.DeferredRoutine = (void(__fastcall *)(_KDPC *, void *, void *, void *))KiScanQueues;
      stru_140C4C4B0.DeferredContext = &stru_140C4C4B0;
      stru_140C4C4B0.DpcData = 0i64;
      stru_140C4C4B0.ProcessorHistory = 0i64;
    }
    qword_140C4C518 = 940992i64;
    KeInsertQueueDpc((UINT64)&stru_140C4C4B0, 0i64, 0i64);
    goto LABEL_28;
  }
}

Referenced by:

KiDeliverApc