MiConvertPrivateToProto

INT64 __fastcall MiConvertPrivateToProto(
        INT64 a1,
        UINT64 a2,
        __int64 a3,
        __int64 a4,
        _MI_PARTITION **a5,
        INT64 a6,
        __int64 a7){
  UINT64 v7; 
  unsigned __int64 v10; 
  _MMPFN *PfnDb; 
  INT64 v12; 
  __int64 v13; 
  volatile INT64 *v14; 
  __int64 v15; 
  MMPTE *v16; 
  INT64 v17; 
  UINT64 v18; 
  char *v19; 
  unsigned int v20; 
  char v21; 
  _QWORD *v22; 
  __int64 v23; 
  UINT64 v24; 
  INT64 v25; 
  UINT64 v26; 
  INT64 v27; 
  INT64 v28; 
  UINT64 v29; 
  INT64 v30; 
  __int64 v31; 
  volatile INT64 *v32; 
  unsigned __int64 v33; 
  struct _KPRCB *CurrentPrcb; 
  __int64 v35; 
  bool v36; 
  signed __int32 v37; 
  INT64 v38; 
  _MMPFN *v39; 
  _MMPFN *v40; 
  UINT64 v41; 
  INT64 v42; 
  volatile INT64 *v44; 
  UINT64 *v45; 
  UINT64 *v46; 
  UINT64 v47; 
  INT64 v48; 
  INT64 v49; 
  CHAR WsleContents; 
  CHAR v51; 
  BOOL v52; 
  char v53; 
  __int64 v54; 
  INT64 v55; 
  char *v56; 
  unsigned __int64 v57; 
  unsigned int v58; 
  __int64 v59; 
  __int64 v60; 
  unsigned int v61; 
  INT64 v62; 
  INT64 v63; 
  INT64 v64; 
  UINT8 v65; 
  volatile INT64 *v66; 
  INT64 v67; 
  INT64 a10; 
  volatile INT64 *a1a; 
  UINT64 v70; 
  UINT64 SpinCount; 
  UINT64 v72; 
  INT64 v73; 
  MMPTE *PointerPte; 
  INT64 v75; 
  __int64 v76; 
  UINT64 v77; 
  UINT64 ContainingPageTable; 
  __int64 v79; 
  UINT64 a2a[2]; 
  __int128 v81; 
  EVENT_DATA_DESCRIPTOR EventData; 
  v7 = a3 + 48;
  v73 = a1;
  *(_OWORD *)a2a = 0i64;
  v81 = 0i64;
  v75 = a6;
  v76 = a3;
  v66 = (volatile INT64 *)a2;
  v79 = *((_QWORD *)KeGetCurrentThread() + 23);
  LODWORD(v67) = HIDWORD(PerfGlobalGroupMask) & 0x8000001;
  a10 = MI_READ_PTE_LOCK_FREE(a2);
  v10 = MI_READ_PTE_LOCK_FREE((INT64)&a10);
  PfnDb = MmGetPfnDb();
  v12 = (INT64)PfnDb + 48 * ((v10 >> 12) & 0xFFFFFFFFFi64);
  v13 = *(unsigned __int16 *)(a1 + 174);
  v14 = (volatile INT64 *)*a5;
  a1a = (volatile INT64 *)*a5;
  v15 = (__int64)((a2 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
  v70 = v15;
  v16 = *(MMPTE **)(qword_140C4E388 + 8 * v13);
  PointerPte = v16;
  LOWORD(v64) = 1;
  if( a7 == -1 )
  {
    LOBYTE(v64) = 1;
    if( v14 != (volatile INT64 *)v16 )
    {
      BYTE1(v64) = 1;
      if( !MiGetCrossPartitionCombineCharges(v14, 1i64) )
        return 0i64;
      LOBYTE(v64) = 0;
    }
    v39 = MiLockProtoPoolPage((_MMPTE *)v7, 0i64);
    if( v39 )
    {
      v40 = MiLockLeafPage((_MMPTE *)v7, 0i64);
      v42 = (INT64)v40;
      if( v40 )
      {
        if( (*((_BYTE *)v40 + 35) & 0x40) == 0 && !MiIsPageOnBadList((INT64)v40) )
        {
          v44 = a1a;
          if( a1a == *(volatile INT64 **)(qword_140C4E388 + 8 * ((*(_QWORD *)(v42 + 40) >> 39) & 0x3FFi64))
            && ((*(_BYTE *)(v42 + 34) & 7) == 6 || (*(_BYTE *)(v42 + 34) & 0x20) == 0) )
          {
            LODWORD(v45) = MiMapPageInHyperSpaceWorker((v42 - (__int64)MmGetPfnDb()) / 48, 0i64, 0x80000000ui64);
            v46 = v45;
            v65 = MiComparePages(v45, (UINT64 *)v15);
            MiUnmapPageInHyperSpaceWorker(v46, 0x11u, 0x80000000ui64);
            if( v65 == 1 )
            {
              MiGetPfnPriority(v12);
              MiUpdatePfnPriority(v42);
            }
            _InterlockedAnd64((volatile signed __int64 *)(v42 + 24), 0x7FFFFFFFFFFFFFFFui64);
            LOBYTE(v47) = 17;
            MiUnlockProtoPoolPage(v39, v47);
            if( v65 )
            {
              if( (_DWORD)dword_140C4E568 )
                MI_WSLE_LOG_ACCESS(v73, (UINT64)v66);
              v48 = MiSwizzleInvalidPte((v7 << 16) | 0x400) | 0x800;
              WsleContents = MiGetWsleContents(v49, v70);
              LODWORD(v72) = 0;
              v51 = WsleContents;
              while( _interlockedbittestandset64((volatile signed __int32 *)(v12 + 24), 0x3Fui64) )
              {
                do
                  KeYieldProcessorEx(&v72);
                while( *(__int64 *)(v12 + 24) < 0 );
              }
              if( (*(_QWORD *)(v12 + 24) & 0x3FFFFFFFFFFFFFFFi64) == 1 && *(_WORD *)(v12 + 32) == 1 )
              {
                v52 = MI_WRITE_INVALID_PTE_TB_FLUSH_NEEDED(v66, v48);
                if( (_DWORD)v67 )
                  MiIdentifyPfn((_MMPFN *)v12, a2a);
                v53 = *(_BYTE *)(v12 + 34);
                *(_QWORD *)(v12 + 24) |= 0x4000000000000000ui64;
                v54 = *(_QWORD *)(v12 + 40) & 0xFFFFFFFFFi64;
                *(_BYTE *)(v12 + 34) = v53 | 7;
                _InterlockedAnd64((volatile signed __int64 *)(v12 + 24), 0x7FFFFFFFFFFFFFFFui64);
                if( v52 )
                  MiInsertTbFlushEntry(v75, v70, 1i64, 0i64);
                v38 = v73;
                LODWORD(v63) = 1;
                LODWORD(v62) = 10;
                MiRemoveWsle(v73, v70, (UINT8 *)1, v51, v62, v63);
                MiRebuildPageTableLeafAges(v55, v70);
                v56 = (char *)MmGetPfnDb() + 48 * v54;
                HIDWORD(v72) = 0;
                while( _interlockedbittestandset64((volatile signed __int32 *)v56 + 6, 0x3Fui64) )
                {
                  do
                    KeYieldProcessorEx((UINT64 *)((char *)&v72 + 4));
                  while( *((__int64 *)v56 + 3) < 0 );
                }
                MiDecrementShareCount((UINT64)v56);
                _InterlockedAnd64((volatile signed __int64 *)v56 + 3, 0x7FFFFFFFFFFFFFFFui64);
                if( !(_BYTE)v64 && _InterlockedIncrement64((volatile signed __int64 *)(v76 + 56)) != 1 )
                  MiReturnCrossPartitionCombineCharges(v44, 1i64);
                MiResolveProtoCombine((UINT64)v66, v38, (INT64 *)v7);
                goto LABEL_97;
              }
              _InterlockedAnd64((volatile signed __int64 *)(v12 + 24), 0x7FFFFFFFFFFFFFFFui64);
            }
            v14 = v44;
            goto LABEL_68;
          }
        }
        _InterlockedAnd64((volatile signed __int64 *)(v42 + 24), 0x7FFFFFFFFFFFFFFFui64);
      }
      LOBYTE(v41) = 17;
      MiUnlockProtoPoolPage(v39, v41);
    }
    v14 = a1a;
LABEL_68:
    if( !(_BYTE)v64 )
      MiReturnCrossPartitionCombineCharges(v14, BYTE1(v64));
    return 0i64;
  }
  v17 = (INT64)PfnDb + 48 * a7;
  if( !(unsigned int)MiFillCombinePage((_MI_PAGE_COMBINING_SUPPORT *)a7, (_MMPFN *)v17, (_MMPFN *)v12, (VOID *)v15) )
    return 0i64;
  v77 = v7 & 0x7FFFFFFFFFFFFFFFi64;
  v18 = 0i64;
  ContainingPageTable = MiGetContainingPageTable(v7);
  v19 = (char *)MmGetPfnDb() + 48 * ContainingPageTable;
  if( v14 != (volatile INT64 *)PointerPte )
  {
    if( MiGetCrossPartitionCombineCharges(v14, 0i64) )
    {
      LOBYTE(v64) = 0;
      goto LABEL_6;
    }
    return 0i64;
  }
LABEL_6:
  LODWORD(SpinCount) = 0;
  while( _interlockedbittestandset64((volatile signed __int32 *)(v12 + 24), 0x3Fui64) )
  {
    do
      KeYieldProcessorEx(&SpinCount);
    while( *(__int64 *)(v12 + 24) < 0 );
  }
  v20 = 1;
  if( (*(_QWORD *)(v12 + 24) & 0x3FFFFFFFFFFFFFFFi64) != 1 || *(_WORD *)(v12 + 32) != 1 )
  {
    _InterlockedAnd64((volatile signed __int64 *)(v12 + 24), 0x7FFFFFFFFFFFFFFFui64);
    goto LABEL_68;
  }
  if( (_DWORD)v67 )
  {
    MiIdentifyPfn((_MMPFN *)v12, a2a);
    v20 = 1;
  }
  if( (a10 & 0x42) != 0 )
    a10 &= 0xFFFFFFFFFFFFFFBDui64;
  if( (*(_BYTE *)(v12 + 34) & 0x10) == 0 && !IS_PTE_NOT_DEMAND_ZERO(*(_QWORD *)(v12 + 16)) )
    *(_BYTE *)(v12 + 34) = v21 | 0x10;
  v22 = (_QWORD *)(v12 + 16);
  v23 = *(_QWORD *)(v12 + 16);
  if( (((unsigned __int8)v23 >> 1) & (unsigned __int8)v20) != 0 )
  {
    if( (_BYTE)v64 && !(unsigned int)MI_IS_PTE_IN_WS_SWAP_SET(PointerPte) )
    {
      v18 = v24;
    }
    else
    {
      v18 = MiCapturePageFileInfoInline((UINT64 *)(v12 + 16), v20, v20);
      *(_BYTE *)(v12 + 34) |= 0x10u;
    }
    *v22 &= ~2ui64;
  }
  else if( !(_BYTE)v64 && (((unsigned __int8)v23 >> 2) & (unsigned __int8)v20) != 0 )
  {
    v18 = MiCapturePageFileInfoInline((UINT64 *)(v12 + 16), v20, v20);
    *(_BYTE *)(v12 + 34) |= 0x10u;
  }
  MiLockNestedPageAtDpcInline(v17);
  MiFinalizePageAttribute((_MMPFN *)v17, (_MI_PFN_CACHE_ATTRIBUTE)(*(unsigned __int8 *)(v12 + 34) >> 6), 1ui64);
  MiCopyPfnEntryEx(v17, v12);
  if( (unsigned int)MiGetPfnPriority(v25) < 5 )
    *(_BYTE *)(v17 + 35) = *(_BYTE *)(v17 + 35) & 0xF8 | 5;
  v26 = ContainingPageTable;
  *(_QWORD *)(v17 + 8) = v77;
  *(_QWORD *)(v17 + 40) = *(_QWORD *)(v17 + 40) & 0xFFFFFFF000000000ui64 | v26 & 0xFFFFFFFFFi64 | 0x8000000000000000ui64;
  MI_MAKE_PROTECT_WRITE_COPY((_MMPTE *)(v17 + 16));
  _InterlockedAnd64((volatile signed __int64 *)(v17 + 24), 0x7FFFFFFFFFFFFFFFui64);
  if( (_BYTE)v64 )
  {
    if( (*v22 & 4) != 0 )
    {
      *v22 &= ~4ui64;
      if( v18 )
        v18 &= ~4ui64;
    }
  }
  v27 = a10 ^ (a10 ^ (a7 << 12)) & 0xFFFFFFFFF000i64;
  a10 = v27;
  v28 = v27;
  if( (v27 & 0x800) != 0 )
  {
    v27 = v27 & 0xFFFFFFFFFFFFF5FFui64 | 0x200;
    a10 = v27;
    v28 = v27;
  }
  MiWriteValidPteNewPage((INT64 *)v66, v27, 0i64);
  if( !(_BYTE)v64 )
    *(_QWORD *)(v76 + 56) = 1i64;
  *(_QWORD *)v7 = 0i64;
  LODWORD(v66) = 0;
  *(_QWORD *)v7 = v28;
  *(_QWORD *)(v12 + 24) |= 0x4000000000000000ui64;
  *(_BYTE *)(v12 + 34) |= 7u;
  _InterlockedAnd64((volatile signed __int64 *)(v12 + 24), 0x7FFFFFFFFFFFFFFFui64);
  v29 = v70;
  MiInsertTbFlushEntry(v75, v70, 1i64, 0i64);
  if( v18 )
    MiReleasePageFileInfo(
      *(_QWORD *)(qword_140C4E388 + 8 * ((*(_QWORD *)(v12 + 40) >> 39) & 0x3FFi64)),
      v18,
      1,
      v30,
      v62,
      v63,
      v64,
      (INT64)v66,
      v67,
      a10,
      (INT64)a1a,
      v70);
  HIDWORD(SpinCount) = 0;
  while( _interlockedbittestandset64((volatile signed __int32 *)v19 + 6, 0x3Fui64) )
  {
    do
      KeYieldProcessorEx((UINT64 *)((char *)&SpinCount + 4));
    while( *((__int64 *)v19 + 3) < 0 );
  }
  v31 = *((_QWORD *)v19 + 3) ^ (*((_QWORD *)v19 + 3) ^ (*((_QWORD *)v19 + 3) + 1i64)) & 0x3FFFFFFFFFFFFFFFi64;
  *((_QWORD *)v19 + 3) = v31;
  _InterlockedAnd64((volatile signed __int64 *)v19 + 3, 0x7FFFFFFFFFFFFFFFui64);
  if( (_BYTE)v64 != 1 )
    goto LABEL_57;
  v32 = a1a;
  MiReturnCommit((_MI_PARTITION *)a1a, 1ui64);
  v33 = 1i64;
  if( v32 != (volatile INT64 *)&MiSystemPartition )
    goto LABEL_54;
  CurrentPrcb = KeGetCurrentPrcb();
  v35 = *((int *)CurrentPrcb + 8391);
  if( (_DWORD)v35 == -1 )
    goto LABEL_54;
  if( (unsigned __int64)(v35 + 1) <= 0x100 )
  {
    do
    {
      v31 = (unsigned int)(v35 + 1);
      v37 = _InterlockedCompareExchange((volatile signed __int32 *)CurrentPrcb + 8391, v31, v35);
      v36 = (_DWORD)v35 == v37;
      LODWORD(v35) = v37;
      if( v36 )
        goto LABEL_55;
    }
    while( v37 != -1 && (unsigned __int64)(v37 + 1i64) <= 0x100 );
  }
  v31 = 192i64;
  if( (int)v35 > 192
    && (_DWORD)v35 != -1
    && (_DWORD)v35 == _InterlockedCompareExchange((volatile signed __int32 *)CurrentPrcb + 8391, 192, v35) )
  {
    v33 = (int)v35 - 192 + 1i64;
  }
  if( v33 )
LABEL_54:
    _InterlockedExchangeAdd64(v32 + 896, v33);
LABEL_55:
  if( v32 == (volatile INT64 *)&MiSystemPartition )
    _InterlockedExchangeAdd64(&qword_140C4ECF8, 0xFFFFFFFFFFFFFFFFui64);
LABEL_57:
  v38 = v73;
  if( (*(_BYTE *)(v73 + 184) & 7) == 0 )
    MiSetWsleProtection(v31, v29);
  MiUpdateWorkingSetPrivateSize(v38, v29, -1i64, 0i64);
LABEL_97:
  if( (*(_BYTE *)(v38 + 184) & 7) == 0 )
    _InterlockedExchangeAdd64((volatile signed __int64 *)(v79 + 1272), 0xFFFFFFFFFFFFFFFFui64);
  if( (_DWORD)v67 )
  {
    if( a7 == -1 )
      v57 = v7 & 0xFFFFFFFFFFFFFFFEui64;
    else
      v57 = v7 | 1;
    *((_QWORD *)&v81 + 1) = v57;
    EventData.Ptr = (unsigned __int64)a2a;
    *(_QWORD *)&EventData.Size = 32i64;
    v58 = *(_DWORD *)(EtwpHostSiloState + 4224);
    while( 1 )
    {
      v36 = !_BitScanForward(&v61, v58);
      if( v36 )
        break;
      v58 &= v58 - 1;
      v59 = v61;
      v60 = 32i64 * v61 + EtwpHostSiloState + 4260;
      if( v60 )
      {
        if( (*(_DWORD *)(v60 + 4) & 0x8000001) != 0 )
        {
          LODWORD(v63) = 289413890;
          LOWORD(v62) = 634;
          EtwpLogKernelEvent(
            &EventData,
            EtwpHostSiloState,
            *(unsigned __int8 *)(EtwpHostSiloState + 2 * v59 + 4208),
            1u,
            v62,
            v63);
        }
      }
    }
  }
  return v12;
}

Referenced by:

MiSharePages