MiConvertStandbyToProto

INT64 __fastcall MiConvertStandbyToProto(
        CHAR *a1,
        _QWORD *a2,
        INT64 a3,
        CHAR a4,
        INT64 a5,
        UINT64 P2,
        INT64 a7,
        INT64 a8){
  unsigned int v8; 
  UINT64 v9; 
  __int64 v10; 
  __int64 v11; 
  char v12; 
  __int64 v13; 
  MMPTE *v14; 
  volatile INT64 **v15; 
  volatile INT64 *v16; 
  UINT64 v17; 
  INT64 TransitionPte; 
  unsigned __int8 v19; 
  UINT64 *v21; 
  char v22; 
  char v23; 
  UINT64 v24; 
  char v25; 
  bool v26; 
  char *v27; 
  INT64 v28; 
  __int64 v29; 
  UINT64 *v30; 
  UINT8 *v31; 
  UINT8 *v32; 
  _MMPFN *PfnDb; 
  unsigned __int64 v34; 
  struct _KPRCB *CurrentPrcb; 
  __int64 v36; 
  signed __int32 v37; 
  INT64 v38; 
  _MMPFN *v39; 
  UINT64 v40; 
  _MMPFN *v41; 
  UINT64 v42; 
  __int128 v43; 
  INT64 ContainingPageTable; 
  MMPTE *PointerPte; 
  volatile INT64 *a1a; 
  UINT64 a2a; 
  UINT64 SpinCount; 
  UINT64 *SecondPage; 
  UINT64 v50; 
  _MMPFN *v51; 
  volatile INT64 *v52; 
  __int64 Pcsa; 
  unsigned int PrivatePfn; 
  PrivatePfn = a4;
  v8 = *(_DWORD *)(a5 + 40) & 0x1F;
  *(_QWORD *)((char *)&v43 + 4) = v8;
  v9 = MiMakePrototypePteDirect(a5 + 48) | 0x800;
  v50 = v9;
  v11 = (__int64)((*(_QWORD *)(v10 + 56) << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
  SecondPage = (UINT64 *)v11;
  LOWORD(v43) = 256;
  v12 = 1;
  v14 = *(MMPTE **)(qword_140C4E388 + 8i64 * *(unsigned __int16 *)(v13 + 174));
  PointerPte = v14;
  v16 = *v15;
  a1a = *v15;
  v52 = *v15;
  if( a8 == -1 )
  {
    BYTE1(v43) = 1;
    if( v16 != (volatile INT64 *)v14 )
    {
      v19 = 1;
      LOBYTE(v43) = 1;
      if( !MiGetCrossPartitionCombineCharges(v16, 1i64) )
        goto LABEL_15;
      BYTE1(v43) = 0;
    }
    v39 = MiLockProtoPoolPage((_MMPTE *)(a5 + 48), 0i64);
    v41 = v39;
    v51 = v39;
    if( v39 )
    {
      if( _interlockedbittestandset64((volatile signed __int32 *)(P2 + 24), 0x3Fui64) )
      {
        LOBYTE(v40) = 17;
        MiUnlockProtoPoolPage(v39, v40);
      }
      else
      {
        if( a7 == (*(_QWORD *)(P2 + 8) | 0x8000000000000000ui64)
          && PointerPte == *(MMPTE **)(qword_140C4E388 + 8 * ((*(_QWORD *)(P2 + 40) >> 39) & 0x3FFi64))
          && (unsigned int)MiRecheckCombineVm(
                             (_MI_PAGE_COMBINING_SUPPORT *)a2,
                             (_MMPFN *)PrivatePfn,
                             (_MMSUPPORT_INSTANCE *)P2) )
        {
          MiTryLockLeafPage((_MMPTE *)(a5 + 48), v42);
        }
        MiUnlockNestedProtoPoolPage(v41);
        _InterlockedAnd64((volatile signed __int64 *)(P2 + 24), 0x7FFFFFFFFFFFFFFFui64);
      }
    }
    v19 = v43;
    goto LABEL_15;
  }
  *((_QWORD *)&v43 + 1) = (char *)MmGetPfnDb() + 48 * a8;
  if( !(unsigned int)MiFillCombinePage(
                        (_MI_PAGE_COMBINING_SUPPORT *)v16,
                        *((_MMPFN **)&v43 + 1),
                        (_MMPFN *)P2,
                        (VOID *)v11) )
    goto LABEL_14;
  TransitionPte = MiMakeTransitionPte(a8, v8, v17);
  SecondPage = (UINT64 *)((a5 + 48) & 0x7FFFFFFFFFFFFFFFi64);
  a2a = 0i64;
  ContainingPageTable = MiGetContainingPageTable(a5 + 48);
  if( a1a != (volatile INT64 *)PointerPte )
  {
    if( MiGetCrossPartitionCombineCharges(a1a, 0i64) )
    {
      v12 = 0;
      BYTE1(v43) = 0;
      goto LABEL_6;
    }
LABEL_14:
    v19 = 0;
LABEL_15:
    if( !BYTE1(v43) )
      MiReturnCrossPartitionCombineCharges(a1a, v19);
    return 0i64;
  }
LABEL_6:
  LODWORD(SpinCount) = 0;
  while( _interlockedbittestandset64((volatile signed __int32 *)(P2 + 24), 0x3Fui64) )
  {
    do
      KeYieldProcessorEx(&SpinCount);
    while( *(__int64 *)(P2 + 24) < 0 );
  }
  if( (**(_BYTE **)(a3 + 56) & 1) == 0
    || (unsigned __int8)((*(_BYTE *)(P2 + 34) & 7) - 2) > 1u
    || PointerPte != *(MMPTE **)(qword_140C4E388 + 8 * ((*(_QWORD *)(P2 + 40) >> 39) & 0x3FFi64))
    || a7 != (*(_QWORD *)(P2 + 8) | 0x8000000000000000ui64)
    || !(unsigned int)MiRecheckCombineVm(
                        (_MI_PAGE_COMBINING_SUPPORT *)a2,
                        (_MMPFN *)PrivatePfn,
                        (_MMSUPPORT_INSTANCE *)P2)
    || ((*(_DWORD *)(P2 + 16) >> 5) & 0x1F) != DWORD1(v43) )
  {
    goto LABEL_13;
  }
  if( !(unsigned int)MiUnlinkPageFromList((_MMPFN *)P2, 0i64) )
  {
    MiDiscardTransitionPteEx(P2, 0i64);
LABEL_13:
    _InterlockedAnd64((volatile signed __int64 *)(P2 + 24), 0x7FFFFFFFFFFFFFFFui64);
    goto LABEL_14;
  }
  v21 = (UINT64 *)(P2 + 16);
  if( (*(_BYTE *)(P2 + 34) & 0x10) == 0 && !IS_PTE_NOT_DEMAND_ZERO(*v21) )
    *(_BYTE *)(P2 + 34) = v22 | 0x10;
  v23 = 0;
  if( (*v21 & 2) != 0 )
  {
    if( v12 && !(unsigned int)MI_IS_PTE_IN_WS_SWAP_SET(PointerPte) )
      a2a = v24;
    else
      v23 = 1;
    v25 = 1;
  }
  else
  {
    v26 = v12 == 0;
    v25 = 0;
    if( v26 && (*v21 & 4) != 0 )
      v23 = 1;
  }
  if( v23 )
  {
    a2a = MiCapturePageFileInfoInline(v21, 1i64, 1i64);
    *(_BYTE *)(P2 + 34) |= 0x10u;
    v21 = (UINT64 *)(P2 + 16);
  }
  if( v25 )
    *v21 &= ~2ui64;
  v27 = (char *)MmGetPfnDb() + 48 * ContainingPageTable;
  MiLockNestedPageAtDpcInline((INT64)v27);
  *((_QWORD *)v27 + 3) ^= (*((_QWORD *)v27 + 3) ^ ((*((_QWORD *)v27 + 3) & 0x3FFFFFFFFFFFFFFFi64) + 1)) & 0x3FFFFFFFFFFFFFFFi64;
  _InterlockedAnd64((volatile signed __int64 *)v27 + 3, 0x7FFFFFFFFFFFFFFFui64);
  MiLockNestedPageAtDpcInline(*((INT64 *)&v43 + 1));
  MiFinalizePageAttribute(*((_MMPFN **)&v43 + 1), (_MI_PFN_CACHE_ATTRIBUTE)(*(unsigned __int8 *)(P2 + 34) >> 6), 1ui64);
  MiCopyPfnEntryEx(*((INT64 *)&v43 + 1), P2);
  if( (unsigned int)MiGetPfnPriority(v28) < 5 )
    *(_BYTE *)(*((_QWORD *)&v43 + 1) + 35i64) = *(_BYTE *)(*((_QWORD *)&v43 + 1) + 35i64) & 0xF8 | 5;
  *(_QWORD *)(*((_QWORD *)&v43 + 1) + 8i64) = SecondPage;
  *(_QWORD *)(*((_QWORD *)&v43 + 1) + 40i64) = ContainingPageTable & 0xFFFFFFFFFi64 | *(_QWORD *)(*((_QWORD *)&v43 + 1)
                                                                                                + 40i64) & 0xFFFFFFF000000000ui64 | 0x8000000000000000ui64;
  *(_QWORD *)(*((_QWORD *)&v43 + 1) + 24i64) &= 0xC000000000000000ui64;
  MI_MAKE_PROTECT_WRITE_COPY((_MMPTE *)(*((_QWORD *)&v43 + 1) + 16i64));
  if( !BYTE1(v43) )
    *(_QWORD *)(a5 + 56) = 1i64;
  *(_QWORD *)(a5 + 48) = 0i64;
  *(_QWORD *)(a5 + 48) = TransitionPte;
  Pcsa = *(_QWORD *)(P2 + 40) & 0xFFFFFFFFFi64;
  LODWORD(v29) = MiMapPageInHyperSpaceWorker(Pcsa, 0i64, 0x80000000ui64);
  v30 = (UINT64 *)(v29 + (*(_DWORD *)(P2 + 8) & 0xFFF));
  *v30 = v9;
  MiUnmapPageInHyperSpaceWorker(v30, 0x11u, 0x80000000ui64);
  *(_QWORD *)(P2 + 24) |= 0x4000000000000000ui64;
  MiPfnReferenceCountIsZero(*((_MMPFN **)&v43 + 1), a8, v31);
  _InterlockedAnd64((volatile signed __int64 *)(*((_QWORD *)&v43 + 1) + 24i64), 0x7FFFFFFFFFFFFFFFui64);
  if( BYTE1(v43) )
  {
    if( (*(_QWORD *)(P2 + 16) & 4) != 0 )
    {
      *(_QWORD *)(P2 + 16) &= ~4ui64;
      if( a2a )
        a2a &= ~4ui64;
    }
  }
  *(_QWORD *)(P2 + 24) &= 0xC000000000000000ui64;
  PfnDb = MmGetPfnDb();
  MiPfnReferenceCountIsZero((_MMPFN *)P2, (__int64)(P2 - (_QWORD)PfnDb) / 48, v32);
  _InterlockedAnd64((volatile signed __int64 *)(P2 + 24), 0x7FFFFFFFFFFFFFFFui64);
  if( BYTE1(v43) )
  {
    MiReturnCommit((_MI_PARTITION *)PointerPte, 1ui64);
    v34 = 1i64;
    if( PointerPte != (MMPTE *)&MiSystemPartition )
      goto LABEL_58;
    CurrentPrcb = KeGetCurrentPrcb();
    v36 = *((int *)CurrentPrcb + 8391);
    if( (_DWORD)v36 == -1 )
      goto LABEL_58;
    if( (unsigned __int64)(v36 + 1) <= 0x100 )
    {
      do
      {
        v37 = _InterlockedCompareExchange((volatile signed __int32 *)CurrentPrcb + 8391, v36 + 1, v36);
        v26 = (_DWORD)v36 == v37;
        LODWORD(v36) = v37;
        if( v26 )
          goto LABEL_59;
      }
      while( v37 != -1 && (unsigned __int64)(v37 + 1i64) <= 0x100 );
    }
    if( (int)v36 > 192
      && (_DWORD)v36 != -1
      && (_DWORD)v36 == _InterlockedCompareExchange((volatile signed __int32 *)CurrentPrcb + 8391, 192, v36) )
    {
      v34 = (int)v36 - 192 + 1i64;
    }
    if( v34 )
LABEL_58:
      _InterlockedExchangeAdd64((volatile signed __int64 *)PointerPte + 896, v34);
LABEL_59:
    if( a1a == (volatile INT64 *)&MiSystemPartition )
      _InterlockedExchangeAdd64(&qword_140C4ECF8, 0xFFFFFFFFFFFFFFFFui64);
  }
  MiLockAndDecrementShareCount((UINT64)PfnDb + 48 * Pcsa, 0);
  if( a2a )
    MiReleasePageFileInfo(
      (INT64)PointerPte,
      a2a,
      1,
      v38,
      v43,
      *((INT64 *)&v43 + 1),
      ContainingPageTable,
      (INT64)PointerPte,
      (INT64)a1a,
      a2a,
      SpinCount,
      (INT64)SecondPage);
  if( (a1[184] & 7) == 0 )
    _InterlockedExchangeAdd64(
      (volatile signed __int64 *)(*((_QWORD *)KeGetCurrentThread() + 23) + 1272i64),
      0xFFFFFFFFFFFFFFFFui64);
  return 1i64;
}

Referenced by:

MiSharePages