MiSectionCreated

INT64 __fastcall MiSectionCreated(INT64 a1, INT64 a2, INT64 *a3){
  INT64 *v3; 
  INT64 *v5; 
  INT64 v6; 
  unsigned __int64 v7; 
  _QWORD *v8; 
  _QWORD *v9; 
  INT64 *v10; 
  INT64 *v11; 
  __int64 v13; 
  unsigned int v14; 
  UINT64 v15; 
  UINT64 *v16; 
  unsigned __int64 v17; 
  INT64 v18; 
  UINT64 v19; 
  _MMPFN *PfnDb; 
  char *v21; 
  _MMPFN *v22; 
  __int16 v23; 
  bool v24; 
  __int64 v25; 
  unsigned int v26; 
  unsigned int v27; 
  int v28; 
  char SpinCount[12]; 
  __int64 v30; 
  INT64 v31; 
  INT64 *v33; 
  UINT8 PageIrql; 
  v33 = a3;
  v3 = (INT64 *)(a2 + 72);
  PageIrql = 0;
  v5 = a3;
  v6 = a2;
  v7 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)(a2 + 72));
  if( (*((_BYTE *)KeGetCurrentThread() + 1304) & 0x40) != 0 )
    *(_DWORD *)(v6 + 56) |= 0x200u;
  v8 = *(_QWORD **)(a1 + 40);
  if( (*(_DWORD *)(v6 + 56) & 0x20) != 0 )
  {
    v9 = (_QWORD *)v8[2];
    v10 = v9 + 9;
    ExAcquireSpinLockExclusiveAtDpcLevel(v9 + 9);
    v25 = v9[10];
    v31 = 0i64;
    *(_QWORD *)(v6 + 80) = v25;
  }
  else
  {
    v9 = (_QWORD *)*v8;
    v10 = v9 + 9;
    ExAcquireSpinLockExclusiveAtDpcLevel(v9 + 9);
    v31 = v9[10];
  }
  *(_QWORD *)(v6 + 64) = v9[8];
  ExAcquireSpinLockExclusiveAtDpcLevel((INT64 *)&dword_140C4C6C0);
  v11 = *(INT64 **)(a1 + 40);
  if( (*(_DWORD *)(v6 + 56) & 0x20) != 0 )
  {
    v11[2] = v6;
    ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&dword_140C4C6C0);
    ExReleaseSpinLockExclusiveFromDpcLevel(v10);
    ExReleaseSpinLockExclusiveFromDpcLevel(v3);
    __writecr8(v7);
    v13 = *(_QWORD *)(v6 + 136);
    v14 = *(_DWORD *)(v6 + 172);
    v30 = v13;
    v26 = v14;
    while( 1 )
    {
      if( !v5 )
        return v31;
      if( (*((_BYTE *)v5 + 10) & 4) != 0 )
        goto LABEL_29;
      MmUnmapLockedPages((PVOID)v5[3], (PMDL)v5);
      v16 = (UINT64 *)(v5 + 6);
      v17 = 0i64;
      v27 = *((_DWORD *)v5 + 4);
      v15 = v27;
      v28 = *((_DWORD *)v5 + 10) >> 12;
      v18 = v13 + 8i64 * v27;
      PageIrql = 17;
      *(_QWORD *)&SpinCount[4] = 0i64;
      if( !v28 )
        goto LABEL_29;
      do
      {
        v19 = *v16;
        PfnDb = MmGetPfnDb();
        v21 = (char *)PfnDb + 48 * *v16;
        if( (unsigned int)v15 < v14 )
        {
          if( (v18 & 0xFFFFFFFFFFFFF000ui64) != v17 )
          {
            if( v17 )
            {
              LOBYTE(v15) = PageIrql;
              MiUnlockProtoPoolPage(*(_MMPFN **)&SpinCount[4], v15);
            }
            while( 1 )
            {
              *(_QWORD *)&SpinCount[4] = MiLockProtoPoolPage((_MMPTE *)v18, &PageIrql);
              if( *(_QWORD *)&SpinCount[4] )
                break;
              MmAccessFault(2ui64, (PVOID)v18, 0, 0i64);
            }
            v6 = a2;
            v17 = v18 & 0xFFFFFFFFFFFFF000ui64;
          }
          v22 = MiLockLeafPage((_MMPTE *)v18, 0i64);
          v23 = MI_READ_PTE_LOCK_FREE(v18);
          if( v22 )
          {
            _InterlockedAnd64((volatile signed __int64 *)v22 + 3, 0x7FFFFFFFFFFFFFFFui64);
          }
          else if( (v23 & 0x400) != 0 )
          {
            *(_DWORD *)SpinCount = 0;
            while( _interlockedbittestandset64((volatile signed __int32 *)v21 + 6, 0x3Fui64) )
            {
              do
                KeYieldProcessorEx((UINT64 *)SpinCount);
              while( *((__int64 *)v21 + 3) < 0 );
            }
            MiInitializeTransitionPfn(v19, (MMPTE *)v18);
            _InterlockedAnd64((volatile signed __int64 *)v21 + 3, 0x7FFFFFFFFFFFFFFFui64);
            if( (*((_DWORD *)v21 + 4) & 0x400i64) != 0 )
              MiReferenceControlAreaPfn((_CONTROL_AREA *)v6, 0i64, 1ui64);
            goto LABEL_24;
          }
          MiReturnPfnReferenceCount((_MMPFN *)v21);
          *v16 = -1i64;
LABEL_24:
          v14 = v26;
          goto LABEL_25;
        }
        MiReturnPfnReferenceCount((_MMPFN *)((char *)PfnDb + 48 * *v16));
        *v16 = -1i64;
LABEL_25:
        v18 += 8i64;
        v15 = v27 + 1;
        ++v16;
        v24 = v28-- == 1;
        ++v27;
      }
      while( !v24 );
      v5 = v33;
      if( v17 )
      {
        LOBYTE(v15) = PageIrql;
        MiUnlockProtoPoolPage(*(_MMPFN **)&SpinCount[4], v15);
      }
      v13 = v30;
LABEL_29:
      v5 = (INT64 *)*v5;
      v33 = v5;
    }
  }
  *v11 = v6;
  ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&dword_140C4C6C0);
  ExReleaseSpinLockExclusiveFromDpcLevel(v10);
  *(_DWORD *)(v6 + 56) &= ~2u;
  ExReleaseSpinLockExclusiveFromDpcLevel(v3);
  __writecr8(v7);
  KeAbPostRelease(v11);
  return v31;
}

Referenced by:

No references.