sub_1405CA010

UINT8 __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; 
  unsigned __int64 v25; 
  unsigned int v26; 
  UINT8 result; 
  int SystemArgument1_high; 
  unsigned __int8 CurrentIrql; 
  unsigned __int64 v30; 
  __int64 v31; 
  unsigned __int64 v32; 
  NTSTATUS v33; 
  unsigned __int64 v34; 
  struct _KPRCB *CurrentPrcb; 
  void **v36; 
  _QWORD *v37; 
  KDPC *v38; 
  __int64 v39; 
  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;
  v38 = 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(1i64) % 0x5F5E100ui64;
  v26 = ExGenRandom(1i64);
  result = KeSetCoalescableTimer((PKTIMER)&Dpc[1], (LARGE_INTEGER)v25, 0, v26 % 0x2710, Dpc);
  if( v22 != Dpc[2].DeferredRoutine )
  {
    if( LODWORD(Dpc[2].SystemArgument2) )
    {
      SystemArgument1_high = HIDWORD(Dpc[2].SystemArgument1);
      if( v4 )
      {
        CurrentIrql = KeGetCurrentIrql();
        __writecr8(2ui64);
        v30 = v8 & 0xFFFFFFFFFFFFF000ui64;
        v31 = (v8 + v4 - 1) | 0xFFF;
        v32 = (v8 & 0xFFFFFFFFFFFFF000ui64) - 1;
        while( 1 )
        {
          v33 = VslVerifyPage(v30, 0i64);
          v34 = CurrentIrql;
          while( v33 == -1073741267 )
          {
            if( !SystemArgument1_high )
              goto LABEL_31;
            if( CurrentIrql > 1u )
              goto LABEL_28;
            v34 = CurrentIrql;
            __writecr8(CurrentIrql);
            KeGetCurrentIrql();
            __writecr8(2ui64);
            v33 = VslVerifyPage(v30, 0i64);
          }
          if( v33 < 0 )
            break;
LABEL_28:
          result = 0;
          v30 += 4096i64;
          v32 += 4096i64;
          if( v32 == v31 )
          {
            __writecr8(v34);
            return result;
          }
        }
LABEL_31:
        __writecr8(v34);
      }
    }
    _disable();
    CurrentPrcb = KeGetCurrentPrcb();
    v36 = (void **)*((_QWORD *)CurrentPrcb + 1570);
    v37 = (_QWORD *)*((_QWORD *)CurrentPrcb + 1);
    if( !*((_BYTE *)CurrentPrcb + 12586) || &v38 > (KDPC **)v36 || &v38 < (KDPC **)v36 - 3072 )
      v36 = (void **)v37[5];
    v37[138] = 0i64;
    v37[154] = 0i64;
    ExTryAcquireSpinLockExclusiveAtDpcLevel((INT64 *)PsLoadedModuleSpinLock);
    v39 = 0xD147407EB1239169ui64;
    CcAdjustBcbDepth(
      (unsigned int)__ROR4__(150994945, 216),
      __ROL8__(0xD147407EB1239169ui64, 71),
      0i64,
      v8,
      (unsigned int)__ROL4__(1098907648, 74),
      (__int64(__fastcall *)(__int64))KeBugCheckEx,
      v36);
    JUMPOUT(0x1405CA37Di64);
  }
  return result;
}

Referenced by:

No references.