MiZeroInParallelWorker

VOID __stdcall MiZeroInParallelWorker(VOID *Context){
  char *v1; 
  _ETHREAD *CurrentThread; 
  KPRIORITY v3; 
  __int64 v4; 
  __int64 v5; 
  _MMPTE *v6; 
  unsigned __int64 v7; 
  int v8; 
  _KTBFLUSH_TYPE v9; 
  UINT64 v10; 
  int v11; 
  INT64 *v12; 
  __int64 v13; 
  INT64 v14; 
  UINT64 v15; 
  unsigned int PfnPageSizeIndex; 
  unsigned int v17; 
  unsigned __int64 v18; 
  unsigned __int64 v19; 
  _XSTATE_CONFIGURATION *v20; 
  UINT64 v21; 
  int v22; 
  UINT64 Processor; 
  _MMPTE *v24; 
  unsigned int a3; 
  _ETHREAD *v26; 
  __int64 v27; 
  __int64 *v28; 
  _GROUP_AFFINITY Affinity; 
  INT64 v31[16]; 

  v1 = (char *)Context;
  memset(v31, 0i64, sizeof(v31));
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v3 = -1;
  v28 = (__int64 *)*((_QWORD *)v1 + 1);
  Processor = 0xFFFFFFFF00000000ui64;
  v4 = *v28;
  v5 = *((unsigned int *)v28 + 4);
  a3 = *((_DWORD *)v28 + 3);
  v26 = CurrentThread;
  if( KeGetCurrentIrql() == 2 || CurrentThread->Win32StartAddress == KiExecuteDpc )
  {
    CurrentThread = 0i64;
    v26 = 0i64;
  }
  else if( *(_DWORD *)v1 != -1 )
  {
    v3 = KeSetPriorityThread(&CurrentThread->Tcb, *(_DWORD *)v1);
    HIDWORD(Processor) = v3;
  }
  v6 = 0i64;
  v24 = 0i64;
  LODWORD(v7) = 0;
  v8 = MiCreateUltraThreadContext((INT64)v31, 0i64, 15i64) != 0 ? 0xF : 0;
  v22 = v8;
  if( (_DWORD)v5 )
  {
    v10 = 0i64;
    v11 = v8;
    v12 = (INT64 *)(v4 + 32);
    v13 = v5;
    v27 = v5;
    do
    {
      if( !*((_DWORD *)v12 - 8) && _InterlockedIncrement((volatile signed __int32 *)v12 - 8) == 1 )
      {
        if( CurrentThread )
        {
          Affinity = *(_GROUP_AFFINITY *)(v12 - 3);
          LODWORD(Processor) = MiSetIdealProcessorThread(&Affinity);
        }
        v14 = *v12;
        if( (INT64 *)*v12 != v12 )
        {
          do
          {
            v15 = 3i64;
            if( (*(_QWORD *)(v14 + 40) & 0x1000000000i64) == 0 )
              goto LABEL_18;
            PfnPageSizeIndex = MiGetPfnPageSizeIndex(v14);
            v15 = PfnPageSizeIndex;
            if( PfnPageSizeIndex == -1 )
              v15 = v17;
            if( (unsigned int)v15 < v17 )
              v18 = MiLargePageSizes[v15];
            else
LABEL_18:
              v18 = 1i64;
            if( (unsigned int)v15 > 2 || *(unsigned __int8 *)(v14 + 34) >> 6 == a3 )
            {
              if( v11 )
              {
                MiZeroWithUltraSpace((INT64)v31, v14);
              }
              else
              {
                if( !v6 )
                  goto LABEL_28;
                if( v10 < v18 )
                {
                  MiReleasePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432), v6, (unsigned int)v7, v9);
                  v6 = 0i64;
                }
                if( v6 )
                {
                  v20 = (_XSTATE_CONFIGURATION *)v24;
                }
                else
                {
LABEL_28:
                  v19 = *(v12 - 1);
                  v7 = v18;
                  if( v19 > 0x4000 )
                    v19 = 0x4000i64;
                  if( v19 >= v18 )
                    v7 = v19;
                  do
                  {
                    v6 = MiReservePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432), (unsigned int)v7);
                    if( v6 )
                      break;
                    v7 = (v7 >> 1) & ~(v18 - 1);
                  }
                  while( v7 >= v18 );
                  v20 = (_XSTATE_CONFIGURATION *)v6;
                  v10 = v7;
                  v24 = v6;
                }
                v21 = MiZeroWithSystemPtes(v20, v10, (_MMPFN *)v14);
                v10 -= v21;
                v24 += v21;
              }
            }
            else
            {
              MiZeroAndConvertPage((_MI_ZERO_THREAD_CONTEXT *)v14, v15, a3, *((_DWORD *)v28 + 2));
            }
            v14 = *(_QWORD *)v14;
            *(v12 - 1) -= v18;
          }
          while( (INT64 *)v14 != v12 );
          CurrentThread = v26;
          v13 = v27;
        }
        if( CurrentThread && (_DWORD)Processor != -1 )
          KeSetIdealProcessorThreadEx((_ETHREAD *)KeGetCurrentThread(), (unsigned int)Processor, 0i64);
      }
      v12 += 6;
      v27 = --v13;
    }
    while( v13 );
    v1 = (char *)Context;
    v3 = HIDWORD(Processor);
    if( v6 )
      MiReleasePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432), v6, (unsigned int)v7, v9);
    v8 = v22;
  }
  if( _InterlockedExchangeAdd((volatile signed __int32 *)v1 + 1, 0xFFFFFFFF) == 1 )
    KeSignalGate((_KGATE *)(v1 + 16), 1i64);
  if( v3 != -1 )
    KeSetPriorityThread(&CurrentThread->Tcb, v3);
  if( v8 )
    MiDeleteUltraThreadContext((INT64)v31);
}

Referenced by:

MiZeroInParallel