sub_1405CA010

void __fastcall sub_1405CA010(_KDPC *Dpc){
  __int64 ProcessorHistory_low; 
  unsigned __int8 *v3; 
  __int64 v4; 
  char SystemArgument1; 
  unsigned __int64 DeferredContext; 
  int v7; 
  __int64 v8; 
  _QWORD *v9; 
  char *v10; 
  unsigned __int64 v11; 
  unsigned int i; 
  __int64 v13; 
  unsigned __int64 v14; 
  __int64 v15; 
  __int64 v16; 
  unsigned int v17; 
  unsigned __int64 v18; 
  __int64 v19; 
  char *v20; 
  int v21; 
  void(__fastcall *v22)(_KDPC *, void *, void *, void *); 
  unsigned __int8 *v23; 
  __int64 v24; 
  INT64 v25; 
  unsigned int v26; 
  int SystemArgument1_high; 
  unsigned __int8 CurrentIrql; 
  __int64 v29; 
  __int64 v30; 
  unsigned __int64 v31; 
  NTSTATUS v32; 
  unsigned __int64 v33; 
  struct _KPRCB *CurrentPrcb; 
  void **DpcStack; 
  _ETHREAD *CurrentThread; 
  _KDPC *v37; 
  __int64 v38; 

  KeExitRetpoline();
  ProcessorHistory_low = LODWORD(Dpc[2].ProcessorHistory);
  v3 = *(unsigned __int8 **)&Dpc[2].TargetInfoAsUlong;
  v4 = ProcessorHistory_low;
  SystemArgument1 = (char)Dpc[2].SystemArgument1;
  DeferredContext = (unsigned __int64)Dpc[2].DeferredContext;
  LOBYTE(v7) = SystemArgument1;
  v37 = Dpc;
  v8 = (__int64)Dpc[2].DpcListEntry.Next + *(unsigned int *)v3;
  v9 = (_QWORD *)v8;
  v10 = (char *)v8;
  if( v8 < (unsigned __int64)(ProcessorHistory_low + v8) )
  {
    do
    {
      _mm_prefetchnta(v10);
      v10 += 64;
    }
    while( (unsigned __int64)v10 < ProcessorHistory_low + v8 );
  }
  v11 = DeferredContext;
  for( i = (unsigned int)ProcessorHistory_low >> 7; i; --i )
  {
    v13 = 8i64;
    do
    {
      v14 = v11 ^ *v9;
      v15 = v9[1];
      v9 += 2;
      v11 = __ROL8__(__ROL8__(v14, v7) ^ v15, v7);
      --v13;
    }
    while( v13 );
    v16 = __ROL8__(DeferredContext ^ ((unsigned __int64)v9 - v8), 17);
    v7 = ((unsigned __int8)((((v16 ^ DeferredContext ^ ((unsigned __int64)v9 - v8))
                            * (unsigned __int128)0x7010008004002001ui64) >> 64) ^ v16 ^ DeferredContext ^ ((_BYTE)v9 - v8)) ^ (unsigned __int8)v7) & 0x3F;
    if( !v7 )
      LOBYTE(v7) = 1;
  }
  v17 = ProcessorHistory_low & 0x7F;
  if( v17 >= 8 )
  {
    v18 = (unsigned __int64)v17 >> 3;
    do
    {
      v11 = __ROL8__(*v9++ ^ v11, v7);
      v17 -= 8;
      --v18;
    }
    while( v18 );
  }
  for( ; v17; --v17 )
  {
    v19 = *(unsigned __int8 *)v9;
    v9 = (_QWORD *)((char *)v9 + 1);
    v11 = __ROL8__(v19 ^ v11, v7);
  }
  v20 = (char *)v3;
  if( v3 < v3 + 12 )
  {
    do
    {
      _mm_prefetchnta(v20);
      v20 += 64;
    }
    while( v20 < (char *)v3 + 12 );
  }
  v21 = 4;
  v22 = (void(__fastcall *)(_KDPC *, void *, void *, void *))__ROL8__(v11 ^ *(_QWORD *)v3, SystemArgument1);
  v23 = v3 + 8;
  do
  {
    v24 = *v23++;
    v22 = (void(__fastcall *)(_KDPC *, void *, void *, void *))__ROL8__(v24 ^ (unsigned __int64)v22, SystemArgument1);
    --v21;
  }
  while( v21 );
  v25 = -1200000000i64 - (unsigned int)ExGenRandom(ExGenRandomDomainUserVisible) % 0x5F5E100ui64;
  v26 = ExGenRandom(ExGenRandomDomainUserVisible);
  KeSetCoalescableTimer((INT64)&Dpc[1], v25, 0i64, v26 % 0x2710, (INT64)Dpc);
  if( v22 != Dpc[2].DeferredRoutine )
  {
    if( LODWORD(Dpc[2].SystemArgument2) )
    {
      SystemArgument1_high = HIDWORD(Dpc[2].SystemArgument1);
      if( v4 )
      {
        CurrentIrql = KeGetCurrentIrql();
        __writecr8(2ui64);
        v29 = v8 & 0xFFFFFFFFFFFFF000ui64;
        v30 = (v8 + v4 - 1) | 0xFFF;
        v31 = (v8 & 0xFFFFFFFFFFFFF000ui64) - 1;
        while( 1 )
        {
          v32 = VslVerifyPage(v29, 0);
          v33 = CurrentIrql;
          while( v32 == -1073741267 )
          {
            if( !SystemArgument1_high )
              goto LABEL_31;
            if( CurrentIrql > 1u )
              goto LABEL_28;
            v33 = CurrentIrql;
            __writecr8(CurrentIrql);
            KeGetCurrentIrql();
            __writecr8(2ui64);
            v32 = VslVerifyPage(v29, 0);
          }
          if( v32 < 0 )
            break;
LABEL_28:
          v29 += 4096i64;
          v31 += 4096i64;
          if( v31 == v30 )
          {
            __writecr8(v33);
            return;
          }
        }
LABEL_31:
        __writecr8(v33);
      }
    }
    _disable();
    CurrentPrcb = KeGetCurrentPrcb();
    DpcStack = (void **)CurrentPrcb->DpcStack;
    CurrentThread = CurrentPrcb->CurrentThread;
    if( !CurrentPrcb->DpcRoutineActive || &v37 > (_KDPC **)DpcStack || &v37 < (_KDPC **)DpcStack - 3072 )
      DpcStack = (void **)CurrentThread->Tcb.InitialStack;
    *(_QWORD *)&CurrentThread->gap438[24] = 0i64;
    CurrentThread->Win32StartAddress = 0i64;
    ExTryAcquireSpinLockExclusiveAtDpcLevel(&PsLoadedModuleSpinLock);
    v38 = 0xD147407EB1239169ui64;
    CcAdjustBcbDepth(
      (unsigned int)__ROR4__(150994945, 216),
      __ROL8__(0xD147407EB1239169ui64, 71),
      0i64,
      v8,
      (unsigned int)__ROL4__(1098907648, 74),
      (__int64(__fastcall *)(__int64))KeBugCheckEx,
      DpcStack);
    JUMPOUT(0x1405CA37Di64);
  }
}

Referenced by:

No references.