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