MiDbgWriteCheck
VOID *__stdcall MiDbgWriteCheck(VOID *VirtualAddress, _HARDWARE_PTE *Opaque, UINT64 ForceWritableIfPossible){
NTSTATUS v4;
NTSTATUS v5;
char *v6;
UINT64 v7;
UINT64 v8;
unsigned __int64 v9;
UINT64 v10;
UINT64 v11;
unsigned __int64 v12;
_MMPFN *v13;
_MMPFN *PfnDb;
int v15;
UINT64 v16;
__int64 v17;
unsigned __int64 v18;
int v19;
UINT64 v20;
UINT64 v22;
_STRING PrivilegedIdentity;
NTSTATUS v25;
Opaque->_bf_0 = 0i64;
if( !MmIsAddressValidEx((INT64)VirtualAddress) )
return 0i64;
v4 = MI_IS_PHYSICAL_ADDRESS(VirtualAddress);
v25 = v4;
v5 = v4;
if( v4 )
{
if( v4 != 1
|| PsNtosImageBase
&& PsHalImageBase
&& ((unsigned __int64)VirtualAddress < PsNtosImageBase || (unsigned __int64)VirtualAddress >= PsNtosImageEnd)
&& (VirtualAddress < PsHalImageBase || (unsigned __int64)VirtualAddress >= PsHalImageEnd) )
{
return VirtualAddress;
}
v6 = (char *)MmGetPdeBase() + (((unsigned __int64)VirtualAddress >> 18) & 0x3FFFFFF8);
LODWORD(v7) = MI_READ_PTE_LOCK_FREE((INT64)v6);
v22 = v7;
v8 = v7;
MiPteInShadowRange((UINT64)&v22);
v9 = ((v8 >> 12) & 0xFFFFFFFFFi64) + (((unsigned __int64)VirtualAddress >> 12) & 0x1FF);
}
else
{
v6 = (char *)MmGetPteBase() + (((unsigned __int64)VirtualAddress >> 9) & 0x7FFFFFFFF8i64);
LODWORD(v10) = MI_READ_PTE_LOCK_FREE((INT64)v6);
v22 = v10;
v11 = v10;
MiPteInShadowRange((UINT64)&v22);
v9 = (v11 >> 12) & 0xFFFFFFFFFi64;
}
if( (MiFlags & 0x10000) == 0 )
goto LABEL_26;
v12 = 0i64;
v13 = 0i64;
PrivilegedIdentity = 0i64;
if( (MiFlags & 0x1000) == 0 )
{
*(_QWORD *)&PrivilegedIdentity.Length = VirtualAddress;
LABEL_21:
v15 = (unsigned int)KeSetPagePrivilege((_PREFIX_TABLE *)v9, &PrivilegedIdentity, 12);
goto LABEL_22;
}
if( v9 <= 0xFFFFFFFFFi64 && (((unsigned __int64)MmGetPfnDb()[v9].u4._bf_0 >> 50) & 1) != 0 )
{
PfnDb = MmGetPfnDb();
v13 = &PfnDb[v9];
if( _interlockedbittestandset64((volatile signed __int32 *)&v13->u2, 0x3Fui64) )
return 0i64;
v12 = 0x8000000000000000ui64;
if( (MiFlags & 0x10000) == 0
|| MiGetPagePrivilege((_DWORD)PfnDb + 48 * v9, 1ui64, (_KE_PRIVILEGED_PAGE_IDENTITY *)&PrivilegedIdentity) )
{
goto LABEL_21;
}
}
v15 = 0;
LABEL_22:
if( v12 )
_InterlockedAnd64(&v13->u2.Lock, ~v12);
if( v15 < 0 )
return 0i64;
v5 = v25;
LABEL_26:
if( (v22 & 0x800) != 0 && (v22 & 0x42) != 0 )
{
LABEL_35:
if( (MiFlags & 0x100) == 0 )
{
LODWORD(v20) = MiGetLeafVa((UINT64)VirtualAddress);
MiRealVaToFlushType(v20);
KeFlushSingleCurrentTb(VirtualAddress);
}
return VirtualAddress;
}
if( v5 || MiDbgMarkPfnModified(VirtualAddress, (_MMPTE)v22) )
{
v16 = v22;
Opaque->_bf_0 = v22;
v17 = v16 | 0x862;
v22 = v17;
_InterlockedIncrement((_DWORD *)&stru_140C4DB30 + 681);
v18 = v17;
LOBYTE(v19) = MiPteInShadowRange((UINT64)v6);
if( v19 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v17 & 1) != 0 )
v18 = v17 | 0x8000000000000000ui64;
*(_QWORD *)v6 = v18;
_InterlockedDecrement((_DWORD *)&stru_140C4DB30 + 681);
goto LABEL_35;
}
return 0i64;
}Referenced by:
No references.