MiLargePageFreeToZero

VOID __stdcall MiLargePageFreeToZero(UINT64 BaseLargePage, UINT64 LargePageIndex, UINT8 a3){
  char v3; 
  UINT64 v5; 
  char v6; 
  _MMPFN *PfnDb; 
  int v8; 
  INT64 v9; 
  __int64 v10; 
  unsigned __int64 v11; 
  __int64 v12; 
  __int64 v13; 
  __int64 v14; 
  __int64 v15; 
  UINT64 v16; 
  volatile signed __int32 *v17; 
  int v18; 
  unsigned __int64 v19; 
  __int64 v20; 
  _QWORD *v21; 
  __int64 v22; 
  __int64 v23; 
  __int64 v24; 
  unsigned __int64 v25; 
  unsigned __int64 v26; 
  UINT64 v27; 
  unsigned __int64 v28; 
  volatile signed __int32 *v29; 
  unsigned int v30; 
  unsigned __int64 v31; 
  unsigned __int64 v32; 
  UINT64 v33; 
  INT64 *v34; 
  __int64 *v35; 
  UINT64 v36; 
  __int64 v37; 
  __int64 v38; 
  _KLOCK_QUEUE_HANDLE LockQueue[3]; 
  __int64 v40; 
  __int64 v41; 
  unsigned int PfnChannel; 

  *(_QWORD *)&LockQueue[0].OldIrql = 0i64;
  v5 = BaseLargePage;
  v6 = v3;
  PfnDb = MmGetPfnDb();
  v8 = a3;
  v9 = (INT64)&PfnDb[v5];
  v10 = (unsigned int)LargePageIndex;
  v40 = (unsigned int)LargePageIndex;
  v11 = MiLargePageSizes[(unsigned int)LargePageIndex];
  v35 = &MiLargePageSizes[(unsigned int)LargePageIndex];
  LODWORD(v12) = MiSearchNumaNodeTable((PVOID)((v9 - (__int64)PfnDb) / 48));
  v13 = *(unsigned int *)(v12 + 8);
  PfnChannel = MiGetPfnChannel(v9);
  v37 = *(_QWORD *)(*(&stru_140C4DB30 + 267) + 8 * ((*(_QWORD *)(v9 + 40) >> 39) & 0x3FFi64));
  v14 = *(_QWORD *)(v37 + 16) + 4544 * v13;
  LockQueue[0].LockQueue.Next = 0i64;
  LockQueue[0].LockQueue.Lock = (unsigned __int64 *volatile)(v14 + 4328);
  KxAcquireQueuedSpinLock(&LockQueue[0].LockQueue, (UINT64 *)(v14 + 4328));
  *(_BYTE *)(v9 + 34) &= ~8u;
  v15 = *(_QWORD *)(v9 + 16);
  *(_QWORD *)(v15 + 24) = 0i64;
  *(_BYTE *)(v15 + 69) = 1;
  *(_QWORD *)(v9 + 16) = MiSwizzleInvalidPte(128i64);
  if( !v6 )
  {
    v20 = *(_QWORD *)v9;
    if( *(_QWORD *)(*(_QWORD *)v9 + 8i64) != v9 )
      goto LABEL_39;
    v21 = *(_QWORD **)(v9 + 8);
    if( *v21 != v9 )
      goto LABEL_39;
    *v21 = v20;
    *(_QWORD *)(v20 + 8) = v21;
    if( v8 )
      MiSetFreeZeroPfnCold((PDRIVER_OBJECT)v9, (PVOID)1);
    if( (MiFlags & 0x80u) != 0 && (++*(&stru_140C4DB30 + 631) & MmPageValidationFrequency) == 0 )
      MiArePageContentsZero((PVOID)BaseLargePage);
    v38 = 1072 * v10;
    --*(_QWORD *)(1072 * v10 + v14 + 8);
    v22 = 1072 * v10 + (BaseLargePage < 0x100000 ? 0x10 : 0) + v14;
    v23 = v40;
    --*(_QWORD *)(v22 + 24);
    v24 = 4i64;
    v41 = 134 * v40;
    if( BaseLargePage < 0x100000 )
      v24 = 12i64;
    v25 = (unsigned __int64)*(unsigned __int8 *)(v9 + 34) >> 6;
    v26 = v25 + 134 * v23 + 4 * (PfnChannel + v24);
    v36 = 24 * (BaseLargePage / *v35 % *((unsigned int *)&stru_140C4DB30 + v23 + 100));
    --*(_QWORD *)(v36 + *(_QWORD *)(v14 + 8 * v26 + 560) + 16);
    --*(_QWORD *)(v14 + 8 * v26 + 48);
    _InterlockedExchangeAdd64((volatile signed __int64 *)(v37 + 2304), -(__int64)v11);
    if( *(&stru_140C4DB30 + 567) == 1 )
    {
      v27 = BaseLargePage & 0x1F;
      v28 = v11;
      v29 = (volatile signed __int32 *)(*(&stru_140C4DB30 + 295) + 4 * (BaseLargePage >> 5));
      if( v27 + v11 <= 0x20 )
      {
        if( v11 == 32 )
        {
          *v29 = -1;
          goto LABEL_37;
        }
        v30 = ((1 << v11) - 1) << v27;
        goto LABEL_36;
      }
      if( (BaseLargePage & 0x1F) != 0 )
      {
        _InterlockedOr(v29, ((1 << (32 - (BaseLargePage & 0x1F))) - 1) << v27);
        v28 = v11 - (32 - (unsigned int)(BaseLargePage & 0x1F));
        ++v29;
      }
      if( v28 >= 0x20 )
      {
        v31 = v28 >> 5;
        v28 += -32i64 * (v28 >> 5);
        do
        {
          *v29++ = -1;
          --v31;
        }
        while( v31 );
      }
      if( v28 )
      {
        v30 = (1 << v28) - 1;
LABEL_36:
        _InterlockedOr(v29, v30);
      }
    }
LABEL_37:
    *(_BYTE *)(v9 + 34) &= 0xF8u;
    v32 = v41 + v25 + 4 * (PfnChannel + (unsigned __int64)(BaseLargePage < 0x100000 ? 8 : 0));
    v33 = *(_QWORD *)(v14 + 8 * v32 + 560) + v36;
    v34 = *(INT64 **)(v33 + 8);
    if( *v34 == v33 )
    {
      *(_QWORD *)v9 = v33;
      *(_QWORD *)(v9 + 8) = v34;
      *v34 = v9;
      *(_QWORD *)(v33 + 8) = v9;
      ++*(_QWORD *)(v33 + 16);
      ++*(_QWORD *)(v14 + 8 * v32 + 48);
      ++*(_QWORD *)(v38 + v14);
      ++*(_QWORD *)(v22 + 16);
      _InterlockedExchangeAdd64((volatile signed __int64 *)(v37 + 2240), v11);
      goto LABEL_6;
    }
LABEL_39:
    __fastfail(3u);
  }
  if( *(&stru_140C4DB30 + 567) == 1 )
  {
    v16 = BaseLargePage & 0x1F;
    v17 = (volatile signed __int32 *)(*(&stru_140C4DB30 + 295) + 4 * (BaseLargePage >> 5));
    if( v16 + v11 > 0x20 )
    {
      if( (BaseLargePage & 0x1F) != 0 )
      {
        v18 = BaseLargePage & 0x1F;
        _InterlockedOr(v17, ((1 << (32 - v18)) - 1) << v16);
        v11 -= (unsigned int)(32 - v18);
        ++v17;
      }
      if( v11 >= 0x20 )
      {
        v19 = v11 >> 5;
        v11 += -32i64 * (v11 >> 5);
        do
        {
          *v17++ = -1;
          --v19;
        }
        while( v19 );
      }
      if( v11 )
        _InterlockedOr(v17, (1 << v11) - 1);
    }
    else if( v11 == 32 )
    {
      *v17 = -1;
    }
    else
    {
      _InterlockedOr(v17, ((1 << v11) - 1) << v16);
    }
  }
LABEL_6:
  KeReleaseInStackQueuedSpinLockFromDpcLevel(LockQueue);
}

Referenced by:

MiZeroPage