MiZeroCfgSystemWideBitmapWorker

VOID __stdcall MiZeroCfgSystemWideBitmapWorker(_SUBSECTION *Subsection, UINT64 StartBit, UINT64 NumberOfBits){
  UINT64 v3; 
  _CONTROL_AREA *ControlArea; 
  UINT64 v5; 
  UINT64 v7; 
  __int64 v8; 
  _SUBSECTION *v9; 
  _MMPTE *SubsectionBase; 
  unsigned __int64 v11; 
  _SUBSECTION *v12; 
  UINT64 v13; 
  _MMPTE *v14; 
  unsigned __int64 v15; 
  unsigned __int64 v16; 
  int v17; 
  __int64 v18; 
  _MMPFN *v19; 
  UINT64 v20; 
  __int64 v21; 
  _MMPFN *v22; 
  UINT64 v23; 
  unsigned __int64 v24; 
  unsigned __int64 v25; 
  union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v26; 
  int v27; 
  UINT64 *p_Long; 
  _MMPTE v29; 
  union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v30; 
  UINT64 v31; 
  __int16 v32; 
  _MMPFN *v33; 
  int v34; 
  INT64 v35; 
  UINT64 v36; 
  UINT64 v37; 
  INT64 v38; 
  __int64 v39; 
  __int64 v40; 
  int v41; 
  char *v42; 
  VOID *v43; 
  char *v44; 
  union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v45; 
  INT64 v46; 
  UINT64 v47; 
  bool v48; 
  _MMPFNLIST *v49; 
  char *v50; 
  VOID *v51; 
  size_t v52; 
  char *v53; 
  volatile signed __int32 *v54; 
  size_t v55; 
  int v56; 
  union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v57; 
  __int64 v58; 
  __int64 v59; 
  _MMPTE v60; 
  _MI_PARTITION *v61; 
  unsigned __int64 v62; 
  unsigned __int64 v63; 
  unsigned int v64; 
  int v65; 
  unsigned __int64 v66; 
  UINT64 v67; 
  UINT64 v68; 
  _MI_PARTITION *Partition; 
  _MMPFN *v70; 
  __int64 v71; 
  UINT64 v72; 
  __int64 v73; 
  UINT64 v74; 
  _SUBSECTION *v75; 
  UINT64 OutPteOffset; 
  UINT64 v77; 
  UINT64 v78; 
  _KLOCK_QUEUE_HANDLE LockQueue[4]; 
  UINT8 PageIrql; 
  size_t v81; 
  int v82; 
  unsigned int v83; 

  v3 = NumberOfBits >> 3;
  ControlArea = Subsection->ControlArea;
  v5 = StartBit >> 3;
  memset(LockQueue, 0, 24);
  v7 = (StartBit >> 3) & 0xFFF;
  v8 = ControlArea->u1.Flags._bf_0 & 0x3FF;
  v83 = (StartBit >> 3) & 0xFFF;
  Partition = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * v8);
  v81 = ((StartBit >> 3) + v3) & 0xFFF;
  OutPteOffset = ((StartBit >> 3) + v3 - 1) >> 12;
  v9 = MiLocatePagefileSubsection(Subsection, &OutPteOffset);
  v75 = v9;
  v78 = OutPteOffset;
  SubsectionBase = v9->SubsectionBase;
  v74 = v5 >> 12;
  v11 = (unsigned __int64)&SubsectionBase[OutPteOffset];
  v12 = MiLocatePagefileSubsection(Subsection, &v74);
  if( v12->SubsectionBase )
  {
    v13 = v74;
  }
  else
  {
    do
    {
      if( v12 == v9 )
        return;
      v12 = v12->NextSubsection;
      v13 = 0i64;
      v74 = 0i64;
    }
    while( !v12->SubsectionBase );
  }
  v14 = v12->SubsectionBase;
  v15 = (unsigned __int64)&v14[v13];
  if( v12 == v9 )
    v16 = v11;
  else
    v16 = (unsigned __int64)&v14[v12->PtesInSubsection];
  v17 = v81;
  v67 = v16;
  PageIrql = 17;
  v68 = 0i64;
  v18 = v15 & -(__int64)((_DWORD)v7 != 0);
  v19 = 0i64;
  v70 = 0i64;
  v20 = 0i64;
  v71 = v18;
  v21 = v11 & -(__int64)(v81 != 0);
  v73 = v21;
  while( v15 < v16 )
  {
LABEL_7:
    if( (v20 & 0xFFFFFFFFFFFFF000ui64) != (v15 & 0xFFFFFFFFFFFFF000ui64) && v20 )
    {
      MiUnlockProtoPoolPage((ULONG_PTR)v19, PageIrql);
      v19 = 0i64;
      v68 = 0i64;
      v70 = 0i64;
    }
    if( v19 )
    {
LABEL_9:
      v22 = MiLockLeafPage((_MMPTE *)v15, 0i64);
      LODWORD(v23) = MI_READ_PTE_LOCK_FREE(v15);
      v77 = v23;
      v24 = v23;
      if( (v23 & 1) != 0 )
      {
        MiPteInShadowRange((UINT64)&v77);
        v42 = (char *)MiMapPageInHyperSpaceWorker((v24 >> 12) & 0xFFFFFFFFFi64, 0i64, 0x80000000ui64);
        v43 = v42;
        if( v15 == v18 )
        {
          v55 = 4096 - v83;
          v44 = &v42[v83];
        }
        else
        {
          v44 = v42;
          if( v15 != v21 )
          {
            KeZeroSinglePage(v42);
LABEL_46:
            MiUnmapPageInHyperSpaceWorker(v43, 0x11u, 0x80000000ui64);
            MiCaptureDirtyBitToPfn();
            _InterlockedAnd64(&v22->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
            if( !v45.Long )
              goto LABEL_26;
            v60.u.Long = v45.Long;
            v61 = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * (((unsigned __int64)v22->u4._bf_0 >> 39) & 0x3FF));
            goto LABEL_86;
          }
          v55 = v81;
        }
        memset(v44, 0i64, v55);
        goto LABEL_46;
      }
      if( (v23 & 0x400) != 0 )
        goto LABEL_26;
      if( (v23 & 0x800) == 0 )
      {
        if( v23 && v15 != v18 && v15 != v21 )
        {
          if( (v23 & 2) != 0 )
          {
            v38 = (INT64)Partition->Vp.PagingFile[(unsigned __int16)v23 >> 12];
            if( *(&stru_140C4DB30 + 42) && (v23 & 0x10) == 0 )
              v23 &= ~*(&stru_140C4DB30 + 42);
            v37 = HIDWORD(v23);
          }
          else
          {
            v37 = 0i64;
            v38 = 0i64;
          }
          LODWORD(v39) = MiTransferSoftwarePte(v24, v38, v37);
          v40 = v39;
          MiReleasePageFileSpace(Partition, (_MMPTE)v24, 0i64);
          LOBYTE(v41) = MiPteInShadowRange(v15);
          if( v41 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v40 & 1) != 0 )
            v40 |= 0x8000000000000000ui64;
          *(_QWORD *)v15 = v40;
        }
        goto LABEL_26;
      }
      if( *(&stru_140C4DB30 + 42) )
      {
        if( (v23 & 0x10) != 0 )
          v24 = v23 & 0xFFFFFFFFFFFFFFEFui64;
        else
          v24 = ~*(&stru_140C4DB30 + 42) & v23;
      }
      v25 = (v24 >> 12) & 0xFFFFFFFFFi64;
      v26.Long = 0i64;
      if( v22->u3.ReferenceCount )
        goto LABEL_25;
      if( v15 == v71 || v15 == v21 )
      {
        v48 = (*(_BYTE *)(&v22->u3 + 1) & 0x10) == 0;
        v82 = 0;
        if( !v48 )
        {
          v49 = Partition->PageLists.PageLocationList[3];
          LockQueue[0].LockQueue.Next = 0i64;
          LockQueue[0].LockQueue.Lock = &v49->Lock;
          KxAcquireQueuedSpinLock(&LockQueue[0].LockQueue, &v49->Lock);
          goto LABEL_54;
        }
        v82 = 1;
        MiUnlinkPageFromList(v22, 0i64);
        if( v56 )
        {
          MiCaptureDirtyBitToPfn();
          v26.Long = v57.Long;
          v49 = 0i64;
LABEL_54:
          v50 = (char *)MiMapPageInHyperSpaceWorker(v25, 0i64, 0x80000000ui64);
          v51 = v50;
          if( v15 == v71 )
          {
            v52 = 4096 - v83;
            v53 = &v50[v83];
          }
          else
          {
            v52 = v81;
            v53 = v50;
          }
          memset(v53, 0i64, v52);
          MiUnmapPageInHyperSpaceWorker(v51, 0x11u, 0x80000000ui64);
          if( *(&stru_140C4DB30 + 567) == 1 )
          {
            v62 = v25 & 0x1F;
            LOBYTE(v63) = 1;
            v54 = (volatile signed __int32 *)(*(&stru_140C4DB30 + 295) + 4 * (v25 >> 5));
            if( v62 + 1 > 0x20 )
            {
              if( (v25 & 0x1F) != 0 )
              {
                v65 = v25 & 0x1F;
                _InterlockedOr(v54++, ((1 << (32 - v65)) - 1) << v62);
                v63 = 1i64 - (unsigned int)(32 - v65);
                if( v63 >= 0x20 )
                {
                  v66 = v63 >> 5;
                  v63 += -32i64 * (v63 >> 5);
                  do
                  {
                    *v54++ = -1;
                    --v66;
                  }
                  while( v66 );
                }
                if( !v63 )
                  goto LABEL_57;
              }
              v64 = (1 << v63) - 1;
            }
            else
            {
              v64 = 1 << v62;
            }
            _InterlockedOr(v54, v64);
          }
LABEL_57:
          if( v49 )
            KeReleaseInStackQueuedSpinLockFromDpcLevel(LockQueue);
          if( v82 == 1 )
            MiInsertPageInList(v22, 8ui64, (UINT8)v54);
LABEL_24:
          v21 = v73;
LABEL_25:
          _InterlockedAnd64(&v22->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
          if( !v26.Long )
          {
LABEL_26:
            v19 = v70;
            v15 += 8i64;
            v9 = v75;
            v18 = v71;
            goto LABEL_27;
          }
          v61 = Partition;
          v60.u.Long = v26.Long;
LABEL_86:
          MiReleasePageFileInfo(v61, v60, 1ui64);
          goto LABEL_26;
        }
      }
      else
      {
        MiUnlinkPageFromList(v22, 0i64);
        if( v27 )
        {
          p_Long = &v22->OriginalPte.u.Long;
          v29.u.Long = MiCapturePageFileInfoInline(&v22->OriginalPte, 0i64, 0i64).u.Long;
          v30.Long = (unsigned __int64)v22->OriginalPte.u;
          v26.Long = v29.u.Long;
          if( (v30.Long & 2) != 0 )
          {
            v46 = (INT64)Partition->Vp.PagingFile[LOWORD(v30.Long) >> 12];
            if( *(&stru_140C4DB30 + 42) && (v30.Long & 0x10) == 0 )
              v30.Long &= ~*(&stru_140C4DB30 + 42);
            LODWORD(v47) = MiTransferSoftwarePte(*p_Long, v46, HIDWORD(v30.Proto._bf_0));
            v31 = v47;
          }
          else
          {
            v72 = *p_Long;
            MiSetNonResidentPteHeat(&v72, 0i64);
            v31 = v72;
            if( (v32 & 0x400) == 0 )
            {
              v31 = v72 & 0xFFFFFFFFFFFFFFF9ui64;
              v72 &= 0xFFFFFFFFFFFFFFF9ui64;
            }
          }
          v33 = &MmGetPfnDb()[v22->u4._bf_0 & 0xFFFFFFFFFi64];
          v82 = 0;
          LOBYTE(v34) = MiPteInShadowRange(v15);
          if( v34 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v31 & 1) != 0 )
            v31 |= 0x8000000000000000ui64;
          *(_QWORD *)v15 = v31;
          MiLockNestedPageAtDpcInline(v33);
          MiDecrementShareCount(v33);
          _InterlockedAnd64(&v33->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
          MiInsertPageInFreeOrZeroedList(v25, 2ui64, v35, v36, v67, v68);
          goto LABEL_24;
        }
      }
      MiDiscardTransitionPteEx(v22, 0i64);
      _InterlockedAnd64(&v22->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
      v19 = v70;
      v15 += 8i64;
      v9 = v75;
      v16 = v67;
      v18 = v71;
      v20 = v68;
      v17 = v81;
    }
    else
    {
      v70 = MiLockProtoPoolPage((_MMPTE *)v15, &PageIrql);
      v19 = v70;
      if( v70 )
      {
        v68 = v15;
        goto LABEL_9;
      }
      v15 = (v15 & 0xFFFFFFFFFFFFF000ui64) + 4096;
LABEL_27:
      v16 = v67;
      v20 = v68;
      v17 = v81;
    }
  }
  while( v12 != v9 )
  {
    v12 = v12->NextSubsection;
    if( v12->SubsectionBase )
    {
      v15 = (unsigned __int64)v12->SubsectionBase;
      if( v12 == v9 )
      {
        v58 = (__int64)&v9->SubsectionBase[v78];
        v59 = v58;
        if( !v17 )
          v59 = v21;
        v21 = v59;
        v73 = v59;
      }
      else
      {
        v58 = v15 + 8i64 * v12->PtesInSubsection;
      }
      v67 = v58;
      goto LABEL_7;
    }
  }
  if( v19 )
    MiUnlockProtoPoolPage((ULONG_PTR)v19, PageIrql);
}

Referenced by:

MiZeroCfgSystemWideBitmap